条形图-条形图跳到y轴

问题描述 投票:0回答:2

我正在绘制条形图,其中的代码运行得很好,直到某些数据的值为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)

我的结果是:

enter image description here

并且我得到警告,位置堆栈需要不重叠的x间隔(但它们不重叠?)

我调查了一下,并将DV更改为因子(从数字),这有一半帮助了,因为现在的图形如下:

enter image description here

为什么条形图在y轴上?我还能如何解决这个值为0的怪异错误?

r ggplot2 bar-chart zero
2个回答
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提供一种确定如何躲避的方法。这是有道理的,因为您的两个数据框都打算放置在同一图中,并且具有相同的xy美观。如果将它们保留为单独的数据帧,则可以在同一图中对其进行过度绘制,但是没有很好的方法让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')

enter image description here

如上所述,您还可以提供fill=美观性,ggplot会知道将其用作躲避的机制:

ggplot(df, aes(x=norms_number, y=R2.c)) +
  geom_col(position='dodge', width=0.35, aes(fill=origin), color='black')

enter image description here


0
投票

不太确定是否要在条形图上绘制更复杂的图形,例如条形图。如果要在另一条形图上使用另一种方法,一种方法是使用geom_rect()

© www.soinside.com 2019 - 2024. All rights reserved.