繁体   English   中英

ggplot2:geom_bar 和 position_dodge:不以 x 轴为中心(因子)

[英]ggplot2: geom_bar and position_dodge: not centered to x axis (factor)

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

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

以下是我的 Iris 数据问题示例:

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).

这让你可能更接近你正在寻找的东西(我假设你的例子中的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 表示它们位于彼此之上。 使该值变得非常大,您会得到子列运行到相邻列中......

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

也许另一种解决方案是使用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))

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM