r - ggplot中具有最小值和最大值的连续色标
问题描述
我想设置实现极端颜色的阈值,也就是说,给定从 color1 到 color2 的渐变和一个相应的变量z
,我想定义 valuesc_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")
显然,这并不令人满意:大部分点都是白色的,只有极点才会有颜色。我更喜欢在 -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)
我怎么能在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)
另一种选择是手动设置颜色应该出现在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))
推荐阅读
- html - 如何将图像放置在flexbox内的同一行中
- batch-file - 循环浏览包含包含空格的文件的文件夹
- javascript - 从我的 html 页面上的另一个来源的 iframe 获取 url 或 html 标记。并防止在 iframe 内单击时重定向到另一个来源
- flutter - 多个小部件对象在 Flutter 中只运行一次 initState?
- python - 熊猫根据其他行中的字符串保留某些行
- sql - 如何在一行中提取按城市和用户类型进行计数分组的数据
- c# - 从 XML 文件中读取属性
- ios - 将值从子视图页面快速传递到 Pageview 控制器
- c# - C# - Excel:删除excel中的一整行,在要删除的行的第一列具有特定值
- c# - 如何在到达控制器之前处理 C# 数据类型模型验证