我是情节新手,我正在尝试创建子图并显示颜色图例。我的数据框如下所示:
A B C D State
0 1 3 5 2 INITIAL
1 2 10 5 1 DONE
2 4 1 7 6 IN_PROGRESS
3 4 3 2 8 PAUSED
但我无法让它发挥作用。我尝试使用plotly.express,然后通过添加它生成的组件来构建结果图。这是代码:
fig = go.Figure()
figures = [
df.plot.scatter(x="A", y="B", color="State"),
df.plot.scatter(x="A", y="C", color="State")
]
fig = make_subplots(rows=len(figures), cols=1)
for i, figure in enumerate(figures):
for trace in range(len(figure["data"])):
fig.append_trace(figure["data"][trace], row=i+1, col=1)
fig.update_xaxes(title_text="A", row=2, col=1)
fig.update_xaxes(title_text="A", row=1, col=1)
fig.update_yaxes(title_text="C", row=2, col=1)
fig.update_yaxes(title_text="B", row=1, col=1)
fig.show()
除了重复状态之外,这与我需要的很接近。你知道如何在此处添加“State”标头并避免重复状态吗?
重复图例使用 set 从图形配置信息中删除重复项并更新初始图例。 此外,由于使用 Express 无法实现复杂的定制,因此在图形对象中处理此问题会更容易且以编程方式更清晰。还可以将数据帧从水平格式转换为垂直格式,并循环执行相同的提取条件。
import plotly.graph_objects as go
from plotly.subplots import make_subplots
fig = make_subplots(rows=3, cols=1, shared_xaxes=True)
for i,g in enumerate(['B','C','D']):
for k,(s,c) in enumerate(zip(df['State'].unique(),
['red','black','blue','green'])):
fig.add_trace(go.Scatter(x=[df.loc[k,'A']],
y=[df.loc[k,g]],
mode='markers',
marker_color=c,
name=s),
row=i+1, col=1)
# Remove duplicate legends
names = set()
fig.for_each_trace(
lambda trace:
trace.update(showlegend=False)
if (trace.name in names) else names.add(trace.name))
fig.update_xaxes(title_text="A", row=3, col=1, tickvals=[1,2,3,4])
fig.update_yaxes(title_text="D", row=3, col=1)
fig.update_yaxes(title_text="C", row=2, col=1)
fig.update_yaxes(title_text="B", row=1, col=1)
fig.show()