python - 带有 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()
这个的输出看起来像:
我想要得到的是看起来像这样的东西,但是对于每个子图:
我确实有两个虚拟变量,可以让我在子图中将其分开。
谢谢
解决方案
- 你已经暗示了你的数据是什么,有来自这个的模拟数据
- 使用plotly express而不是图形对象
- 核心解决方案是将与图形关联的所有轨迹添加到所需的子图中。在您的情况下,在topo列中有值N和S的箱线图意味着需要将两条迹线添加到每个子图中
- 对布局和跟踪有一些清理操作,以使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)
推荐阅读
- javascript - 如何显示猫头鹰旋转木马的所有项目?
- python - 无法打开文件“menu.py”:[Errno 2] 没有这样的文件或目录
- java - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'order 附近使用的正确语法
- html - DIV元素没有出现滚动条 - ReactJS
- c# - 在 ASP.net 核心 MVC 中下载具有 UTF-8(泰语)文件名的文件
- java - java - 如何区分未设置的属性和在java中设置为null的属性?
- branch.io - 是否可以更新深层链接而不是创建新链接?
- android - segment.io 服务器是否真的将事件路由到多个目的地或移动 sdk?
- java - 如何将 gradle 复合构建包含到多项目构建中?
- fish - 编写 __fish_is_first_arg,但包含 arg 的参数