【问题标题】:Color X axis in ggplot2 bar plotggplot2条形图中的颜色X轴
【发布时间】:2021-11-18 07:24:46
【问题描述】:

我需要帮助才能为 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")

【问题讨论】:

    标签: r ggplot2 geom-bar


    【解决方案1】:

    实现您想要的结果的另一个选择是使用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())
    

    【讨论】:

      【解决方案2】:

      我能想出的包含图例的最方便的解决方案是使用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()

      【讨论】: