繁体   English   中英

有条件地改变背景颜色 matplotlib plot

[英]Conditionally changing background color in matplotlib plot

我正在绘制 Python / Matplotlib 中的股票价格和移动平均线。现在我想将背景颜色更改为红色,如果收盘价低于移动平均线 -5%,当收盘价高于移动平均线 5% 以上时,我想将背景颜色更改为绿色移动平均线。 为了使事情更简单,dataframe 已经包含一个列“above_below”:如果价格高于 MA >5%,则 =1,如果价格低于 MA < -5%,则为 -1。 如何根据此列实现条件背景?

这是我到目前为止所拥有的:

from yahoo_fin import stock_info as si
import talib
import numpy as np
import matplotlib.pyplot as plt

sym = 'SBUX'
data = si.get_data(sym, start_date='01/01/2022')
data['ma10'] = talib.EMA(data['close'], 10)
conditions = [(data['close'] / data['ma10'] -1 > 0.05), (data['close'] / data['ma10'] -1 <-0.05)]
values = [1,-1]

data['above_below'] = np.select(conditions, values, default = np.nan)
fig, ax = plt.subplots()
ax.plot(data.close)
ax.plot(data.ma10)
ax.pcolorfast(ax.get_xlim(), ax.get_ylim(), data['above_below'].values[np.newaxis], cmap='RdYlGn', alpha=0.3)
plt.show()

然而结果似乎并不正确。 dataframe 看起来不错:

                  open        high         low       close    adjclose    volume ticker        ma10  above_below
2022-01-03  116.470001  117.800003  114.779999  116.680000  114.626328   5475700   SBUX         NaN          NaN
2022-01-04  116.900002  117.050003  114.169998  114.239998  112.229271   8367600   SBUX         NaN          NaN
2022-01-05  114.400002  114.959999  110.400002  110.440002  108.496162   8662300   SBUX         NaN          NaN
2022-01-06  110.000000  111.879997  109.989998  111.139999  109.183838   6099900   SBUX         NaN          NaN
2022-01-07  108.220001  109.709999  107.480003  107.570000  105.676674  11266400   SBUX         NaN          NaN
2022-01-10  106.620003  107.010002  104.419998  106.029999  104.163773   8499400   SBUX         NaN          NaN
2022-01-11  106.040001  106.169998  103.709999  104.040001  102.208801  13073200   SBUX         NaN          NaN
2022-01-12  104.440002  105.320000  103.680000  103.870003  102.041801  11810500   SBUX         NaN          NaN
2022-01-13  104.150002  104.669998  102.089996  102.400002  100.597672   9818500   SBUX         NaN          NaN
2022-01-14  101.910004  101.910004   99.089996  100.120003   98.357796  13703200   SBUX  107.653001         -1.0
2022-01-18   99.169998   99.360001   97.510002   97.730003   96.009865  11396000   SBUX  105.848819         -1.0
2022-01-19   97.940002   98.389999   96.779999   96.870003   95.165001  10856800   SBUX  104.216307         -1.0
2022-01-20   97.489998   98.940002   95.589996   95.720001   94.035240  20311500   SBUX  102.671524         -1.0
2022-01-21   95.900002   98.410004   95.470001   96.309998   94.614853  13438300   SBUX  101.514883         -1.0
2022-01-24   94.750000   98.349998   94.410004   98.099998   96.373344  17201400   SBUX  100.893995          NaN
2022-01-25   96.669998   98.089996   95.129997   97.010002   95.302536  12368500   SBUX  100.187814          NaN
2022-01-26   97.699997   98.639999   94.900002   95.580002   93.897705  11863000   SBUX   99.350030          NaN

MA 需要至少 10 天的数据来计算,这似乎没问题。 所以我希望红色/绿色背景将从移动平均线开始。 然而在图表中,背景 colors 似乎有一些偏移。 前几个甚至还没有移动平均线的数据点有红色背景。 最后,当价格低于 MA 时,它显示为绿色。

当我用其他股票代码检查它时,它也有点偏离......

这个问题的原因可能是什么?

我想我找到了一个简单的解决方案,只需在 fig, ax = plt.subplots(): ax.margins(0) 之后添加以下行在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM