使用ggplot绘制箱线图时出现“position-dodge warning”警告?

5

我正在尝试使用以下代码使用ggplot2制作箱线图:

p <- ggplot(
      data,
      aes(d$score, reorder(d$names d$scores, median))
     ) +
       geom_boxplot()

我有名为names的因素和名为scores的整数。
我的代码生成了一个图表,但是图形没有描绘出盒形(只显示线条),并且我收到一个警告消息:“position_dodge需要非重叠的x间隔。”我尝试用geom_boxplot(width=5)来调整高度和宽度,但似乎并没有解决问题。 有人能提供可能的解决方案吗?
我应该指出,我的箱形图相当大,在y轴上有大约200个名称值。也许这就是问题所在?
3个回答

32
组数不是问题;即使只有两组,我也能看到同样的情况。问题在于ggplot2以垂直方式绘制箱线图(沿y轴连续,沿x轴分类),而你正在尝试水平绘制它们(沿x轴连续,沿y轴分类)。
此外,你的示例存在多个语法错误,并且无法重现,因为我们没有data/d
从一些模拟数据开始。
dat <- data.frame(scores=rnorm(1000,sd=500), 
                  names=sample(LETTERS, 1000, replace=TRUE))

你的示例代码已经被纠正:

ggplot(dat, aes(scores, reorder(names, scores, median))) + geom_boxplot()

ggplot(dat,aes(scores,reorder(names,scores,median)))+ geom_boxplot()

这是您看到的水平线。

如果您将分类变量放在x轴上,连续变量放在y轴上,您会得到:

ggplot(dat, aes(reorder(names, scores, median), scores)) + geom_boxplot()

ggplot(dat, aes(reorder(names, scores, median), scores)) + geom_boxplot()

最后,如果你想翻转坐标轴,可以使用coord_flip()。如果你在做更复杂的图形时可能会有一些额外的问题,但对于基本的箱线图它是有效的。

ggplot(dat, aes(reorder(names, scores, median), scores)) + 
  geom_boxplot() + coord_flip()

使用ggplot(dat, aes(reorder(names, scores, median), scores)) + geom_boxplot() + coord_flip()来绘制箱线图


1
哇,谢谢!这正是我遇到的问题。我非常感谢你详尽的回答。 - drbunsen

8

如果有人因为看到以下警告信息而来到这里,想知道原因

Warning message:

position_dodge requires non-overlapping x intervals

为什么会出现这种情况

这种情况的原因是一些箱形图/小提琴图(或其他类型的图)可能重叠在一起了。在很多情况下,您可能不关心,但在某些情况下,它会有影响,这就是为什么会发出警告。

如何解决

您有两个选择。要么在生成/打印ggplot时抑制警告

另一个选择是简单地调整绘图的宽度,使图形不重叠,然后警告就会消失。尝试更改geom的width参数:例如geom_boxplot(width = 0.5) (对geom_violin()也适用)


1
除了@stevec提供的选项之外,如果您看到以下内容:
  • position_stack requires non-overlapping x intervals
  • position_fill requires non-overlapping x intervals
  • position_dodge requires non-overlapping x intervals
  • position_dodge2 requires non-overlapping x intervals
并且如果您的x变量应该重叠以获得不同的美学效果(例如填充),您可以尝试将x_var转换为因子:

geom_bar(aes(x = factor(x_var), fill = type)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接