ggplot绘制双饼图:如何按producer列指定对应填充颜色?
解决ggplot饼图按producer指定填充颜色的问题
你当前的问题在于scale_fill_manual(values = dat$color)传入的是整个数据框的color列(共6个元素),ggplot会按producer的因子顺序依次取前3个颜色,但这不是绑定producer与color的可靠方式——它依赖数据行的顺序,而非明确的映射关系。
正确的做法是先创建一个命名向量,将每个producer和对应的color一一绑定,这样不管数据子集的行顺序如何,颜色都会准确匹配对应的producer:
步骤1:创建颜色映射命名向量
# 提取producer与color的唯一对应关系 color_map <- unique(dat[, c("producer", "color")]) # 转换为命名向量:producer作为名称,color作为对应值 color_vec <- setNames(color_map$color, color_map$producer)
步骤2:修改绘图代码使用命名向量
library(ggplot2) library(ggpubr) A_2000 <- filter(dat, year == 2000) A2000 <- ggplot(A_2000, aes(x="", y=value, fill=producer)) + geom_bar(stat="identity", width=1, color="white") + coord_polar("y", start=0) + theme_void() + scale_fill_manual(values = color_vec) # 用命名向量指定颜色 A_2010 <- filter(dat, year == 2010) A2010 <- ggplot(A_2010, aes(x="", y=value, fill=producer)) + geom_bar(stat="identity", width=1, color="white") + coord_polar("y", start=0) + theme_void() + scale_fill_manual(values = color_vec) # 用命名向量指定颜色 ggarrange(A2000, A2010, ncol = 2, nrow = 1)
这样处理后,producer对应的颜色会完全按照你数据中定义的对应关系填充(比如B对应red、C对应blue、D对应green),不会因为数据子集的行顺序变化而出现颜色匹配错误。
内容的提问来源于stack exchange,提问作者msug
相关产品推荐
相关产品推荐

