如何为ggplot2多分组条形图应用非默认调色板?
WhatsApp数据条形图调色板问题解决
问题描述
- 需求:基于WhatsApp聊天数据,绘制按小时分组、以
author为填充色的堆叠条形图 - 当前可运行代码:
datos2 %>% mutate(hour = hour(time)) %>% count(author, hour) %>% ggplot(aes(x = hour, y = n, fill = author)) + geom_bar(stat = "identity") + scale_fill_viridis_b() + ylab("") + xlab("Mensajes por hora") + ggtitle(title) + scale_x_continuous(breaks = 0:23)
- 现有图表问题:

- 调色板相关问题:
- RColorBrewer调色板:数据包含20个
author,该调色板颜色数量不足,多数标签显示灰色,无法区分 - viridis调色板使用错误:
- 调用
scale_fill_viridis_b()时触发报错:Error in `train()`: ! Binned scales only support continuous data Run `rlang::last_trace()` to see where the error occurred. - 添加
discrete=TRUE参数后,生成空白图表,同时保留上述错误及“未使用选项”警告
- 调用
- RColorBrewer调色板:数据包含20个
解决方案
1. 修正viridis调色板调用
scale_fill_viridis_b()是为分箱连续变量设计的刻度函数,而author是离散分类变量,应使用专门的离散型viridis函数scale_fill_viridis_d():
datos2 %>% mutate(hour = hour(time)) %>% count(author, hour) %>% ggplot(aes(x = hour, y = n, fill = author)) + geom_bar(stat = "identity") + scale_fill_viridis_d(option = "plasma") + # option可选"viridis"/"plasma"/"inferno"/"magma"/"cividis" ylab("") + xlab("Mensajes por hora") + ggtitle(title) + scale_x_continuous(breaks = 0:23)
viridis离散调色板支持最多20种颜色,刚好匹配你的数据量,且颜色区分度高、色盲友好。
2. 备选:使用支持多分类的专业调色板
如果viridis风格不符合需求,可使用ggsci包中的出版级调色板,比如Nature风格的scale_fill_npg():
# 先安装并加载包 install.packages("ggsci") library(ggsci) datos2 %>% mutate(hour = hour(time)) %>% count(author, hour) %>% ggplot(aes(x = hour, y = n, fill = author)) + geom_bar(stat = "identity") + scale_fill_npg() + ylab("") + xlab("Mensajes por hora") + ggtitle(title) + scale_x_continuous(breaks = 0:23)
3. 自定义调色板(可选)
若需要完全自定义颜色,可通过colorspace包生成均匀区分的离散颜色,再用scale_fill_manual()调用:
install.packages("colorspace") library(colorspace) # 生成20个高区分度颜色 custom_colors <- rainbow_hcl(20) datos2 %>% mutate(hour = hour(time)) %>% count(author, hour) %>% ggplot(aes(x = hour, y = n, fill = author)) + geom_bar(stat = "identity") + scale_fill_manual(values = custom_colors) + ylab("") + xlab("Mensajes por hora") + ggtitle(title) + scale_x_continuous(breaks = 0:23)
内容的提问来源于stack exchange,提问作者wpkzz
相关产品推荐
相关产品推荐

