如何解决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)
要“锁定”颜色分配,您可以像这样使用命名的颜色矢量(简而言之,我只显示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)