如何为geom_tile绘图的图例指定等间距整数断点?
ggplot2 geom_tile 图例等距整数断点设置方案

问题根源
- 你将
Intro_0转换为因子后,变量的水平值为字符类型(如"80"、"90"),之前直接传入数值型向量c(80,90,100,110,120)作为breaks,和因子水平类型不匹配,无法识别对应断点,因此图例消失。 - 原代码用
levels(test2$Intro_0)[seq(1, N, by=30)]取断点,是按因子水平的存储位置等步长截取,不是按数值大小等距划分,因此会出现断点间距不均、出现非整数的问题。
解决方法
方法1:最小改动,保留原有因子映射逻辑
不需要调整其他代码,只需要将你要设置的整数断点转为字符型,即可和因子水平正常匹配,替换原有的scale_fill_manual行即可:
scale_fill_manual( values = colours, breaks = as.character(c(80, 90, 100, 110, 120)) )
方法2:更适配连续数值的写法(推荐)
你的Intro_0本身是80-120区间的连续数值,不需要转成因子用离散标度,直接用连续填充标度天然支持等距数值断点,颜色过渡也更顺滑,修改步骤如下:
- 删除
test2$Intro_0 <- factor(test2$Intro_0)这行转因子的代码 - 调整映射和标度代码,注意x轴的Freq是离散分类,需要在aes中转成因子才能匹配离散刻度标签
完整核心代码如下:
# 颜色只需要指定色阶节点即可,不需要生成和水平数等量的颜色 colours <- c("deeppink4", "violetred", "palevioletred", "rosybrown1") ggplot(test2, aes(x = factor(Freq), y = SD, fill = Intro_0))+ geom_tile()+ xlab("Frequency of Disturbance")+ ylab("Magnitude of Disturbance")+ labs(fill="Longevity")+ scale_x_discrete(labels= c("Once every 10 days", " ", " ", "Once per week", " ", "Once every 5 days", " ", " ", "Once every 2 days", "Once per day", "Twice per day", " ", "10 times per day"))+ # 连续色阶直接指定等距整数断点 scale_fill_gradientn( colours = colours, breaks = c(80, 90, 100, 110, 120), limits = c(80, 120) )+ theme_tufte()+ theme(axis.text.x = element_text(angle = 45, hjust=1))
运行后图例将自动按数值等距排列,断点就是你指定的整数值,不会出现间距不均、非整数断点的问题。
内容的提问来源于stack exchange,提问作者MadelineJC
相关产品推荐
相关产品推荐

