ggplot2绘图时同名因子层级合并问题:保留重复首字母月份层级
解决ggplot2中重复首字母月份因子层级合并的问题
你碰到的这个问题,核心原因是mapvalues()是直接替换因子的实际取值——当多个原始月份被替换成同一个首字母时,R就会把它们合并成同一个因子水平,毕竟因子是靠取值来区分层级的。要在不修改原数据集(或者说不丢失12个月份的独立层级)的前提下实现显示首字母但每个月份单独绘图,有两个更靠谱的方案:
方案1:直接在ggplot里改刻度标签(最推荐,完全不碰原数据)
不用额外创建新列,直接在绘图时给x轴的月份刻度指定显示标签就行,原始的12个因子层级完全保留,只是画图时显示首字母:
library(ggplot2) # 替换成你实际的绘图代码,这里用geom_col举例子 ggplot(pd, aes(x = Month, y = Density)) + geom_col() + scale_x_discrete( # 标签顺序必须和pd$Month的原始因子水平顺序完全对应:Dec, Jan, Feb...Nov labels = c("D","J","F","M","A","M","J","J","A","S","O","N") )
这样每个原始月份层级都会显示对应的首字母,而且ggplot会把它们当成12个独立的类别,不会出现Jan、Jun、Jul合并的情况。
方案2:创建带独立层级的新因子列(如果需要保留这个列)
如果你确实需要在数据框里存这个“显示首字母但层级独立”的列,别用mapvalues(),直接用factor()重新给每个原始层级指定标签——这样每个原始月份都会对应一个独立的新层级,只是显示的文字是首字母:
pd$Month2 <- factor( pd$Month, # 同样,标签顺序要和原始因子水平顺序一致 labels = c("D","J","F","M","A","M","J","J","A","S","O","N") ) # 现在检查一下,Month2是12个独立层级: str(pd$Month2) # Factor w/ 12 levels "D","J","F","M",..: 1 1 1 1 1 1 1 1 1 1 ...
这时候虽然标签有重复,但每个层级在底层是分开的,ggplot绘图时会把Jan、Jun、Jul分别展示,只是它们的x轴标签都是"J",完全符合你的需求。
为啥之前的mapvalues()会失效?
mapvalues()是直接把因子的取值替换成新字符串,当多个原始取值被换成同一个字符串时,这些层级就会被合并——因为因子的层级是由取值唯一确定的。而上面的两种方法,要么是在绘图阶段临时改显示标签(不改动因子本身),要么是保留原始因子的层级结构,只修改每个层级的显示名称,自然就不会丢失12个月份的独立性了。
内容的提问来源于stack exchange,提问作者Muneer
相关产品推荐
相关产品推荐

