Python Plotly:如何根据条件为两行之间的填充着色?

Python Plotly:如何根据条件为两行之间的填充着色?,python,charts,plotly,fill,plotly-python,Python,Charts,Plotly,Fill,Plotly Python,我想在绘图仪上的黑色和蓝色线条之间添加填充颜色。我知道这可以通过Plotly实现,但我不确定如何根据条件用两种颜色填充图表 蓝色背景的图表是我的绘图图表。我想让它看起来像白色背景的图表。(忽略白色图表上的红色和绿色条) 我希望它通过的条件是: 如果黑线在蓝线上方,则将两条线之间的区域填充为绿色 如果黑线低于蓝线,则将两条线之间的区域填充为红色 如何用Plotly实现这一点?如果Plotly无法做到这一点,那么可以使用其他使用Python的绘图工具来实现。出于一些原因(如果您感兴趣,我愿意进一步解

我想在绘图仪上的黑色和蓝色线条之间添加填充颜色。我知道这可以通过Plotly实现,但我不确定如何根据条件用两种颜色填充图表

蓝色背景的图表是我的绘图图表。我想让它看起来像白色背景的图表。(忽略白色图表上的红色和绿色条)

我希望它通过的条件是:

如果黑线在蓝线上方,则将两条线之间的区域填充为绿色

如果黑线低于蓝线,则将两条线之间的区域填充为红色

如何用Plotly实现这一点?如果Plotly无法做到这一点,那么可以使用其他使用Python的绘图工具来实现。

出于一些原因(如果您感兴趣,我愿意进一步解释),最好的方法似乎是每次平均值相互交叉时,向
go.Figure()
对象添加两个跟踪,然后使用
fill='tonexty'
为第二个跟踪定义填充,使用:

for df in dfs:
    fig.add_traces(go.Scatter(x=df.index, y = df.ma1,
                              line = dict(color='rgba(0,0,0,0)')))
    
    fig.add_traces(go.Scatter(x=df.index, y = df.ma2,
                              line = dict(color='rgba(0,0,0,0)'),
                              fill='tonexty', 
                              fillcolor = fillcol(df['label'].iloc[0])))
fillcolor
是一个简单的自定义函数,在下面的完整代码段中进行了描述。我使用了中描述的方法,每次平均值交叉时,在数据帧中生成必要的分割

情节

完整代码:
当每个值对的标签交替时,这不起作用。换句话说:在我的数据集中,组在大多数情况下只包含一个值。Plotly则根本不绘制填充图形。
import plotly.graph_objects as go
import numpy as np

import pandas as pd
from datetime import datetime
pd.options.plotting.backend = "plotly"

# sample data
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')
df.index = df.Date
df = df[['AAPL.Close', 'mavg']]
df['mavg2'] = df['AAPL.Close'].rolling(window=50).mean()
df.columns = ['y', 'ma1', 'ma2']
df=df.tail(250).dropna()
df1 = df.copy()

# split data into chunks where averages cross each other
df['label'] = np.where(df['ma1']>df['ma2'], 1, 0)
df['group'] = df['label'].ne(df['label'].shift()).cumsum()
df = df.groupby('group')
dfs = []
for name, data in df:
    dfs.append(data)

# custom function to set fill color
def fillcol(label):
    if label >= 1:
        return 'rgba(0,250,0,0.4)'
    else:
        return 'rgba(250,0,0,0.4)'

fig = go.Figure()

for df in dfs:
    fig.add_traces(go.Scatter(x=df.index, y = df.ma1,
                              line = dict(color='rgba(0,0,0,0)')))
    
    fig.add_traces(go.Scatter(x=df.index, y = df.ma2,
                              line = dict(color='rgba(0,0,0,0)'),
                              fill='tonexty', 
                              fillcolor = fillcol(df['label'].iloc[0])))

# include averages
fig.add_traces(go.Scatter(x=df1.index, y = df1.ma1,
                          line = dict(color = 'blue', width=1)))

fig.add_traces(go.Scatter(x=df1.index, y = df1.ma2,
                          line = dict(color = 'red', width=1)))

# include main time-series
fig.add_traces(go.Scatter(x=df1.index, y = df1.y,
                          line = dict(color = 'black', width=2)))

fig.update_layout(showlegend=False)
fig.show()