GGPlot2箱线图只显示平坦的线条

4

我已经花了几个小时在这个问题上,但似乎无法解决。图表只显示垂直的平线,这让我很烦恼。我使用factor函数与否都得到相同的输入。

ggplot(df2,aes(x = factor(Location),y=Final.Result)) + geom_boxplot()

问题已解决!有些数据值,例如"< 0.005",R会将其识别为字符串并将所有内容转换为因子。


1
请将运行dput(df2)的结果粘贴到您的问题中。 - BrodieG
请提供生成您当前图形的代码:https://dev59.com/eG025IYBdhLWcg3whGSx - Paul Hiemstra
这是一个相当长的列表。以下是pastebin链接:http://pastebin.com/v1KRb6UM - user3146687
@PaulHiemstra 这是屏幕截图中的内容,但这里是代码 ggplot(df2,aes(x = factor(Location),y=Final.Result)) + geom_boxplot() - user3146687
我建议您将代码编辑到您的问题中。此外,如果您的输入数据很大,您可以提供一个足够小的子集,仍然能够重现该问题。您甚至可以创建虚拟数据。最后,您的输入数据看起来并不是很大,我建议将其粘贴到您的问题中(SO会智能显示),以便稍后保留数据。 - Paul Hiemstra
我该如何粘贴一个表格?之前看到过别人这样做。 - user3146687
3个回答

6
你看到这些行是因为你的数据框中的变量 Final.Result 是因子而不是数值型(你可以使用函数str()进行检查)。
> str(df2)
'data.frame':   66 obs. of  3 variables:
 $ Location    : Factor w/ 17 levels "BOON KENG RD BLK 6 (DS)",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Parameter   : Factor w/ 54 levels "Aluminium","Ammonia (as N)",..: 37 37 37 37 37 37 37 37 37 37 ...
 $ Final.Result: Factor w/ 677 levels "< 0.0005","< 0.001",..: 645 644 654 653 647 643 647 647 646 646 ...

尝试将这些值转换为数字(在df2中没有非数字值)。这仅适用于df2,但如果您的整个数据框具有这些"< 0.0005","< 0.001"值,则应决定如何处理它们(替换为NA或某个小常数)。
df2$Final.Result2<-as.numeric(as.character(df2$Final.Result))
ggplot(df2,aes(x = factor(Location),y=Final.Result2)) + geom_boxplot()

这可能是真正的问题,而我的解决方案在某种程度上也执行了这种转换。 - Paul Hiemstra
@PaulHiemstra,您删除的解决方案也可以使用,非常感谢! :D - user3146687

4

这个答案只与问题的标题相关,但是如果我在谷歌上搜索“ggplot2 boxplot only lines”,这个问题排名第一,且没有其他有用的搜索结果,所以我觉得它很适合在这里:

只有在将数量作为y美学指定时,箱线图才有效。

编辑: 自从ggplot 3.3.0版本以来,有一个orientation=参数可以改变方向。 请参见ggplot新闻

比较

 ggplot(mtcars, aes(x = factor(cyl), y = disp)) + geom_boxplot()

带有x = 数量和y = 分组的示例箱形图

使用该方式可以正确生成箱形图。

 ggplot(mtcars, aes(y = factor(cyl), x = disp)) + geom_boxplot()

错误的美学设置下的箱线图

这个图只给出了线条,而不是箱线图。

要获得水平箱线图,请使用coord_flip()

 ggplot(mtcars, aes(x = factor(cyl), y = disp)) + 
   geom_boxplot() + coord_flip()

vertical boxplot


4

你得到的是平坦线而不是箱形图的另一个原因是,你在表格中汇总了数字值(例如计算平均数、中位数等),现在boxplot()只能看到单个值。

翻译成中文:

你得到的是平坦线而不是箱形图的另一个原因是,你在表格中汇总了数字值(例如计算平均数、中位数等),现在boxplot()只能看到单个值。

“Original Answer”翻译成中文就是“最初的回答”。


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