我有一个多变量时间序列的数据框架,我已经为其创建了一个交互式的Plotly express图。我在一个字典指定的特定位置添加了垂直线,每条线都与一个时间序列相关联,我希望设置线的颜色与相应变量的颜色一致。实质上,在下图中,每条垂直线段都可以识别为Fp1或Fp2中的一条,我希望相应地将其颜色定为红色或黑色。
首先,我绘制数据框,其中X是我的时间序列矩阵,plotly.express导入为px,pandas导入为pd,channel=['Fp1','Fp2']。
df=pd.DataFrame(X,columns=channels)
df['id'] = df.index
df = pd.melt(df, id_vars='id', value_vars=df.columns[:-1])
fig = px.line(df, x='id', y='value', color='variable',labels = {'id':'time (20K~100 sec)',
'value':'millivolts','variable':'channel'},title='Patient')
随后的计算产生了一个字典HFOs 其中每个键对应的是我的两个通道之一 每个值是一个时间列表,例如:
HFOs={'Fp1':[500,....,10500],'Fp2':[800,...11000]}
然后我创建了我的线条,并将它们添加到图中。
for channel,times in HFOs.items():
for t in times:
fig.add_shape(type='line',yref="y",xref="x",
x0=t,y0=df['value'].min()*1.2,x1=t,y1=df['value'].max()*1.2,line=dict(color='black',
width=.25))
fig.add_trace(go.Scatter(x=[t],y=
[df['value'].max()*1.5],mode='text',showlegend=False))
fig.show()
这样就形成了上图。我如何修改line=dict(color='black',width=.25)来改变颜色为我想要的?我希望在[500,......,10500]处的垂直线为蓝色,在[800,......11000]处的垂直线为红色。(当然,将来会有更多的通道。)
我试着用 "变量 "代替 "黑色",但结果不出所料,只是得到一个错误信息。我觉得一定有一个非常简单的方法来实现我的目标。
很酷的问题。可能有更好的解决方案,但这是我找到的一个。用下面的代码替换创建垂直线的代码。
# fetch the colors of the traces from the figure.
colors = [trace.line["color"] for trace in fig.data]
for inx, (channel,times) in enumerate(HFOs.items()):
for t in times:
fig.add_shape(type='line',yref="y",xref="x",
x0=t,y0=df['value'].min()*1.2,x1=t,y1=df['value'].max()*2,
line=dict(color=colors[inx], width=3))
fig.show()
结果图如下 (随机数据,为了提高可见度,竖线变宽了)
获取默认颜色列表的另一种方法是使用:
px.colors.qualitative.Plotly
这将产生一个10个十六进制颜色代码的列表。我的理解是,这些颜色将用于前10个系列,然后再次用于轨迹11-20等。