plotly 和 ggplot 图例顺序交互

Posted

技术标签:

【中文标题】plotly 和 ggplot 图例顺序交互【英文标题】:plotly and ggplot legend order interaction 【发布时间】:2020-12-01 02:47:05 【问题描述】:

我有多个图表,我用 ggplot 绘制然后发送到 plotly。我根据最近的日期设置图例顺序,以便人们可以轻松地解释图表。在生成 ggplot 时一切都很好,但是一旦我通过 ggplotly() 发送它,图例顺序就会恢复到原始因子水平。我尝试重新设置因素,但这会产生一个新问题 - 每个图表中的颜色都不同。

代码如下: 数据:

Country  <-  c("CHN","IND","INS","PAK","USA")
  a <- data.frame("Country" = Country,"Pop" = c(1400,1300,267,233,330),Year=rep(2020,5))
  b <- data.frame("Country" = Country,"Pop" = c(1270,1000,215,152,280),Year=rep(2000,5))
  c <- data.frame("Country" = Country,"Pop" = c(1100,815,175,107,250),Year=rep(1990,5))
  Data <- bind_rows(a,b,c)

Legend Ordering Vector - 这使用 2020 年作为确定顺序的年份。

Legend_Order <- Data %>% 
    filter(Year==max(Year)) %>% 
    arrange(desc(Pop)) %>% 
    select(Country) %>% 
    unlist() %>% 
    as.vector()

然后我创建我的情节并使用图例顺序作为休息时间

Graph <- Data %>% 
    ggplot() + 
    geom_line(aes(x = Year, y = Pop, group = Country, color = Country), size = 1.2) + 
    scale_color_discrete(name = 'Country', breaks = Legend_Order)
Graph

但是当我把它传递给:

ggplotly(Graph)

出于某种原因,情节忽略了休息参数并使用原始因子水平。 如果我事先设置因子水平,颜色方案就会改变(因为因子的顺序不同)。

如何在图表之间保持配色方案,但在使用 plotly 时更改图例顺序?

【问题讨论】:

【参考方案1】:

只需将您的Conutry var 重新编码为因子,并根据Legend_Order 设置级别。试试这个:

library(plotly)
library(dplyr)
Country  <-  c("CHN","IND","INS","PAK","USA")
a <- data.frame("Country" = Country,"Pop" = c(1400,1300,267,233,330),Year=rep(2020,5))
b <- data.frame("Country" = Country,"Pop" = c(1270,1000,215,152,280),Year=rep(2000,5))
c <- data.frame("Country" = Country,"Pop" = c(1100,815,175,107,250),Year=rep(1990,5))
Data <- bind_rows(a,b,c)

Legend_Order <- Data %>% 
  filter(Year==max(Year)) %>% 
  arrange(desc(Pop)) %>% 
  select(Country) %>% 
  unlist() %>% 
  as.vector()
Data$Country <- factor(Data$Country, levels = Legend_Order)

Graph <- Data %>% 
  ggplot() + 
  geom_line(aes(x = Year, y = Pop, group = Country, color = Country), size = 1.2)

ggplotly(Graph)

要“锁定”颜色分配,您可以像这样使用命名颜色向量(简而言之,我只显示 ggplots):

# Fix the color assignments using a named color vector which can be assigned via scale_color_manual
cols <- scales::hue_pal()(5) # Default ggplot2 colors
cols <- setNames(cols, Legend_Order) # Set names according to legend order

# Plot with unordered Countries but "ordered" color assignment
Data %>% 
  ggplot() + 
  geom_line(aes(x = Year, y = Pop, color = Country), size = 1.2) +
  scale_color_manual(values = cols)

# Plot with ordered factor
Data$Country <- factor(Data$Country, levels = Legend_Order)

Data %>% 
  ggplot() + 
  geom_line(aes(x = Year, y = Pop, color = Country), size = 1.2) +
  scale_color_manual(values = cols)

【讨论】:

我试过了——我遇到的问题是,如果由于某种原因订单应该改变,颜色分配就会改变。我想在仍然使用排序技巧的同时锁定图形之间的颜色分配(我有更多变量)。 @Arik124。我知道了。我刚刚做了一个编辑。也许这可以解决您的问题 这真的很有帮助——我最终用 setNames 函数做了类似的事情。我锁定了颜色分配,然后编写了一个函数来处理绘图。这样我有多个不同顺序的图,但图之间的颜色是一致的。非常有用。

以上是关于plotly 和 ggplot 图例顺序交互的主要内容,如果未能解决你的问题,请参考以下文章

使用 ggplot 按特定顺序保持图例和 y 轴

ggplot2 中图例的自定义顺序,因此它与图中因子的顺序不匹配

我图例上的形状似乎与情节 ggplot2 中显示的顺序不同

图例 geom_hline 顺序不正确

R语言ggplot2可视化:使用ggplot2绘制按时间顺序排列的时间线图(chronological timeline plot)

ggplot折线图的问题