Plotly subplots - 彩色子图的颜色图例

问题描述 投票:0回答:1

我是情节新手,我正在尝试创建子图并显示颜色图例。我的数据框如下所示:

   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”标头并避免重复状态吗?

python plotly plotly-python
1个回答
0
投票

重复图例使用 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()

© www.soinside.com 2019 - 2024. All rights reserved.