ggplot 将颜色渐变缩放到数据范围之外
Posted
技术标签:
【中文标题】ggplot 将颜色渐变缩放到数据范围之外【英文标题】:ggplot scale color gradient to range outside of data range 【发布时间】:2012-12-03 00:25:40 【问题描述】:我正在寻找一种方法来拉伸两个值之间的颜色渐变并标记图例,而不管数据集中的数据值范围如何。本质上,对于颜色渐变,是否有与 ylim()
等效的功能?
给定的代码绘制 z 值通常在 -1 和 1 之间,如果中断在数据范围内,我可以绘制并标记渐变:
library(ggplot2)
#generator from http://docs.ggplot2.org/current/geom_tile.html
pp <- function (n, r = 4)
x <- seq(-r * pi, r * pi, len = n)
df <- expand.grid(x = x, y = x)
df$r <- sqrt(df$x^2 + df$y^2)
df$z <- cos(df$r^2) * exp(-df$r / 6)
return(df)
t <- pp(30)
summary(t)
b <- c(-.5, 0, .5)
colors <- c('navyblue', 'darkmagenta', 'darkorange1')
p <- ggplot(data = t, aes(x = x, y = y))+
geom_tile(aes(fill = z))+
scale_fill_gradientn(colors = colors, breaks = b, labels = format(b))
ggsave(plot = p, filename = <somefile.png>, height = 3, width = 4)
但是当我将中断更改为观察范围之外的值时,渐变颜色似乎没有调整,渐变标签也没有出现。
b <- c(-3, 0, 3)
【问题讨论】:
【参考方案1】:记住,在 ggplot 中,breaks
基本上不会改变比例本身,这一点非常重要。它只会改变指南或图例中显示的内容。
您应该改为更改秤的限制:
ggplot(data=t, aes(x=x, y=y)) +
geom_tile(aes(fill=z)) +
scale_fill_gradientn(limits = c(-3,3),
colours=c("navyblue", "darkmagenta", "darkorange1"),
breaks=b, labels=format(b))
现在,如果您希望图例中出现的中断进一步扩展,您可以更改它们以设置刻度线出现的位置。
要记住的一个很好的类比始终是常规的 x 轴和 y 轴。在那里设置“中断”只会改变刻度线出现的位置。如果您想更改 x 或 y 轴的 extent,您通常会更改设置,例如它们的“限制”。
【讨论】:
我想我正在尝试实现类似的目标,但这个解决方案失败了。我有许多数据集的值在有限的范围内,但理论上它们的范围可以在 0 到 -100 (dB) 之间。做 scale_fill_gradient(low="white", high="red") 很好,但不允许我直观地比较数据集。 scale_fill_gradient(low="white", high="red",limits = c(0,-100),guide = "legend",limits = c(0,-100),breaks=b,labels=format(c( 0,-100)) 不产生图例。我很茫然。 谢谢!当我为我的平铺图设置上限时,这非常有效。但是,当我尝试设置指定的下限(即“NA”以外的任何值)时,R 向我提供了以下错误: UseMethod("depth") 中的错误:没有适用于 'depth' 的方法应用于对象类“空”。更新:我无法重现此错误,现在似乎一切正常!以上是关于ggplot 将颜色渐变缩放到数据范围之外的主要内容,如果未能解决你的问题,请参考以下文章