ggplot2 条形图中的颜色 X 轴

Color X axis in ggplot2 bar plot

我需要帮助才能为 ggplot2 图的 x 轴着色。

到目前为止,我可以做到以下几点:

    head(data)
  x  y group Axis_color
1 A 25     F         G1
2 A 88     G         G1
3 A 88     H         G1
4 A 22     I         G1
5 A 18     J         G1
6 B 54     F         G3

color_list<- c("F"="orange", "G"="darkgreen", "H"="grey", "I"="pink", "J"="purple", "G1"="blue","G2"="red","G3"="green")
ggplot(data, aes(x = x, y = y, fill = group, label = y)) + 
  coord_flip()+
  geom_bar(stat = "identity")

给出:

但我想作为列“Axis_color”,以便将存储在 color_list 中的颜色添加到 x 轴并得到:

如您所见,我也得到了两个不同的图例轴。

如果有帮助的话,这里是数据:

structure(list(x = c("A", "A", "A", "A", "A", "B", "B", "B", 
"B", "B", "C", "C", "C", "C", "C", "D", "D", "D", "D", "D", "E", 
"E", "E", "E", "E"), y = c(25, 88, 88, 22, 18, 54, 25, 37, 68, 
72, 36, 84, 17, 64, 48, 15, 17, 72, 61, 25, 66, 10, 18, 99, 63
), group = c("F", "G", "H", "I", "J", "F", "G", "H", "I", "J", 
"F", "G", "H", "I", "J", "F", "G", "H", "I", "J", "F", "G", "H", 
"I", "J"), Axis_color = c("G1", "G1", "G1", "G1", "G1", "G3", 
"G3", "G3", "G3", "G3", "G1", "G1", "G1", "G1", "G1", "G2", "G2", 
"G2", "G2", "G2", "G3", "G3", "G3", "G3", "G3")), row.names = c(NA, 
-25L), class = "data.frame")

我能想到的包含图例的最方便的解决方案是使用 geom_text() 放置假轴标签。如果不需要图例,我会推荐 ggtext

通过将文本放置在 x = -Inf 处,您可以将其放置在轴的最小值处,并且可以使用 hjust 进一步将文本推到外侧。您需要关闭坐标中的裁剪才能使其工作。或者你也可以设置 x = -10 或其他东西,但你必须调整比例限制并为每个图定制这个值。

# data <- structure(...) # omitted for brevity

library(ggplot2)

color_list<- c("F"="orange", "G"="darkgreen", "H"="grey", "I"="pink", "J"="purple", "G1"="blue","G2"="red","G3"="green")

ggplot(data, aes(x = y, y = x, fill = group, label = x)) + 
  geom_col() +
  geom_text(data = ~ subset(.x, !duplicated(x)),
            aes(x = -Inf, colour = Axis_color), hjust = 2) +
  scale_fill_manual(values = color_list[1:5]) +
  scale_colour_manual(values = color_list[-c(1:5)]) +
  coord_cartesian(clip = "off") +
  theme(axis.text.y = element_text(colour = NA))

小旁注:我用 geom_col() 替换了 geom_bar(stat = "identity"),因为这看起来更干净,并交换了 x 和 y 美学,消除了对 coord_flip().

的需要

另一种实现您想要的结果的选择是使用 ggtext 包,它允许通过一些 HTML/CSS.

为轴标签着色

为了获得第二个图例,我使用了 ggnewscale 包,就像@teunbrand 的方法一样。然而,为了使这项工作我们还必须添加第二个 geom。为此,我在设置 y=0.

的地方添加了一个助手 geom_col

library(ggplot2)
library(ggtext)
library(dplyr)
library(tibble)

color_list <- c("F"="orange", "G"="darkgreen", "H"="grey", "I"="pink", "J"="purple", "G1"="blue","G2"="red","G3"="green")
axis_color <- dplyr::distinct(data, x, Axis_color) %>% 
  tibble::deframe()

ggplot(data, aes(x = x, y = y, fill = group, label = y)) + 
  coord_flip()+
  geom_bar(stat = "identity") +
  scale_fill_manual(values = color_list, limits = force, guide = guide_legend(order= 1)) +
  scale_x_discrete(labels = ~ glue::glue("<span style='color: {color_list[axis_color[.x]]}'>{.x}</span>")) +
  ggnewscale::new_scale_fill() +
  geom_col(aes(y = 0, fill = Axis_color)) +
  scale_fill_manual(values = color_list[unique(data$Axis_color)], guide = guide_legend(order= 2)) +
  theme(axis.text.y = ggtext::element_markdown())