【问题标题】:Is there a way in ggplot2 in R to manipulate or customize the display of x axis text?在 R 中的 ggplot2 中是否有一种方法来操作或自定义 x 轴文本的显示?
【发布时间】:2023-03-09 05:55:01
【问题描述】:

挑战:我需要自动(无需硬编码)自定义图表中的 x 轴文本,如下所示。这完全是为了吸引我的用户的审美:

  1. 需要两行文本来代替 x 轴文本。第一行显示子类别(角色),而第二行(品种)显示主类别。请参阅下面的 reprex 代码数据集
  2. 分隔主要类别的垂直线

查看标题为“输出:这就是我想要的”的情节 2,以直观地看到我想要的。 这是一个可重现的示例代码。

require(tidyverse)
bark <- tribble(
  ~breed,    ~value,  ~role,    ~id,
  "Bulldog",   1,       "Dad",   "A",   
  "Bulldog",   1,       "Mom",   "B",
  "Bulldog",   2,       "Ch1",   "C",
  "Bulldog",   1,       "Ch2",   "D",
  "Bulldog",   2,       "Ch3",   "E",
  "Poodle",    1,       "Dad",   "F",
  "Poodle",    3,       "Mom",   "G",
  "Poodle",    1,       "Ch1",   "H",
  "Poodle",    4,       "Ch2",   "I",
  "Beagle",    1,       "Mom",   "J",
  "Beagle",    5,       "Ch1",   "K",
  "Beagle",    1,       "Ch2",   "L",
  "Pug",       1,       "Mom",   "M",
  "Pug",       2,       "Dad",   "N",
  "Pug",       3,       "Ch2",   "O",
  "Pug",       1,       "Ch3",   "P",
  "Boxer",     5,       "Dad",   "Q",
  "Boxer",     4,       "Ch1",   "R"
)
ggplot2::ggplot(data=bark,aes(x=id,y=value))+geom_point()+geom_text(aes(y=1,label=role))+theme(axis.title = element_blank(),axis.text.x = element_blank())

输出:不是我想要的 输出:这就是我想要的

我确信有一些技巧可以帮助我到达那里。提前致谢!

【问题讨论】:

    标签: r ggplot2 tidyverse


    【解决方案1】:

    我认为你最好使用facet_wrap

    编辑:要完全按照自己的方式进行操作,请将 strip.label 与 axis.label 交换:

    ggplot2::ggplot(data=bark,aes(x= role, y=value)) + 
      geom_point() +
      theme(axis.title = element_blank(), strip.placement = "outside") +
      facet_wrap("breed", strip.position = "bottom", nrow = 1)
    
    

    【讨论】:

    • 完美。正是我想要的。您能解释一下“完全按照自己的方式进行操作,将strip.label与axis.label交换”是什么意思吗?抱歉不明白你的意思?
    • 抱歉,不清楚。在编辑中我添加了strip.placement = "outside"。它以前不存在,因此带标签与轴标签交换(默认)。
    【解决方案2】:

    我只是要放一个基于非方面的选项,这是我在某个时候编写的嵌套轴指南,我认为非常接近您想要实现的目标。其本质是使用"axis_nested"作为x轴导向,通过interaction()结合因子组合:

    require(tidyverse)
    #> Loading required package: tidyverse
    library(ggh4x)
    
    bark <- tribble(
      ~breed,    ~value,  ~role,    ~id,
      "Bulldog",   1,       "Dad",   "A",   
      "Bulldog",   1,       "Mom",   "B",
      "Bulldog",   2,       "Ch1",   "C",
      "Bulldog",   1,       "Ch2",   "D",
      "Bulldog",   2,       "Ch3",   "E",
      "Poodle",    1,       "Dad",   "F",
      "Poodle",    3,       "Mom",   "G",
      "Poodle",    1,       "Ch1",   "H",
      "Poodle",    4,       "Ch2",   "I",
      "Beagle",    1,       "Mom",   "J",
      "Beagle",    5,       "Ch1",   "K",
      "Beagle",    1,       "Ch2",   "L",
      "Pug",       1,       "Mom",   "M",
      "Pug",       2,       "Dad",   "N",
      "Pug",       3,       "Ch2",   "O",
      "Pug",       1,       "Ch3",   "P",
      "Boxer",     5,       "Dad",   "Q",
      "Boxer",     4,       "Ch1",   "R"
    )
    
    g <- ggplot(data=bark,aes(x=interaction(role, breed),y=value))+
      geom_point()+
      scale_x_discrete(guide = "axis_nested")
    g
    

    然后,为了让它看起来更像您的示例,您可以删除分隔符并添加垂直线。不幸的是,如果不进行一些预处理,我无法想出一种不对垂直线进行硬编码的方法。

    g <- g + geom_vline(xintercept = c(3.5, 5.5, 10.5, 14.5)) +
      theme(ggh4x.axis.nestline = element_blank())
    g
    

    reprex package (v0.3.0) 于 2020-05-12 创建

    【讨论】:

    • 感谢 ggh4x 软件包。还将探索其他功能。
    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 2015-09-04
    • 2012-01-18
    相关资源
    最近更新 更多