更改上限scale_fill_gradient2也会影响值<0的颜色分类,因为0周围的颜色分布似乎总是对称的,是否有办法获得颜色值的不对称分布?
这是一个使用的情节的最小例子geom_tile():
data <- read.csv("http://protzkeule.de/data.csv")
p <- ggplot(data = data, aes(x = variable, y = meas)) + geom_tile(aes(fill = value))
Run Code Online (Sandbox Code Playgroud)
具有对称限制的图:
p + scale_fill_gradient2(low = "blue", mid = "white", high = "red", guide = "colorbar",
limits = c(-0.1, 0.1))
Run Code Online (Sandbox Code Playgroud)
但是当更改上限时,较低的颜色映射也会改变(观察颜色条):
p + scale_fill_gradient2(low = "blue", mid = "white", high = "red", guide = "colorbar",
limits = c(-0.1, 0.3))
Run Code Online (Sandbox Code Playgroud) 我遇到了以下问题:一些极端值主导着我的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()
Run Code Online (Sandbox Code Playgroud)

现在我通过将某个分位数上的值设置为等于该分位数来解决此问题:
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)})
Run Code Online (Sandbox Code Playgroud)

这并不是一个真正的最佳解决方案.我想要做的是将颜色的非线性映射到值的范围,即在具有更多观察值的区域中存在更多颜色.在spplot我可以用classIntervals从classInt包计算合适的阶级界限:
library(sp)
library(classInt)
gridded(m) = …Run Code Online (Sandbox Code Playgroud) 我已经看到了类似的问题,但我想直接问我的具体问题:
我有一个散点图,其中"z"变量编码为色标:
library(ggplot2)
myData <- data.frame(x = rnorm(1000),
y = rnorm(1000))
myData$z <- with(myData, x * y)
badVersion <- ggplot(myData,
aes(x = x, y = y, colour = z))
badVersion <- badVersion + geom_point()
print(badVersion)
Run Code Online (Sandbox Code Playgroud)
产生这个: 
正如您所看到的,由于"z"变量是正态分布的,因此很少有点用分布的"极端"颜色着色.这是应该的,但我有兴趣强调差异.一种方法是使用:
betterVersion <- ggplot(myData,
aes(x = x, y = y, colour = rank(z)))
betterVersion <- betterVersion + geom_point()
print(betterVersion)
Run Code Online (Sandbox Code Playgroud)
产生这个: 
通过将rank()应用于"z"变量,我更加强调"z"变量中的微小差异.可以想象在这里使用任何转换,而不是排名,但你明白了.
我的问题基本上是,以最简单的方式,或最"真正的ggplot2"方式,以原始单位(z的单位,而不是z的等级)获得一个图例,同时保持转换后的版本有色点?
我有一种感觉,它以某种方式使用rescaler(),但我不清楚如何使用rescaler()与任意转换等.一般来说,更明确的例子将是有用的.
在此先感谢您的时间.
我在中创建了一个热图,并ggplot2使用geom_tile映射了值scale_fill_gradientn。色标分为两个渐变。一个梯度将值从0映射到0.05,另一个梯度将值从0.05映射到1。我希望红黄色渐变(0-0.05)具有与黑褐色渐变(0.05-1)相同的高度。
问题:如何修改颜色条,以使值0.05位于条的中间/中央,从而使两个不同的颜色渐变的高度相同?
换句话说,假设0.05刻度线是一个滑块,您可以将其移动到扩展/压缩各个渐变的条的中间。
以下两篇文章讨论了类似的问题,但没有最终解决方案,或者至少没有我可以轻易理解并回答我的问题的解决方案:
非常感谢大家阅读我的问题并思考可能的解决方案。到目前为止,除了在Photoshop中编辑颜色栏外,我什么都找不到。彼得
可重现的示例:
TEST <- read.csv ("https://filetea.me/n3wHRhuy0GlS4xvjQDxs95BVA",header=T,row.names=NULL)
library(ggplot2)
ggplot(TEST, aes(x=Measure, y=SMTSD))+
geom_tile(aes(fill=Pval),colour="grey50", size=0.1) +
scale_x_discrete(expand = c(0,0))+
coord_equal(ratio=1)+
scale_fill_gradientn(colours=c("red","yellow","black","#996633"),
values=c(0,0.0499,0.05,1),
na.value="white", guide="colourbar",
name="P-value",limits=c(0,1),breaks=c(0,0.05,1))+
guides(fill = guide_colourbar(barheight = 20, direction = "vertical",
title.position="top", title.hjust = 0.5,title.vjust = 0.5, nbin = 50))
Run Code Online (Sandbox Code Playgroud)