R语言Plotly动态柱状图排序时保持固定标准颜色显示异常求助
问题解决方法
你遇到的颜色错位问题核心是没有将颜色和Var1的类别做固定绑定,仅按数据行顺序传递颜色,当数据排序变化后行顺序改变,颜色就会和对应类别错位。按如下修改代码即可实现无论数据怎么排序,每个Var1类别对应的颜色固定不变:
library(plotly) Var1<-c("Hospitalized","Not hospitalized","Unknown") Freq<-c(52475,66129,43955) hos<-data.frame(Var1,Freq) hos$Perc<-round((hos$Freq / sum(hos$Freq))*100, 1) # 先定义固定的颜色映射:把类别和颜色一一绑定,和数据顺序无关 color_map <- c( "Not hospitalized" = "#60ab3d", "Hospitalized" = "#3e5b84", "Unknown" = "#028c75" ) # 要把数值最大的项排在顶部,把order的decreasing参数改为TRUE即可 hos$Var1 <- factor(hos$Var1, levels = unique(hos$Var1)[order(hos$Freq, decreasing = F)]) fig1 <- plot_ly(hos , x = ~Perc, y = ~Var1, type = 'bar', orientation = 'h', color = ~Var1, # 明确按Var1类别映射颜色 colors = color_map # 传入预定义的固定颜色映射 ) fig1
关键修改点说明
- 提前定义命名的颜色映射向量,键为
Var1的类别值,值为对应颜色,不管数据怎么排序,类别和颜色的绑定关系不会变 - 去掉了原来逻辑存在错误的for循环赋值颜色列的步骤,不需要额外存储颜色列,直接通过映射关系自动匹配
- plot_ly中指定
color = ~Var1明确按类别匹配颜色,传入预定义的color_map作为颜色池
如果要在Shiny中动态排序,只需要修改Var1因子的levels顺序,不需要调整颜色相关代码,每个类别永远显示对应固定颜色。
内容的提问来源于stack exchange,提问作者firmo23
相关产品推荐
相关产品推荐

