如何让Plotly环形图中相同标签对应相同颜色?
问题:Plotly环形图中保持相同标签对应相同颜色
我使用Plotly绘制环形图,以下是第一个数据集与绘图代码:
df1<-structure(list(manuf = c("AMC", "Cadillac", "Camaro", "Chrysler", "Datsun", "Dodge", "Duster", "Ferrari", "Fiat", "Ford", "Honda", "Hornet", "Lincoln", "Lotus", "Maserati", "Mazda", "Merc", "Pontiac", "Porsche", "Toyota", "Valiant", "Volvo"), count = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 7L, 1L, 1L, 2L, 1L, 1L)), row.names = c(NA, -22L), class = c("tbl_df", "tbl", "data.frame")) fig <- df1 %>% plot_ly(labels = ~manuf, values = ~count) fig <- fig %>% add_pie(hole = 0.6) fig <- fig %>% layout(title = "Donut charts using Plotly", showlegend = T, xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE), yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE)) fig
该代码生成的环形图中,Merc占比21%,颜色为蓝色。
修改数据后得到第二个数据集,AMC占比44.6%,绘图代码如下:
df2<-structure(list(manuf = c("AMC", "Cadillac", "Camaro", "Chrysler", "Datsun", "Dodge", "Duster", "Ferrari", "Fiat", "Ford", "Honda", "Hornet", "Lincoln", "Lotus", "Maserati", "Mazda", "Merc", "Pontiac", "Porsche", "Toyota", "Valiant", "Volvo"), count = c(25L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 7L, 1L, 1L, 2L, 1L, 1L)), row.names = c(NA, -22L), class = c("tbl_df", "tbl", "data.frame")) fig <- df2 %>% plot_ly(labels = ~manuf, values = ~count) fig <- fig %>% add_pie(hole = 0.6) fig <- fig %>% layout(title = "Donut charts using Plotly", showlegend = T, xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE), yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE)) fig
但这个环形图里Merc的颜色变成了橙色,请问如何实现不同环形图中相同标签对应相同颜色?
解决方案
要让相同标签在不同环形图中保持固定颜色,核心是手动创建标签与颜色的映射关系,并在绘图时统一使用这个映射。
步骤1:创建颜色映射列表
可以直接复用Plotly默认的色板,或者自定义每个标签的颜色。这里我们基于所有唯一的manuf标签,分配固定颜色:
# 获取所有唯一的制造商标签 all_manuf <- unique(c(df1$manuf, df2$manuf)) # 用Plotly默认色板生成对应颜色(也可以手动指定颜色向量) color_map <- setNames(plotly::plotly_colors[1:length(all_manuf)], all_manuf)
步骤2:在绘图时应用颜色映射
修改两个绘图代码,在add_pie中通过colors参数传入color_map:
绘制df1的环形图
fig1 <- df1 %>% plot_ly(labels = ~manuf, values = ~count) %>% add_pie(hole = 0.6, colors = color_map) %>% layout(title = "Donut charts using Plotly (df1)", showlegend = T, xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE), yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE)) fig1
绘制df2的环形图
fig2 <- df2 %>% plot_ly(labels = ~manuf, values = ~count) %>% add_pie(hole = 0.6, colors = color_map) %>% layout(title = "Donut charts using Plotly (df2)", showlegend = T, xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE), yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE)) fig2
这样修改后,两个环形图中同一个制造商标签(比如Merc)就会使用相同的颜色了。如果需要自定义特定标签的颜色,直接修改color_map即可,例如:
# 手动指定Merc为蓝色,AMC为红色 color_map <- c( "Merc" = "#1f77b4", "AMC" = "#ff7f0e", # 其他标签用默认色板补充 setNames(plotly::plotly_colors[3:length(all_manuf)], setdiff(all_manuf, c("Merc", "AMC"))) )
内容的提问来源于stack exchange,提问作者silent_hunter
相关产品推荐
相关产品推荐

