ggplot2 colorbar,针对偏斜数据进行不连续跳转

时间:2018-05-01 14:56:12

标签: r ggplot2

以下是一些虚假数据xy,其中包含颜色信息zz高度倾斜,因此使得颜色条无法提供信息:

set.seed(1)
N <- 100
x <- rnorm(N)
y <- x + rnorm(N)
z <- x+y+rnorm(N)
z[z>2] <- z[z>2]+exp(z[z>2]-2)
d <- data.frame(x,y,z)
ggplot(d, aes(x=x, y=y, color = z)) + geom_point()

enter image description here

我想让大部分的colorbar反映出数据的主要范围,但是有一个溢出的框,比如说5.这样的东西:

enter image description here

有没有办法在ggplot2中执行此操作?请注意,我希望colorbar在大多数范围内保持连续,而不是离散。如果我想要的东西不可行,我可能会离婚或者编码。

2 个答案:

答案 0 :(得分:4)

你可以得到那个一般的情节,虽然传说需要更多的工作:

p <- ggplot(d, aes(x=x, y=y, color = z)) + geom_point(size = 5)

p + scale_color_gradient2(
  low = 'green', high = 'red', mid = 'grey80', na.value = 'blue', limits= c(-10, 10)
)

你可以欺骗一些额外的传奇故事,例如:

ggplot(d, aes(x=x, y=y, color = z, alpha = '>10')) + 
  geom_point(size = 5) +
  scale_color_gradient2(
    low = 'green', high = 'red', mid = 'grey80', na.value = 'blue', limits= c(-10, 10),
    guide = guide_colorbar(title.position = 'left')
  ) +
  scale_alpha_manual(
    values = 1, name = 'z', 
    guide = guide_legend(
      override.aes = list(color = 'blue'), title.position = 'left', 
      title.theme = element_text(color = 'white', angle = 0)
    )
  ) +
  theme(legend.margin = margin(-5, 10, -5, 10))

enter image description here

请注意,红色/绿色托盘不利于颜色受损。

答案 1 :(得分:1)

根据Axeman的回答,我提出了以下轻微的黑客攻击,让蓝调进入你的色阶:

首先,为范围内的值定义20种颜色的颜色映射,为范围外的值定义5种颜色映射。

cmap <- colorRampPalette(c("green","grey80","red"))(20)
cmap <- append(cmap,rep("blue",5))

然后将z值切换为-10到10之间的20个块并转换为数字(对于大于10的值,得到NA值)。通过在scale_color_gradientn中指定cmap和[1,25]的限制,我们将-10到1(绿色)和10到20(红色)的值映射。最后,通过指定中断,我们手动添加正确的标签(即第5类对应于-6和-5之间的值)。

ggplot(d, aes(x=x, y=y, color=as.numeric(cut(z, breaks=seq(-10,10))))) +
  geom_point(size=3) +
  scale_color_gradientn(colors=cmap, limits=c(1,25), breaks=c(5,11,17,23),
                        labels=c(-6,0,6,">10"), name="z", na.value = "blue")

Lovely result :)

唯一的问题是你必须确保没有任何值会低于-10,因为使用这种方法它们也会以蓝色显示。