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

ggplot绘制直方图时图例与图形颜色不一致问题求助

问题与解决方案

问题描述

希望根据物种类别设置不同颜色组,已成功修改图例使其对应各分类的正确颜色组,但直方图中的颜色与图例不一致,如何解决?

用户提供的原始代码:

ggplot(ABUNDANCE, aes(x = Season, y = meanSEQ, fill = Scientific.name)) +
  geom_bar(stat = "identity", position = "dodge", width = .6) +
  labs(x = "", y = expression("Log10 (Mean number of sequences) ")) +
  facet_wrap(~Data.type, ncol = 1, strip.position = "top") +
  scale_fill_manual(
    values = c(
      brewer.pal(3, "Blues")[-1], brewer.pal(9, "Reds")[-1],
      brewer.pal(6, "Oranges")[-1], brewer.pal(5, "OrRd")[-1],
      brewer.pal(6, "BuGn")[-2], brewer.pal(6, "Greens")[-1]
    ),
    drop = FALSE, name = "Plankton species",
    labels = c(
      "Mnemiopsis leidyi", "Obelia sp.", "Calanus finmarchicus",
      "Calanus helgolandicus", "Centropages hamatus", "Centropages sp.",
      "Centropages typicus", "Evadne nordmanni", "Euterpina acutifrons",
      "Luidia sarsi", "Metridia lucens", "Metridia sp.", "Microcalanus sp.",
      "Oithona similis", "Oithona sp.", "Paracalanus parvus", "Penilia avirostris",
      "Podon leuckartii", "Temora longicornis", "Chaetoceros curvisetus",
      "Chaetoceros danicus", "Chaetoceros sp.", "Coscinodiscus wailesii",
      "Ditylum brightwellii", "Protoperidinium divergens", "Rhizosolenia setigera",
      "Skeletonema marinoi", "Tripos sp."
    )
  ) +
  scale_x_discrete(
    expand = c(0, .6),
    limits = c("Summer", "Fall", "Winter", "Spring"),
    labels = c("Summer 2021", "Fall 2021", "Winter 2022", "Spring 2022")
  ) +
  scale_y_log10() +
  theme_bw() +
  theme(legend.title.align = 0.5, legend.text = element_markdown())

核心原因

颜色不匹配的根源是:scale_fill_manual中未命名的values向量会按数据中Scientific.name的因子水平顺序匹配颜色,但该顺序和你手动指定的labels顺序不一致,导致颜色对应错位。

解决方法

方法一:使用命名颜色向量(推荐)

直接将颜色与物种名称绑定,彻底避免顺序匹配错误:

# 定义各颜色组的颜色
color_groups <- c(
  brewer.pal(3, "Blues")[-1], 
  brewer.pal(9, "Reds")[-1],
  brewer.pal(6, "Oranges")[-1], 
  brewer.pal(5, "OrRd")[-1],
  brewer.pal(6, "BuGn")[-2], 
  brewer.pal(6, "Greens")[-1]
)

# 为颜色向量命名,对应目标物种顺序
names(color_groups) <- c(
  "Mnemiopsis leidyi", "Obelia sp.", "Calanus finmarchicus",
  "Calanus helgolandicus", "Centropages hamatus", "Centropages sp.",
  "Centropages typicus", "Evadne nordmanni", "Euterpina acutifrons",
  "Luidia sarsi", "Metridia lucens", "Metridia sp.", "Microcalanus sp.",
  "Oithona similis", "Oithona sp.", "Paracalanus parvus", "Penilia avirostris",
  "Podon leuckartii", "Temora longicornis", "Chaetoceros curvisetus",
  "Chaetoceros danicus", "Chaetoceros sp.", "Coscinodiscus wailesii",
  "Ditylum brightwellii", "Protoperidinium divergens", "Rhizosolenia setigera",
  "Skeletonema marinoi", "Tripos sp."
)

# 修改后的绘图代码
ggplot(ABUNDANCE, aes(x = Season, y = meanSEQ, fill = Scientific.name)) +
  geom_bar(stat = "identity", position = "dodge", width = .6) +
  labs(x = "", y = expression("Log10 (Mean number of sequences) ")) +
  facet_wrap(~Data.type, ncol = 1, strip.position = "top") +
  scale_fill_manual(
    values = color_groups,  # 使用命名颜色向量
    drop = FALSE, 
    name = "Plankton species",
    labels = names(color_groups)  # 直接复用命名向量的物种名称
  ) +
  scale_x_discrete(
    expand = c(0, .6),
    limits = c("Summer", "Fall", "Winter", "Spring"),
    labels = c("Summer 2021", "Fall 2021", "Winter 2022", "Spring 2022")
  ) +
  scale_y_log10() +
  theme_bw() +
  theme(legend.title.align = 0.5, legend.text = element_markdown())

方法二:统一设置因子顺序

先将数据中Scientific.name的因子水平顺序调整为与labels一致,再使用原有代码:

# 重新设置因子水平顺序
ABUNDANCE$Scientific.name <- factor(ABUNDANCE$Scientific.name, 
                                    levels = c(
                                      "Mnemiopsis leidyi", "Obelia sp.", "Calanus finmarchicus",
                                      "Calanus helgolandicus", "Centropages hamatus", "Centropages sp.",
                                      "Centropages typicus", "Evadne nordmanni", "Euterpina acutifrons",
                                      "Luidia sarsi", "Metridia lucens", "Metridia sp.", "Microcalanus sp.",
                                      "Oithona similis", "Oithona sp.", "Paracalanus parvus", "Penilia avirostris",
                                      "Podon leuckartii", "Temora longicornis", "Chaetoceros curvisetus",
                                      "Chaetoceros danicus", "Chaetoceros sp.", "Coscinodiscus wailesii",
                                      "Ditylum brightwellii", "Protoperidinium divergens", "Rhizosolenia setigera",
                                      "Skeletonema marinoi", "Tripos sp."
                                    ))

# 运行原始绘图代码即可
ggplot(ABUNDANCE, aes(x = Season, y = meanSEQ, fill = Scientific.name)) +
  geom_bar(stat = "identity", position = "dodge", width = .6) +
  labs(x = "", y = expression("Log10 (Mean number of sequences) ")) +
  facet_wrap(~Data.type, ncol = 1, strip.position = "top") +
  scale_fill_manual(
    values = c(
      brewer.pal(3, "Blues")[-1], brewer.pal(9, "Reds")[-1],
      brewer.pal(6, "Oranges")[-1], brewer.pal(5, "OrRd")[-1],
      brewer.pal(6, "BuGn")[-2], brewer.pal(6, "Greens")[-1]
    ),
    drop = FALSE, name = "Plankton species",
    labels = c(
      "Mnemiopsis leidyi", "Obelia sp.", "Calanus finmarchicus",
      "Calanus helgolandicus", "Centropages hamatus", "Centropages sp.",
      "Centropages typicus", "Evadne nordmanni", "Euterpina acutifrons",
      "Luidia sarsi", "Metridia lucens", "Metridia sp.", "Microcalanus sp.",
      "Oithona similis", "Oithona sp.", "Paracalanus parvus", "Penilia avirostris",
      "Podon leuckartii", "Temora longicornis", "Chaetoceros curvisetus",
      "Chaetoceros danicus", "Chaetoceros sp.", "Coscinodiscus wailesii",
      "Ditylum brightwellii", "Protoperidinium divergens", "Rhizosolenia setigera",
      "Skeletonema marinoi", "Tripos sp."
    )
  ) +
  scale_x_discrete(
    expand = c(0, .6),
    limits = c("Summer", "Fall", "Winter", "Spring"),
    labels = c("Summer 2021", "Fall 2021", "Winter 2022", "Spring 2022")
  ) +
  scale_y_log10() +
  theme_bw() +
  theme(legend.title.align = 0.5, legend.text = element_markdown())

内容的提问来源于stack exchange,提问作者Constance Coubris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:55:04