如何移除左侧数据点后保留ggplot2绘图的原始颜色刻度?
解决方法
问题根源是过滤数据后,ggplot2会自动基于子集的Y值范围生成颜色刻度。要保留原始图例的刻度范围,只需手动指定颜色映射的范围为整个数据集的Y值区间,具体修改如下:
- 在
scale_fill_gradientn中添加limits = range(dat$Y),强制使用原始数据的Y值最小/最大值作为颜色映射的边界 - 可选:添加
breaks = seq(-0.5, 1, 0.5),明确指定刻度断点,和原始图例完全匹配
修改后的完整代码:
library(fields);library(ggplot2);library(colorRamps);library(dplyr) loc<-as.matrix(expand.grid(seq(0,1,.03),seq(0,1,.03))) n=nrow(loc) matCov<-function(distMat,phi){ (1+(sqrt(5)*(distMat/phi))+((5*distMat^2)/(3*(phi^2))))*exp(-(sqrt(5)*(distMat/phi))) } distMat<-as.matrix(rdist(loc)) CovMat <- matCov(distMat,phi=1) set.seed(123) Y <- as.numeric(t(chol(CovMat))%*%rnorm(n)) dat = as.data.frame(cbind(loc[,1:2],Y)) names(dat) = c("long","lat","Y") # 原始绘图(用于对比) ggplot(dat, aes(long, lat)) + geom_raster(aes(fill = Y), interpolate = TRUE) + scale_fill_gradientn(colours=matlab.like(10))+ theme(legend.title=element_blank()) pick <- function(condition){ function(d) d %>% filter_(condition) } # 修改后的目标绘图 ggplot(dat, aes(long, lat)) + geom_raster(aes(fill = Y), interpolate = TRUE,data = pick(~long > 0.5)) + # 关键修改:指定颜色映射范围为原始数据的Y区间,同时设置刻度断点 scale_fill_gradientn(colours=matlab.like(10), limits = range(dat$Y), breaks = seq(-0.5, 1, 0.5))+ theme(legend.title=element_blank())+ scale_x_continuous(limits=c(0,1))
这样修改后,即使只绘制long>0.5的区域,颜色刻度依然会保留原始数据集的范围和断点,x轴也保持0-1的区间。
内容的提问来源于stack exchange,提问作者Remy M
相关产品推荐
相关产品推荐

