2012-12-15 171 views
17

我正在寻找一种方法来拉伸两个值之间的颜色渐变和标签的图例,无论数据集中的数据值的范围。从本质上讲,是否有与ylim()相同的功能用于颜色渐变?ggplot比例颜色渐变范围以外的数据范围

鉴于代码图表AZ值通常在-1和1之间,我可以绘制和标记的梯度,如果中断是数据范围内:

require(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) 
    df 
} 

t <- pp(30) 
summary(t) 
b <- c(-.5,0,.5) 
p <- ggplot(data=t,aes(x=x,y=y))+ 
    geom_tile(aes(fill=z))+ 
    scale_fill_gradientn(colours=c("navyblue","darkmagenta","darkorange1"),breaks=b,labels=format(b)) 
try(ggsave(plot=p,filename=<somefile.png>,height=3,width=4)) 

graham jeffries ggplot scale fill example

但是,当我改变在观测范围之外的值被破坏,梯度着色似乎没有调整,梯度标签也不出现。

b <- c(-3,0,3) 

graham jeffries ggplot scale fill example 2

回答

37

要记住,在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轴的范围,你通常会改变一个设置,比如它们的“限制”。

+0

我想我试图实现类似的东西,但与此解决方案失败。我有许多数据集的值在有限的范围内,但理论上它们的范围可以在0到-100(dB)之间。做scale_fill_gradient(低=“白”,高=“红”)是好的,但不让我在视觉上比较数据集。 scale_fill_gradient(low =“white”,high =“red”,limits = c(0,-100),guide =“legend”,limits = c(0,-100),breaks = b,labels = format(c 0,-100))不会产生图例,我不知所措。 – MartinT