条形图 - 条形跳到 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
一种决定如何躲避的方法。这是有道理的,因为您的两个数据框都打算放置在同一个图中,并且都具有相同的 x
和 y
美学。如果将它们保留为单独的数据帧,则可以在同一图中重叠绘制它们,但是没有什么好方法让 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)
我正在使用代码绘制条形图,该代码运行良好,直到某些数据的值为 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
一种决定如何躲避的方法。这是有道理的,因为您的两个数据框都打算放置在同一个图中,并且都具有相同的 x
和 y
美学。如果将它们保留为单独的数据帧,则可以在同一图中重叠绘制它们,但是没有什么好方法让 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)