plotly和ggplot图例顺序交互

如何解决plotly和ggplot图例顺序交互

我有多个图形,这些图形是用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)

出于某些原因,会忽略地忽略breaks参数并使用原始因子水平。 如果我预先设置因子级别,则配色方案会发生变化(因为因子的顺序不同)。

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

解决方法

只需按照Conutry设置的级别将Legend_Order var作为因子重新编码。试试这个:

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)

enter image description here

要“锁定”颜色分配,您可以像这样使用命名的颜色矢量(简而言之,我只显示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,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,size = 1.2) +
  scale_color_manual(values = cols)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?