【问题标题】:ggplot2: geom_bar and position_dodge: not centered to x axis (factor)ggplot2:geom_bar 和 position_dodge:不以 x 轴为中心(因子)
【发布时间】:2020-03-25 17:28:25
【问题描述】:

我在这个情节上有两个问题。我想让条形更宽(组之间的间距更小),并且我希望每组条形都以每个 x 因子值为中心。

我在 y 轴上有一个连续变量,在 x 轴上有一个因子值。对于每个因素,我分为三组。

这是我的虹膜数据问题的一个示例:

d <- iris

ggplot(d) +
geom_col(aes(x=as.factor(Sepal.Length), y=Petal.Width, fill=as.factor(Species)),position = position_dodge(preserve = "single"), width=1) + 
  theme(axis.text.x = element_text(angle = 90).

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    这可能会让您找到更接近您正在寻找的东西(我假设您的示例中的 diris):

    ggplot(iris) +
        geom_col(
            aes(
                x=as.factor(Sepal.Length), y=Petal.Width, fill=Species
            ),
            position = position_dodge(0.5),
            width=0.5) + 
        theme(axis.text.x = element_text(angle = 90, vjust=0.5))
    

    现在,解释一下我改变了什么以及为什么:

    X 轴上的文本定位。您使用element_text(angle=90) 更改了文本的方向。这是正确的,但它只会改变 角度 而不会改变 定位/对齐方式。默认情况下,水平文本垂直对齐为“在顶部”。如果您运行上面的代码并使用vjust=1 代替vjust=0.5,您会看到它恢复到它为您显示的方式,刻度线与x 上值的“顶部”对齐轴文本。

    as.factor(Species) 无需声明Species 一个因子。运行str(iris),您会看到iris$Species 已经是一个因素。除了与图例的标题混淆之外,并没有真正改变任何结果。

    Position_dodge 宽度和宽度。 最好通过混淆position_dodge(0.5)width=0.5 这两个术语中的值来解释这一点。自己玩一下,您会看到它们各自的作用,但这里是一般解释:

    • x 轴上每个位置的总列宽由width=0.5 确定,它是geom_col() 的参数。因此,对于此图中的每个Sepal.Length 因子,这意味着“0.5”用作该空间中列(或列)的总宽度。 “1.0”表示“我希望所有列相互接触”,而“0.2”表示“我想要窄列”。 “0”表示...我不想要列 - 给它们宽度为零!

    • 每个“子列”的宽度(本例中每个 Sepal.Length 的每个 Species 列)由 position_dodge(width=0.5) 术语控制。 0.5 表示“将其分成两半并让列相互精确接触”。较高的值会将它们分开,较低的值会将它们挤压在一起,其中 0 表示它们彼此重叠。使值非常大,您会得到子列运行到相邻列...

    再次 - 使用这些术语,您应该了解它们如何协同工作。

    【讨论】:

    • 非常感谢@chemdork123。这是一个非常有用的答案。我仍然有问题让我的情节看起来像我想要的那样。我希望这些条在我身边,并且所有条的宽度都相同(这就是为什么我添加了 preserve="single" 参数)。当我增加闪避参数时,我再次“松开”对齐。我希望你能帮助我。谢谢
    • 这或多或少地得到了我想要的,但看看轴值。肯定有更好的方法:ggplot(iris) + geom_col( aes( x=as.factor(Sepal.Length), y=Petal.Width, fill=Species ), position = position_dodge(-3, preserve = "单"), width=3) + 主题(axis.text.x = element_text(angle = 90, vjust=3))
    【解决方案2】:

    也许另一种解决方案是使用position_dodge2,它将每个条形置于 x 值的中心:

    ggplot(iris, aes(x = as.factor(Sepal.Length), y = Petal.Width, fill = Species))+
      geom_col(position = position_dodge2(preserve = "single", width = 1))+
      theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))
    

    【讨论】:

      猜你喜欢
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      相关资源
      最近更新 更多