Plotly Express:处理子图

Posted

技术标签:

【中文标题】Plotly Express:处理子图【英文标题】:Plotly Express: Addressing Subplots 【发布时间】:2022-01-10 01:52:59 【问题描述】:

在网上搜索了几个小时后,我对如何在 Python 中使用 plotly express 处理 subplots 感到非常沮丧和困惑。

我的想法是用散点图和线图并排绘制线图,并分别定义标签悬停数据等+添加形状和文字。

然而,到目前为止我想出的是使用make_subplots 并且只接受跟踪。 因此,情节表达图形的所有格式都在子情节中丢失了!

我只找到了一种方法来更改各个子图的轴限制,但没有找到如何添加自定义悬停模板、x-labels、y-labels 等的方法。

   import pandas as pd
   import plotly.express as px

   # CREATE 2 PLOTS with PLOTY EXPRESS ----------------------------------------------------
   ## fig 1 is a time series of two properties "type"
   fig1 = px.line(df, x="year", y="total", color="type", title="layout.hovermode='x'")

   fig1.update_traces(mode="markers+lines", hovertemplate=None)
   fig1.update_layout(hovermode="x unified")

   fig1.add_shape(type="line",
              x0=2016, 
              y0=0, 
              x1=2016, 
              y1=800,
              line=dict(
                color="gray",
                width=2,
                dash="dot"))

   ## fig2 is a cross-plot of two properties "type"

   fig2 = px.scatter(data_frame=df,
                        x='activity_2011_2015', y='activity_2016_2020', 
                        #size='costs',
                        color='type')

   # add x=y line
   fig2.add_shape(type="line",
              x0=0, 
              y0=0, 
              x1=600, 
              y1=600,
              line=dict(
                color="gray",
                width=2,
                dash="dot"))

   # CREATE 1x2 SUBPLOTS ----------------------------------------------------
   fig1_traces = []
   fig2_traces = []


   for trace in range(len(fig1["data"])):
       fig1_traces.append(fig1["data"][trace])
   for trace in range(len(fig2["data"])):
       fig2_traces.append(fig2["data"][trace])

    
   sub_fig = sp.make_subplots(rows=1, cols=2, 
                               subplot_titles=['time series', 'cross-plot'],
                               horizontal_spacing=0.1) 

   for traces in fig1_traces:
       sub_fig.append_trace(traces, row=1, col=1)
   for traces in fig2_traces:
       sub_fig.append_trace(traces, row=1, col=2)
    
   ## Address x axis and y axis range of first figure -----------------------------
   sub_fig.update_layout(xaxis1 = dict(
    tickmode = 'array',
    range=[2015,2020],
    tickvals = np.arange(2015, 2020, 1).tolist())
    )

    
   sub_fig.show()
   sub_fig.write_html("sub_fig.html", include_plotlyjs="cdn")
如何处理子图中的单个图形及其元素?我想重新添加形状,添加自定义悬停数据并分别设置 X 和 Y 轴的格式,因为这些图没有相同的单位.. . 如果这不可行,能否以不同的方式重新创建此代码?我想要的只是两个情节,并排并与之互动......

非常感谢您!

【问题讨论】:

【参考方案1】: 只是系统化。每个子图 facet 都使用自己的轴。 因此要将形状复制到集成布局中,您需要将它们放在适当的轴上
for t in fig1.data:
    sub_fig.add_trace(t, row=1, col=1)
for t in fig2.data:
    sub_fig.add_trace(t, row=1, col=2)

    
for s in fig1.to_dict()["layout"]["shapes"]:
    sub_fig.add_shape(s)

for s in fig2.to_dict()["layout"]["shapes"]:
    sub_fig.add_shape(**"xref":"x2", "yref":"y2", **s)


sub_fig

数据框模拟

df = pd.DataFrame("year":np.tile(range(2010,2010+10),2), "total":np.random.randint(300,800,20), "type":np.repeat(["a","b"],10),
                  'activity_2011_2015':np.random.randint(0,600,20), 'activity_2016_2020':np.random.randint(0,600,20))


【讨论】:

感谢您的反馈!这基本上回答了这个问题,但我怎样才能 a)保留 fig1 的悬停样式,b)更改图形大小(例如,使 fig1 比 fig2 宽)最后 c)单独更改 x/y 轴标签?跨度>

以上是关于Plotly Express:处理子图的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用 Plotly express 显示多个子图

plotly express 平面图中的单轴标题

删除分组 plotly express 条形图中的空条,使每组条之间的视觉距离相等

Plotly:热图颜色图例我的子图

Plotly:将多个图形绘制为子图

plotly 图中的最大垂直子图数