![](/img/trans.png)
[英]ggplot2: geom_bar with group, position_dodge and fill
[英]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).
这让你可能更接近你正在寻找的东西(我假设你的例子中的d
是iris
):
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 表示它们位于彼此之上。 使该值变得非常大,您会得到子列运行到相邻列中......
再次 - 使用这些术语,您应该了解它们如何协同工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.