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

ggplot为82组文献数据分配唯一符号时遇数量不足问题求助

ggplot绘制多参考文献对比图的问题与解决方法

问题描述

需要绘制线性回归计算值与82篇论文实验值的对比图,尝试为每篇论文的点分配唯一符号,但仅整理出45个美观的唯一符号。现有symbols、Palette、borders列表及绘图代码如下:

symbols <- c(21, 22, 23, 24, 25, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 21, 22, 23, 24, 25, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 21, 22, 23, 24, 25)
Palette <- c("#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00")
borders <- c("#000000", "#000000", "#000000","#000000", "#000000", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#000000", "#000000", "#000000", "#000000", "#000000", "#000000", "#000000", "#000000","#000000", "#000000", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#000000", "#000000", "#000000", "#000000", "#000000","#000000", "#000000", "#000000","#000000", "#000000", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#000000", "#000000", "#000000", "#000000", "#000000")

绘图代码:

ggplot(df_select_Si) + geom_point(aes(x = logDsi, y = predictSi,  color = ref, shape = ref, fill = ref), size = 2) +
  scale_shape_manual(values = symbols) +
  scale_fill_manual(values = Palette) +
  scale_colour_manual(values = borders)+
  geom_abline(intercept = 0, slope = 1, size=1)

其中ref为参考文献列表,运行后报错:

Error in palette():
! Insufficient values in manual scale. 82 needed but only 45 provided.
Run rlang::last_error() to see where the error occurred.

需解决符号、调色板和边框数量不足的问题,或寻找替代方案。

解决方法

1. 扩展视觉标识列表

ggplot支持的形状编号为0-25,其中21-25为可填充形状。可通过循环重复基础形状,并搭配不同颜色组合生成82组唯一标识:

# 生成82个形状(循环重复0-25)
symbols_extended <- rep(c(0:25), length.out = 82)
# 生成82个高区分度填充色
Palette_extended <- scales::hue_pal()(82)
# 边框色设置:可填充形状用黑色边框,其他形状用与填充色一致的边框
borders_extended <- ifelse(symbols_extended %in% 21:25, "#000000", Palette_extended)

# 替换原绘图代码中的对应参数
ggplot(df_select_Si) + 
  geom_point(aes(x = logDsi, y = predictSi, color = ref, shape = ref, fill = ref), size = 2) +
  scale_shape_manual(values = symbols_extended) +
  scale_fill_manual(values = Palette_extended) +
  scale_colour_manual(values = borders_extended)+
  geom_abline(intercept = 0, slope = 1, size=1)

2. 拆分区分维度

放弃单一维度区分,将形状用于大类别分组(如期刊、年份区间),颜色用于区分单篇参考文献:

# 先给参考文献按年份分组
df_select_Si <- df_select_Si %>%
  mutate(ref_group = cut(year, breaks = 5)) # 按年份分成5组

ggplot(df_select_Si) + 
  geom_point(aes(x = logDsi, y = predictSi, color = ref, shape = ref_group, fill = ref), size = 2) +
  scale_shape_manual(values = c(21,22,23,24,25)) + # 给每组分配唯一形状
  scale_fill_manual(values = scales::hue_pal()(82)) +
  scale_colour_manual(values = rep("#000000",82)) + # 统一黑色边框
  geom_abline(intercept = 0, slope = 1, size=1)

3. 改用交互式图表

用plotly制作交互式图表,鼠标hover时显示参考文献信息,无需依赖视觉区分:

library(plotly)

# 绘制基础ggplot
p <- ggplot(df_select_Si) + 
  geom_point(aes(x = logDsi, y = predictSi, text = paste("参考文献:", ref)), size = 2) +
  geom_abline(intercept = 0, slope = 1, size=1)

# 转为交互式图表
ggplotly(p, tooltip = "text")

4. 简化视觉标识+辅助标注

用统一形状+颜色区分,同时为每个点添加参考文献编号标注:

# 给每个参考文献分配唯一编号
df_select_Si <- df_select_Si %>%
  mutate(ref_id = as.integer(factor(ref)))

ggplot(df_select_Si) + 
  geom_point(aes(x = logDsi, y = predictSi, color = factor(ref_id)), size = 2) +
  geom_text(aes(x = logDsi, y = predictSi + 0.1, label = ref_id), size = 3) + # 标注编号
  scale_color_viridis_d(option = "plasma") + # 用渐变颜色提高区分度
  geom_abline(intercept = 0, slope = 1, size=1)

内容的提问来源于stack exchange,提问作者Ruben Keane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:30:56