如何链接情节痕迹以进行图例和颜色选择?
Posted
技术标签:
【中文标题】如何链接情节痕迹以进行图例和颜色选择?【英文标题】:How to link plotly traces for legend and colour selection? 【发布时间】:2016-07-24 18:31:25 【问题描述】:问题
我在shiny
应用程序中将一些ggplot
/ggvis
图迁移到plotly
。我遇到了一个关于跟踪链接的问题。我希望能够在图例上显示/隐藏 group
的痕迹,这在相关数据帧之间共享。
最小的工作示例
# load libraries
library(dplyr)
library(plotly)
library(viridis)
# contrived data to represent actual data points
df1 <- data.frame(x = rnorm(100),
y = rnorm(100),
group = rep(c("G1", "G2", "G3", "G4"), 25))
# contrived data to represent theoretical relationship
df2 <- data.frame(x = c(rep(-2, 4), rep(2, 4)),
y = c(seq(1.9, 1, -0.3), seq(-1, -1.9, -0.3)),
group = rep(c("G1", "G2", "G3", "G4"), 2))
# create plot with scatter and line traces
df1 %>%
plot_ly(x = x,
y = y,
color = group,
colors = viridis(n_distinct(group)),
mode = "markers") %>%
add_trace(x = x,
y = y,
color = group,
colors = viridis(n_distinct(group)),
mode = "lines",
data = df2)
目前的尝试
我的在线搜索,尤其是阅读plotly 文档并没有让我走得太远。
我可以将showlegend = FALSE
添加到第二个跟踪。这确实是解决挑战的一部分,但是,我仍然想根据 group
值显示/隐藏该跟踪。
可能的解决方案
基于plotly
的体系结构,似乎如果我可以将散点图和线放在每个group
的一条迹线上,那么我将获得所需的行为。但是,似乎一个跟踪可能只有一个“模式”,这就是我采用我所拥有的方法的原因。
如果我继续我已经开始的路径,我想我需要以某种方式捕获图例的“点击”事件并显示/隐藏 group
痕迹......但我不确定在哪里开始吧。
相关/次要
在我的 MWE 中,我已将 colors
参数设置为 viridis
。虽然这对问题不重要,但我还没有找到一种方法来确保颜色选择改为链接到group
(即,如果 df1 上group
的跟踪是蓝色的,我想制作相同的group
df2 的轨迹上的蓝色。如果这不是微不足道的并且需要第二个问题(我搜索并发现没有匹配项......可能是因为它微不足道而且我遗漏了一些简单的东西),那么我将单独询问这部分.
【问题讨论】:
有一个legendgroup
属性可以让你做你想做的事,但前提是你分别绘制每个组(这里是 8 个轨迹),这有点痛苦,而且不太像 R .
@alistaire,感谢您将我指向legendgroup
属性。我将尝试一下,看看我是否有任何吸引力,但是,组的数量与闪亮反应,所以我不确定是否能够提供解决方案。
由于每个跟踪的代码可能不会有太大的不同,您可能可以通过编程方式编写它,以便根据给定输入的需要重复。
另外,ggplotly
默认会统一组,如果您不介意样式的话。查看ggplotly(ggplot(iris, aes(x = Petal.Length, y = Petal.Width, colour = Species)) + geom_point() + geom_line())
【参考方案1】:
为后人重温历史
自首次提出此问题以来,ggplot2
和 plotly
在此期间发生了几处更改。在当前版本 (4.7.1) 中,有一个参数 legendgroup
用于解决问题。
懒惰的代码
请原谅在优雅编码上付出的最小努力,但是,MWE 的这个扩展展示了按组显示/隐藏跟踪的能力。
df1_G1 <- df1 %>% filter(group == "G1")
df2_G1 <- df2 %>% filter(group == "G1")
df1_G2 <- df1 %>% filter(group == "G2")
df2_G2 <- df2 %>% filter(group == "G2")
df1_G3 <- df1 %>% filter(group == "G3")
df2_G3 <- df2 %>% filter(group == "G3")
df1_G4 <- df1 %>% filter(group == "G4")
df2_G4 <- df2 %>% filter(group == "G4")
plot_ly(type = "scatter", mode = "markers") %>%
add_trace(df1_G1, x = df1_G1$x, y = df1_G1$y, color = I("red"),
legendgroup = "G1", name = "G1 - scatter") %>%
add_trace(df2_G1, x = df2_G1$x, y = df2_G1$y, color = I("red"),
legendgroup = "G1", name = "G1 - line", mode = "lines") %>%
add_trace(df1_G2, x = df1_G2$x, y = df1_G2$y, color = I("green"),
legendgroup = "G2", name = "G2 - scatter") %>%
add_trace(df2_G2, x = df2_G2$x, y = df2_G2$y, color = I("green"),
legendgroup = "G2", name = "G2 - line", mode = "lines") %>%
add_trace(df1_G3, x = df1_G3$x, y = df1_G3$y, color = I("blue"),
legendgroup = "G3", name = "G3 - scatter") %>%
add_trace(df2_G3, x = df2_G3$x, y = df2_G3$y, color = I("blue"),
legendgroup = "G3", name = "G3 - line", mode = "lines") %>%
add_trace(df1_G4, x = df1_G4$x, y = df1_G4$y, color = I("orange"),
legendgroup = "G4", name = "G4 - scatter") %>%
add_trace(df2_G4, x = df2_G4$x, y = df2_G4$y, color = I("orange"),
legendgroup = "G4", name = "G4 - line", mode = "lines")
样本输出
显示取消选择的第一组G1
。另请注意,已使颜色在同一组的散点和线迹之间匹配。
【讨论】:
以上是关于如何链接情节痕迹以进行图例和颜色选择?的主要内容,如果未能解决你的问题,请参考以下文章