我正在绘制条形图,其中的代码运行得很好,直到某些数据的值为0。
barwidth = 0.35
df1:
norms_number R2.c
1 0.011
2 0
3 0.015
4 0.011
5 0
6 0.012
df2:
norms_number R2.c
1 0.001
2 0
3 0.012
4 0.006
5 0
6 0.004
test <- ggplot()+
geom_bar(data=df1, aes(x=norms_number, y=R2.c),stat="identity", position="dodge", width = barwidth)+
geom_bar(data=df2, aes(x=norms_number+barwidth+0.03, y=R2.c),
stat="identity", position="dodge",width = barwidth)
我的结果是:
并且我得到警告,位置堆栈需要不重叠的x间隔(但它们不重叠?)
我调查了一下,并将DV更改为因子(从数字),这有一半帮助了,因为现在的图形如下:
为什么条形图在y轴上?我还能如何解决这个值为0的怪异错误?
首先,您打算绘制一个条形图,其中高度用值而不是案例数表示。 See here for more details,但是您应该使用geom_col
而不是geom_bar
。
话虽如此,您得到的错误和结果是因为x=norms_number+barwidth+0.03
似乎是您要指定第二组数据(df2
)相对于第一组数据的精确位置( df1
)。
为了使ggplot
闪避,它必须了解使用什么作为闪避的基础,然后它将基于该特定组将包含相同x=
美学的每个观察结果分开(或“闪避”)用作基础。通常情况下,您可以在aes(
中指定类似fill=
的名称,并且ggplot
足够聪明,可以知道您设置为fill=
的任何内容也将是position='dodge'
起作用的基础。在这种情况下(或者如果您想覆盖它),则需要指定一种用于躲避的group=
美观度。]
最终,这意味着您需要组合数据集并为ggplot
提供一种确定如何躲避的方法。这是有道理的,因为您的两个数据框都打算放置在同一图中,并且具有相同的x
和y
美观。如果将它们保留为单独的数据帧,则可以在同一图中对其进行过度绘制,但是没有很好的方法让ggplot
使用position='dodge'
,因为它需要查看geom_col
调用中的所有数据才能知道用什么作为躲闪的基础。
话虽如此,我还是建议您这样做:
# combine datasets, but first make a marker called "origin" # this will be used as a basis for the dodge and fill aesthetics df1$origin <- 'df1' df2$origin <- 'df2' df <- rbind(df1, df2) # need to change norms_number to a factor to allow for discrete axis df$norms_number <- as.factor(df$norms_number)
然后您仅需打一个电话
geom_col
即可获得您的绘图。在第一种情况下,我将仅使用group=
美学向您展示ggplot
如何将其用于躲避机制:
ggplot(df, aes(x=norms_number, y=R2.c)) +
geom_col(position='dodge', width=0.35, aes(group=origin), color='black')
如上所述,您还可以提供fill=
美观性,ggplot
会知道将其用作躲避的机制:
ggplot(df, aes(x=norms_number, y=R2.c)) +
geom_col(position='dodge', width=0.35, aes(fill=origin), color='black')
不太确定是否要在条形图上绘制更复杂的图形,例如条形图。如果要在另一条形图上使用另一种方法,一种方法是使用geom_rect()
: