You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除左侧数据点后保留ggplot2绘图的原始颜色刻度?

解决方法

问题根源是过滤数据后,ggplot2会自动基于子集的Y值范围生成颜色刻度。要保留原始图例的刻度范围,只需手动指定颜色映射的范围为整个数据集的Y值区间,具体修改如下:

  1. 在scale_fill_gradientn中添加limits = range(dat$Y),强制使用原始数据的Y值最小/最大值作为颜色映射的边界
  2. 可选:添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 22:30:13