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

如何为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)
  • 现有图表问题:思路正确,但颜色可读性极差
  • 调色板相关问题:
    1. RColorBrewer调色板:数据包含20个author,该调色板颜色数量不足,多数标签显示灰色,无法区分
    2. 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参数后,生成空白图表,同时保留上述错误及“未使用选项”警告

解决方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:05:02