以下是一些虚假数据x
和y
,其中包含颜色信息z
。 z
高度倾斜,因此使得颜色条无法提供信息:
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()
我想让大部分的colorbar反映出数据的主要范围,但是有一个溢出的框,比如说5.这样的东西:
有没有办法在ggplot2中执行此操作?请注意,我希望colorbar在大多数范围内保持连续,而不是离散。如果我想要的东西不可行,我可能会离婚或者编码。
答案 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))
请注意,红色/绿色托盘不利于颜色受损。
答案 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")
唯一的问题是你必须确保没有任何值会低于-10,因为使用这种方法它们也会以蓝色显示。