You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:01:22