我想设置达到极端颜色的阈值,也就是说,给定从 color1 到 color2 的渐变和一个相应的变量z
,我想定义值c_min
和 c_max,使得 的值z
超过的所有点c_max
都有 color2,并且所有值为z
以下的点的c_min
颜色为color1。例子:
df <- data.frame(x=rnorm(10), y=rnorm(10), z=c(-100, rnorm(8), 100))
ggplot(df, aes(x=x, y=y, col=z)) + geom_point() +
scale_color_gradient2(low="blue", mid="white", high="red")
Run Code Online (Sandbox Code Playgroud)
显然,这并不令人满意:大多数点都是白色的,只有极点才会有颜色。我更愿意跨越 -3 和 3 之间的梯度,并且这些值之外的所有内容都应该是蓝色或红色。
当然,我可以手动生成渐变并使用 scale_color_manual 来设置点的颜色:
pal <- colorRampPalette(c("blue", "white", "red"))(17)
breaks <- seq(-3, 3, length.out=16)
cols <- pal[findInterval(df$z, breaks) + 1]
plot(df$x, df$y, pch=19, col=cols)
## or, in ggplot
ggplot(df, aes(x=x, y=y, col=factor(1:nrow(df)))) +
geom_point() + scale_color_manual(values=cols)
Run Code Online (Sandbox Code Playgroud)
我怎样才能在 ggplot2 中做到这一点?最好是不手动计算梯度?
一种选择是设置比例的限制,并将任何超出限制(越界/oob 值)的东西压扁到最接近的极端:
ggplot(df, aes(x=x, y=y, col=z)) + geom_point() +
scale_color_gradient2(low="blue", mid="white", high="red",
limits = c(-3, 3), oob = scales::squish)
Run Code Online (Sandbox Code Playgroud)
另一种选择是手动设置颜色应出现的位置(在重新缩放到 [0-1] 范围后)scale_color_gradient
。"blue"
并"red"
重复以给出极端 (0, 1) 和重新缩放的 -3/3 (0.485/0.515) 那种颜色。
ggplot(df, aes(x=x, y=y, col=z)) + geom_point() +
scale_color_gradientn(colours = c("blue", "blue", "white", "red", "red"),
values = c(0, 0.485, 0.5, 0.515, 1))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2166 次 |
最近记录: |