我面临以下问题:一些极端值主导着我的geom_raster
情节的色阶。一个例子可能更清楚(注意这个例子只适用于最近的 ggplot2 版本,我使用 0.9.2.1):
library(ggplot2)
library(reshape)
theme_set(theme_bw())
m_small_sd = melt(matrix(rnorm(10000), 100, 100))
m_big_sd = melt(matrix(rnorm(100, sd = 10), 10, 10))
new_xy = m_small_sd[sample(nrow(m_small_sd), nrow(m_big_sd)), c("X1","X2")]
m_big_sd[c("X1","X2")] = new_xy
m = data.frame(rbind(m_small_sd, m_big_sd))
names(m) = c("x", "y", "fill")
ggplot(m, aes_auto(m)) + geom_raster() + scale_fill_gradient2()
现在我通过将某个分位数上的值设置为等于该分位数来解决这个问题:
qn = quantile(m$fill, c(0.01, 0.99), na.rm = TRUE)
m = within(m, { fill = ifelse(fill < qn[1], qn[1], fill)
fill = ifelse(fill > qn[2], qn[2], fill)})
这并不是真正的最佳解决方案。我想要做的是将颜色非线性映射到值的范围,即在该区域中存在更多颜色并进行更多观察。在spplot
我可以classIntervals
从classInt
包中使用来计算适当的类边界:
library(sp)
library(classInt)
gridded(m) = ~x+y
col = c("#EDF8B1", "#C7E9B4", "#7FCDBB", "#41B6C4",
"#1D91C0", "#225EA8", "#0C2C84", "#5A005A")
at = classIntervals(m$fill, n = length(col) + 1)$brks
spplot(m, at = at, col.regions = col)
据我所知,不可能像在spplot
. 我可以转换fill
轴,但由于变量中有负值fill
不起作用。
所以我的问题是:有没有使用 ggplot2 解决这个问题的方法?