Plotly subplots - 图例旁边的图例项[重复]

Posted

技术标签:

【中文标题】Plotly subplots - 图例旁边的图例项[重复]【英文标题】:Plotly subplots - legend item next to its plot [duplicate] 【发布时间】:2021-09-10 23:03:47 【问题描述】:

当使用plotly 子图时,这是一个典型的例子(来自https://plotly.com/python/subplots/):

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

fig = make_subplots(rows=3, cols=1)
fig.append_trace(go.Scatter(x=[3, 4, 5], y=[1000, 1100, 1200]), row=1, col=1)
fig.append_trace(go.Scatter(x=[2, 3, 4], y=[100, 110, 120]), row=2, col=1)
fig.append_trace(go.Scatter(x=[0, 1, 2], y=[10, 11, 12]), row=3, col=1)
fig.update_layout(height=600, width=600, title_text="Stacked Subplots")
fig.show()

只有 3 个数据系列看起来还不错,但是当我有例如5 个子图,每个子图都有几个系列,很难在视觉上将图例中的项目与它在图中出现的位置联系起来。

是否可以将图例项向下移动以使其与它们出现的图对齐?

顺便说一句,我实际上使用的是 R,而不是 Python,我正在使用 ggplotggplotly() 生成单个图的列表,然后像这样组装它们:

  p <- subplot(plots, shareX=TRUE, nrows=length(plots))
  layout_args <- c(list(p,
                        title=title,
                        xaxis=list(title = 'Time (Local)'),
                        legend=list(orientation = 'v')),
                   yaxis_args)
  p <- do.call(layout, layout_args)
  htmlwidgets::saveWidget(htmlwidgets::as_widget(p), outfile)

但我猜一个解决方案可能同样适用于 R 和 Python。

【问题讨论】:

可能需要使用注释而不是自动图例。这对您来说是一个可以接受的解决方法吗?顺便说一句,直接在 plotly API 中而不是通过 ggploty 可能最容易做到这一点 @dww by annotations 你是指情节本身的标记而不是侧面的图例吗?我认为这对我来说不是很好,因为您将失去将它们用作跟踪的开关的能力。 用户 jrmisty community.plotly.com/t/plotly-subplots-with-individual-legends/… 似乎已经找到了部分解决方案,但不幸的是,切换行为是将单个图的 all 跟踪切换为一个小组。这么近…… 【参考方案1】:

有多种方法,恕我直言,最简单的方法是添加具有线条文本标签的附加散点图。 xy 的文本散布是行 x/y 的痕迹

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

fig = make_subplots(rows=3, cols=1)
fig.append_trace(go.Scatter(x=[3, 4, 5], y=[1000, 1100, 1200]), row=1, col=1)
fig.append_trace(go.Scatter(x=[2, 3, 4], y=[100, 110, 120]), row=2, col=1)
fig.append_trace(go.Scatter(x=[0, 1, 2], y=[10, 11, 12]), row=3, col=1)
fig.append_trace(go.Scatter(mode="text", text=["trace 1"], x=[5], y=[1200]), row=1, col=1)
fig.append_trace(go.Scatter(mode="text", text=["trace 2"],x=[4], y=[120]), row=2, col=1)
fig.append_trace(go.Scatter(mode="text", text=["trace 3"],x=[2], y=[12]), row=3, col=1)

fig.update_layout(height=600, width=600, title_text="Stacked Subplots", showlegend=False)
fig.show()

【讨论】:

谢谢,Rob - 这种方法的缺点是您不能再将图例用作跟踪的开/关切换。我的地块中的迹线数量是一个重要特征。 同意 - 另一个答案是我尝试过的一种方法,发现更“尴尬”。您可以做的一个选项仍然是在右上角显示图例,以及我所展示的行上的标签。然后你可以切换跟踪,也可以知道一条线是什么......【参考方案2】:

由于您声明需要一个交互式图例,其中可以打开和关闭跟踪,因此无法仅在子图上使用注释。

它有点混乱的解决方法,但是,要实现这一点,您可以尝试使用tracegroupgap。缺点是你需要修改你提供给这个选项的值来匹配窗口的大小。

p1 = plot_ly(data.frame(x=c(3, 4, 5), y=c(1000, 1100, 1200))) %>%
       add_lines(~x, ~y, legendgroup = 'group1', name = 'Trace 1')
p2 = plot_ly(data.frame(x=c(3, 4, 5), y=c(1000, 1100, 1200))) %>%
       add_lines(~x, ~y, legendgroup = 'group2', name = 'Trace 2')
p3 = plot_ly(data.frame(x=c(3, 4, 5), y=c(1000, 1100, 1200))) %>%
       add_lines(~x, ~y, legendgroup = 'group3', name = 'Trace 3')
subplot(p1,p2,p3,nrows = 3, shareX = TRUE) %>%
  layout(legend=list(tracegroupgap=150))

【讨论】:

谢谢,我认为这是处理它的好方法。有没有办法将legendgroup 应用于使用ggplotly() 创建的现有绘图对象?

以上是关于Plotly subplots - 图例旁边的图例项[重复]的主要内容,如果未能解决你的问题,请参考以下文章

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

在 plotly 中为子图共享相同的图例

如何使用 Plotly Express 和 Plotly 隐藏图例

R中子图plot_ly中每个图附近的图例

Plotly 可移动/可拖动图例,python

使用 plt.subplots() 设置标签和图例