条形图 - 条形跳到 y 轴

Bar chart - bars jumped to y-axis

我正在使用代码绘制条形图,该代码运行良好,直到某些数据的值为 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躲闪,它必须了解使用什么作为躲闪的基础,然后它会分离(或"dodge")包含相同x= 以特定群体为基础的审美。在正常情况下,你会在 aes( 中指定类似 fill= 的内容,而 ggplot 足够聪明,知道你设置为 fill= 的任何内容也将成为 [=] 的基础24=] 发挥作用。如果没有(或者如果你想覆盖它),你需要指定一个 group= 用于躲避的美学。

最终,这意味着您需要结合您的数据集并提供 ggplot 一种决定如何躲避的方法。这是有道理的,因为您的两个数据框都打算放置在同一个图中,并且都具有相同的 xy 美学。如果将它们保留为单独的数据帧,则可以在同一图中重叠绘制它们,但是没有什么好方法让 ggplot 使用 position='dodge',因为它需要查看 [=13] 中的所有数据=] 调用以了解使用什么作为闪避的基础。

综上所述,这是我要推荐的:

# 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() 如果您想要一个在另一个上方:

ggplot()+
geom_rect(data=df1, 
aes(xmin=norms_number-barwidth,xmax=norms_number,
ymin=0,ymax=R2.c))+
geom_rect(data=df2, 
aes(xmin=norms_number,xmax=norms_number+barwidth,
ymin=0,ymax=R2.c))+
scale_x_continuous(breaks=1:6)