首页 > 解决方案 > 带有 plotly 的子图中的多个箱线图

问题描述

我正在尝试创建一个带有子图的多箱线图应用程序,它让我知道由不同标准分隔的变量的演变。

我的代码如下所示:

from plotly.subplots import make_subplots
import plotly.graph_objects as go

trace0 = go.Box(
    y=df[(df.tipo == 'n')]['p'],
    x=df[(df.tipo == 'n')]['m'], 
    name='N'
)

trace1 = go.Box(
    y=df[(df.tipo == 's')]['p'],
    x=df[(df.tipo == 's')]['m'], 
    name='S'
)


fig = make_subplots(rows=1, cols=2)

fig.append_trace(trace0, row = 1, col = 1)
fig.append_trace(trace1, row = 1, col = 2)

fig.show()

这个的输出看起来像:

在此处输入图像描述

我想要得到的是看起来像这样的东西,但是对于每个子图:

在此处输入图像描述

我确实有两个虚拟变量,可以让我在子图中将其分开。

谢谢

标签: pythonplotly

解决方案


  • 你已经暗示了你的数据是什么,有来自这个的模拟数据
  • 使用plotly express而不是图形对象
  • 核心解决方案是将与图形关联的所有轨迹添加到所需的子图中。在您的情况下,在topo列中有值NS的箱线图意味着需要将两条迹线添加到每个子图中
  • 对布局跟踪有一些清理操作,以使xaxis按要求工作并从图例中删除重复项
import pandas as pd
import numpy as np
import plotly.express as px
from plotly.subplots import make_subplots

df = pd.DataFrame({**{"month":np.tile(pd.date_range("1-jul-2020", freq="M", periods=12),20)[0:200],
                   "tipo":np.random.choice(["N","S"],200)},
                   **{f"var{v}":np.random.uniform(2,5,200) for v in range(8)}})

fig = make_subplots(
    rows=3, cols=3, subplot_titles=[c for c in df.columns if "var" in c]
)

for v in range(8):
    for t in px.box(df, x="month", y=f"var{v}", color="tipo").data:
        fig.add_trace(t, row=(v//3)+1, col=(v%3)+1)

# modifications needed to fix up display of sub-plots
fig.update_layout(
    boxmode="group", margin={"l": 0, "r": 0, "t": 20, "b": 0}
).update_traces(showlegend=False, selector=lambda t: "var0" not in t.hovertemplate)

在此处输入图像描述


推荐阅读