使用geom_rect绘图时,如何为因子类型X轴保留/添加标签?
解决ggplot2绘制因子X轴矩形时保留标签的问题
你在geom_rect里把因子cat转成数值后,X轴自动变成了连续型,这时候用scale_x_discrete完全不匹配,所以标签直接消失了。给你两个靠谱的解决办法:
方法一:用scale_x_continuous指定刻度和标签
直接针对连续型X轴设置对应因子位置的刻度和标签,修改后的代码如下:
library(ggplot2) library(dplyr) # 样本数据 dat <- data.frame(value=rnorm(100, mean=10, sd=1), cat=c(rep('a', 50), rep('b', 25), rep('c', 25))) %>% mutate(cat=factor(cat, levels=c('a', 'b', 'c'))) dat %>% ggplot() + geom_rect(aes(xmin=as.numeric(cat) - 0.2, xmax=as.numeric(cat) + 0.2, ymin = min(value), ymax = max(value), fill=cat), color='white') + scale_x_continuous( breaks = as.numeric(unique(dat$cat)), # 对应每个因子的数值位置 labels = levels(dat$cat) # 显示因子的原始标签 )
方法二:换用geom_tile更省心
如果只是要给每个类别画对应y范围的矩形,没必要手动转数值,用geom_tile更简洁,X轴自动保留因子标签:
library(ggplot2) library(dplyr) # 样本数据 dat <- data.frame(value=rnorm(100, mean=10, sd=1), cat=c(rep('a', 50), rep('b', 25), rep('c', 25))) %>% mutate(cat=factor(cat, levels=c('a', 'b', 'c'))) dat %>% group_by(cat) %>% summarise(ymin = min(value), ymax = max(value)) %>% ggplot(aes(x=cat, y=(ymin+ymax)/2, height=ymax-ymin, width=0.4, fill=cat)) + geom_tile(color='white') + ylim(min(dat$value), max(dat$value))
这里先按类别分组计算y的最大最小值,再用geom_tile的height和width控制矩形大小,完全不用管数值转换的问题。
内容的提问来源于stack exchange,提问作者Jaken
相关产品推荐
相关产品推荐

