scale_*_discrete为何不显示全部标签?如何配置含缺失项坐标轴
问题描述
需要绘制存在缺失值的数据(如周期表某周期部分原子数据缺失),要求x轴保留缺失原子的位置标签但不显示对应(x,y)点。当前使用scale_x_discrete时,lims中的值未全部显示,需解决以下问题:
- 如何配置才能显示所有缺失原子的标签?
- 能否让
lims中的值按实际间距排列? scale_x_discrete是否为合适工具?
附原测试代码:
vals <- seq(1.1:11.1) shortlist <- c("Ce","Pr","Nd","Sm","Gd","Tb","Dy","Ho","Er","Tm","Yb") radii <- c(1.010,0.990,0.983,0.958,0.938,0.923,0.912,0.901,0.890,0.880,0.868) df<-do.call(rbind, Map(data.frame, shortlist=shortlist,radii=radii,vals=vals)) #lists for labels with extra atoms lims <- c(1.032,1.010,0.990,0.983,0.97,0.958,0.947,0.938,0.923,0.912,0.901,0.890,0.880,0.868,0.861) labs<-c("La","Ce","Pr","Nd","Pm","Sm","Eu","Gd","Tb","Dy","Ho","Er","Tm","Yb","Lu") #Why does it not include all the values in 'lims'? ggplot(data=df) + geom_point(aes(x=factor(radii), y=vals)) + scale_x_discrete(breaks = lims, labels=labs)
解决方案
1. 原代码的问题根源
你将连续型的半径值用factor(radii)转成了离散因子,而scale_x_discrete的breaks仅能识别数据中存在的因子水平——缺失原子对应的半径值不在原始radii列表里,因此无法被显示。
2. 显示所有缺失原子标签的方法
不能直接用scale_x_discrete实现,需先构建包含**所有原子(含缺失项)**的基准数据框,再将现有数据匹配到该框架中:
- 创建包含全量原子名称、对应半径的完整数据框,缺失原子的
vals设为NA - 基于完整数据框绘图,
geom_point会自动忽略NA值,不显示对应点
3. 按实际半径间距排列的实现
若要按半径的真实数值间距排列,x轴需使用连续型变量(半径值),而非离散的原子名称。通过scale_x_continuous设置刻度和标签,即可让刻度按半径的实际大小间距分布。
两种可行代码示例
示例一:x轴显示原子名称(按原子顺序离散排列)
library(ggplot2) # 构建全量原子的基准数据框 full_labs <- c("La","Ce","Pr","Nd","Pm","Sm","Eu","Gd","Tb","Dy","Ho","Er","Tm","Yb","Lu") full_radii <- c(1.032,1.010,0.990,0.983,0.97,0.958,0.947,0.938,0.923,0.912,0.901,0.890,0.880,0.868,0.861) full_df <- data.frame(shortlist = full_labs, radii = full_radii) # 将现有数据的vals匹配到全量数据框,缺失项自动为NA full_df$vals <- df$vals[match(full_df$shortlist, df$shortlist)] # 绘图:自动隐藏缺失点,保留所有原子标签 ggplot(full_df, aes(x = shortlist, y = vals)) + geom_point() + xlab("原子") + ylab("数值")
示例二:x轴按半径实际间距排列(连续型,显示原子名称标签)
library(ggplot2) # 直接用原始数据绘图,x轴为连续型半径值 ggplot(df, aes(x = radii, y = vals)) + geom_point() + # 设置全量半径为刻度点,对应标签为原子名称 scale_x_continuous(breaks = full_radii, labels = full_labs, limits = range(full_radii)) + xlab("原子半径") + ylab("数值")
总结
scale_x_discrete适合x轴为分类变量的场景,若需要按连续数值间距排列,应使用scale_x_continuous- 要保留缺失标签,必须让x轴的基准包含所有需要显示的类别/数值,再将现有数据匹配进去
内容的提问来源于stack exchange,提问作者S B
相关产品推荐
相关产品推荐

