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,我正在使用 ggplot
和 ggplotly()
生成单个图的列表,然后像这样组装它们:
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】:
有多种方法,恕我直言,最简单的方法是添加具有线条文本标签的附加散点图。 x 和 y 的文本散布是行 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 - 图例旁边的图例项[重复]的主要内容,如果未能解决你的问题,请参考以下文章