我试图创建一个图,在其中我可以自定义颜色渐变,使其在特定阈值下具有精确的颜色,并且我想定义阈值之间的颜色过渡/渐变。
例如,假设我想在Map上绘制一种疾病的流行率,
- 上一页= 0 -->黑色
- 0 <= prev < 1 -->从黑色到紫色的快速过渡,紫色介于两者之间,然后从紫色快速过渡到深蓝色。
- 1 <= prev < 10 -->从深蓝色到蓝色的快速过渡,蓝色介于两者之间,然后从蓝色到绿色的快速过渡。
- 10 <= prev < 50 -->从绿色快速过渡到黄色,黄色过渡到介于两者之间的橙子,然后从橙子快速过渡到红色。
- prev >= 50 -->从红色到暗红色的过渡。
我的解决方案是定义一个长度为101的颜色rap,并定义每个间隔以近似所需的颜色值。
下面是我的方法。有人能提出更好的方法吗?
library(tidyverse)
library(terra) # map.pal
library(grid)
library(scales)
library(viridis)
library(RColorBrewer)
ggplot(
data =
tibble(
x = seq(0,1, length.out = 500),
y = 0
),
mapping = aes(x = x, y = y, color = x)
) +
geom_line(linewidth = 150) +
scale_color_gradientn(
colours =
c(
"black", "#22002A", # 0 to 1
colorRampPalette(map.pal("viridis")[c(1, 8)])(5), # 1 to 6
colorRampPalette(c(map.pal("viridis")[c(9, 18)]))(2), # 6 to 8
colorRampPalette(c(map.pal("viridis")[c(19, 48)]))(2),# 8 to 10
colorRampPalette(
c(map.pal("viridis")[49],
map.pal("haxby")[37],
"darkorange",
"red"))(55), # 10 to 50
colorRampPalette(c("red", "darkred"))(32), # 50 to 99
rep("white", 1) # 100
),
limits = c(0,1),
breaks = c(0.1, 0.5),
labels = c(0.1, 0.5),
name = "Prevalence"
) +
geom_vline(xintercept = 0.01) +
geom_vline(xintercept = 0.1) +
geom_vline(xintercept = 0.5) +
theme(
axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
axis.title.y = element_blank()
) +
ylim(c(-0.012, 0.012))
字符串
正如你在下面看到的,我很接近了,但是(1)不准确,(2)这个过程非常繁琐。
x1c 0d1x的数据
如果可以的话,请分享替代的、更准确的方法。
1条答案
按热度按时间b09cbbtk1#
你让这个过程变得比实际需要的更复杂。你不需要使用
scale_gradientn
来创建色带-它已经创建了一个色带。你所需要做的就是根据你的规范指定颜色和你希望它们改变的值:字符串
唯一的复杂之处是你需要将transitions扩展到
c(0, 1)
范围:型
现在您有了一个色标,通过使用
colors
和values
参数,它可以根据需要Map到0-100范围内型
x1c 0d1x的数据
如果您希望颜色之间有更多或更少的突然变化,可以调整上述代码中过渡的值。
我们可以看到这在类似于Map的设置中是什么样子的。我们希望平滑变化的场最终看起来像一个等高线图:
型
的