R如何使用断点指定自定义颜色渐变
R how to specify custom color gradients with breakpoints
我正在尝试在 R 中创建一个自定义渐变比例,它将根据值改变颜色。
基本上:
对于 1
和 50
之间的值,我希望填充颜色是 darkblue
和 blue
之间的渐变。
对于 50
和 100
之间的值,我希望填充颜色是 lightblue
和 yellow
之间的渐变。
等等...
我试过下面的代码,但这显然是错误的方法:
scale_fill_gradientn(limits = c(0,50),colours=c("darkblue","blue"),na.value="#101010") +
scale_fill_gradientn(limits = c(50,100),colours=c("lightblue","yellow"),na.value="#101010") +
scale_fill_gradientn(limits = c(100,1000),colours=c("orange","orangered"),na.value="#101010") +
scale_fill_gradientn(limits = c(1000,10000),colours=c("darkred","red"),na.value="#101010") +
scale_fill_gradientn(limits = c(10000,30000),colours=c("red","#FF877D"),na.value="#101010") +
有人可以帮我吗?
编辑:
使用此代码:
scale_fill_gradientn(
limits = range(0,max(da$val)),
colours = colours[c(1, seq_along(colours), length(colours))],
values = c(0, scales::rescale(colour_breaks, from = range(0,da$val)),range(0,da$val))) +
我得到这个效果:
这与我想要的很接近,但我不太了解重新调整代码及其作用。
我希望它从蓝色开始,然后使用间断点变为红色。
很接近 - 刚从黄色开始。
编辑:
在@teunbrand 的帮助下,我成功了!
代码如下:
my_limits <- range(c(0, usa.dat[,50:ncol(usa.dat)]))
max_value <- max(usa.dat[, 50:ncol(usa.dat)])
for (i in 2:ncol(usa.dat)) {
da <- data.frame(fips=usa.dat$countyFIPS,val=usa.dat[,i])
tot <- sum(da$val)
colour_breaks <- c(0,1,100,500,1000,10000,30000)
colours <- c("#101010","blue","lightblue","yellow","red","darkred","magenta")
current_max <- max(da$val)
relative_max <- max_value / current_max
theDate <- substr(names(usa.dat)[i],2,100)
plot_usmap(regions = "counties",
data=da,
values="val"
) +
labs(title=paste("Covid-19 Deaths - ",str_replace_all(theDate,"\.","/")," - Total: ",tot,sep='')) +
scale_fill_gradientn(limits = range(0, current_max),
colours = colours,
values = scales::rescale(colour_breaks, to = c(0, relative_max), from = c(0, max_value)),
name="Deaths",na.value="#101010") +
theme(panel.background = element_rect(color = "#101010", fill = "#101010"))
ggsave(paste(sprintf("%03d",i),".png",sep=''))
您可以使用比例尺的 values
参数设置特定颜色应位于的确切点。在下面的示例中,我们希望 "darkblue"
在 10,"lightblue"
在 20,"yellow"
在 30。
唯一的问题是 values
参数适用于 0 到 1 之间的重新缩放值,因此我们应该修复限制并对中断应用相同的重新缩放。
最后,因为现在 10-30 范围之外的值未定义,所以最好在(重新缩放的)值 0 和 1 处重复极端的颜色。
library(ggplot2)
colour_breaks <- c(10, 20, 30)
colours <- c("darkblue", "lightblue", "yellow")
ggplot(mpg, aes(displ, hwy, colour = cty)) +
geom_point() +
scale_colour_gradientn(
limits = range(mpg$cty),
colours = colours[c(1, seq_along(colours), length(colours))],
values = c(0, scales::rescale(colour_breaks, from = range(mpg$cty)), 1),
)
由 reprex package (v2.0.1)
于 2021-10-13 创建
作为一个小提示:在你的描述中,不清楚 50 应该是什么颜色:在一个渐变中它应该是蓝色,在另一个中它应该是浅蓝色。充其量,您可以将其中一种颜色(比如蓝色)设置为 50,并使用 50 + 微小的偏移量(例如 .Machine$double.eps
)作为浅蓝色中断。
我正在尝试在 R 中创建一个自定义渐变比例,它将根据值改变颜色。
基本上:
对于 1
和 50
之间的值,我希望填充颜色是 darkblue
和 blue
之间的渐变。
对于 50
和 100
之间的值,我希望填充颜色是 lightblue
和 yellow
之间的渐变。
等等...
我试过下面的代码,但这显然是错误的方法:
scale_fill_gradientn(limits = c(0,50),colours=c("darkblue","blue"),na.value="#101010") +
scale_fill_gradientn(limits = c(50,100),colours=c("lightblue","yellow"),na.value="#101010") +
scale_fill_gradientn(limits = c(100,1000),colours=c("orange","orangered"),na.value="#101010") +
scale_fill_gradientn(limits = c(1000,10000),colours=c("darkred","red"),na.value="#101010") +
scale_fill_gradientn(limits = c(10000,30000),colours=c("red","#FF877D"),na.value="#101010") +
有人可以帮我吗?
编辑:
使用此代码:
scale_fill_gradientn(
limits = range(0,max(da$val)),
colours = colours[c(1, seq_along(colours), length(colours))],
values = c(0, scales::rescale(colour_breaks, from = range(0,da$val)),range(0,da$val))) +
我得到这个效果:
这与我想要的很接近,但我不太了解重新调整代码及其作用。
我希望它从蓝色开始,然后使用间断点变为红色。
很接近 - 刚从黄色开始。
编辑:
在@teunbrand 的帮助下,我成功了!
代码如下:
my_limits <- range(c(0, usa.dat[,50:ncol(usa.dat)]))
max_value <- max(usa.dat[, 50:ncol(usa.dat)])
for (i in 2:ncol(usa.dat)) {
da <- data.frame(fips=usa.dat$countyFIPS,val=usa.dat[,i])
tot <- sum(da$val)
colour_breaks <- c(0,1,100,500,1000,10000,30000)
colours <- c("#101010","blue","lightblue","yellow","red","darkred","magenta")
current_max <- max(da$val)
relative_max <- max_value / current_max
theDate <- substr(names(usa.dat)[i],2,100)
plot_usmap(regions = "counties",
data=da,
values="val"
) +
labs(title=paste("Covid-19 Deaths - ",str_replace_all(theDate,"\.","/")," - Total: ",tot,sep='')) +
scale_fill_gradientn(limits = range(0, current_max),
colours = colours,
values = scales::rescale(colour_breaks, to = c(0, relative_max), from = c(0, max_value)),
name="Deaths",na.value="#101010") +
theme(panel.background = element_rect(color = "#101010", fill = "#101010"))
ggsave(paste(sprintf("%03d",i),".png",sep=''))
您可以使用比例尺的 values
参数设置特定颜色应位于的确切点。在下面的示例中,我们希望 "darkblue"
在 10,"lightblue"
在 20,"yellow"
在 30。
唯一的问题是 values
参数适用于 0 到 1 之间的重新缩放值,因此我们应该修复限制并对中断应用相同的重新缩放。
最后,因为现在 10-30 范围之外的值未定义,所以最好在(重新缩放的)值 0 和 1 处重复极端的颜色。
library(ggplot2)
colour_breaks <- c(10, 20, 30)
colours <- c("darkblue", "lightblue", "yellow")
ggplot(mpg, aes(displ, hwy, colour = cty)) +
geom_point() +
scale_colour_gradientn(
limits = range(mpg$cty),
colours = colours[c(1, seq_along(colours), length(colours))],
values = c(0, scales::rescale(colour_breaks, from = range(mpg$cty)), 1),
)
由 reprex package (v2.0.1)
于 2021-10-13 创建作为一个小提示:在你的描述中,不清楚 50 应该是什么颜色:在一个渐变中它应该是蓝色,在另一个中它应该是浅蓝色。充其量,您可以将其中一种颜色(比如蓝色)设置为 50,并使用 50 + 微小的偏移量(例如 .Machine$double.eps
)作为浅蓝色中断。