ggplot绘图pValue数值与图例范围不匹配问题求助
问题解决代码
library(ggplot2) # 自定义3个图例分段的断点,可根据需求调整数值 p_breaks <- c(1e-22, 1e-15, 1e-4) ggplot(d, aes(x = Category, y = newx)) + geom_point(aes(size = pValue, fill = Category), alpha = 0.75, shape = 21) + # 修正原代码中newx为字符型无levels的问题 scale_y_discrete(limits = rev(levels(factor(d$newx)))) + # 自定义尺寸标度解决图例不匹配问题 scale_size_continuous( name = "pValue", limits = range(d$pValue), # 强制标度覆盖全部p值范围,确保最小值被包含 breaks = p_breaks, # 手动指定3个图例分段 trans = "log10", # 跨数量级的p值建议做对数转换,尺寸区分度更高 range = c(2, 8) # 控制点的最小/最大尺寸,可自行调整数值 )
修改说明
- 原问题是ggplot默认的连续尺寸标度自动生成的断点没有覆盖数据的最小值区间,手动指定
limits为你数据的p值范围即可解决最小值不展示的问题。 - 手动设置
breaks参数为3个自定义值,就能实现你要的3个分段图例效果。 - 你的p值跨度达19个数量级,线性映射会导致极小p值的尺寸差异几乎不可见,增加
trans = "log10"做对数转换后,尺寸变化会更贴合显著性的感知差异,如果不需要对数转换删除该参数即可。 range参数可以调整点的整体大小区间,按需修改即可。
内容的提问来源于stack exchange,提问作者PesKchan
相关产品推荐
相关产品推荐

