如何在ggplot2箱线图中显示无对应数据的类别
如何在ggplot2箱线图中显示无对应数据的类别
我太懂你这种困惑了——明明按网上说的加了scale_x_discrete(drop=FALSE),但没数据的Plum还是不肯出现在x轴上对吧?其实问题出在你的fruit变量类型上,咱们来快速搞定它!
问题根源
你当前的fruit是普通的字符型变量,ggplot只会根据数据里实际存在的类别来绘制x轴。哪怕你在scale_x_discrete里指定了breaks和labels,但原始数据里根本没有Plum这个值,ggplot就不会把它纳入绘图范围,drop=FALSE在这里也就起不到作用啦——这个参数是用来保留因子水平中存在但无数据的类别,而不是凭空创造新类别。
解决办法
核心思路就是:把fruit转换成因子类型,并且提前把所有你想显示的类别(包括Plum)都设为因子的水平。
方法一:修改数据框的变量类型
先调整你的数据准备代码,把fruit转成带指定水平的因子:
# 原始数据 fruit <- c("Apple","Apple","Orange","Orange","Peach") numbr <- c(2,4,3,5,NA) fruitlist <- c("Apple","Orange","Peach","Plum") # 关键步骤:将fruit转为因子,指定所有要显示的类别作为水平 mydata <- data.frame(fruit = factor(fruit, levels = fruitlist), numbr) # 绘制箱线图 library(ggplot2) ggplot(mydata, aes(x=fruit, y=numbr)) + geom_boxplot() + scale_x_discrete(drop = FALSE)
方法二:在ggplot的映射中直接转换
如果你不想修改原始数据框,也可以在aes映射里直接把x变量转成因子:
# 原始数据不用改 fruit <- c("Apple","Apple","Orange","Orange","Peach") numbr <- c(2,4,3,5,NA) fruitlist <- c("Apple","Orange","Peach","Plum") mydata <- data.frame(fruit, numbr) # 绘图时在aes里指定因子水平 library(ggplot2) ggplot(mydata, aes(x=factor(fruit, levels = fruitlist), y=numbr)) + geom_boxplot() + scale_x_discrete(drop = FALSE)
这样操作之后,Plum就会乖乖出现在x轴上了,只是因为没有对应的数据,所以不会显示箱线图的元素,完全符合你要的“显示所有指定类别”的需求。
内容来源于stack exchange
相关产品推荐
相关产品推荐

