【问题标题】:R how to specify custom color gradients with breakpointsR如何使用断点指定自定义颜色渐变
【发布时间】:2021-10-13 14:40:50
【问题描述】:

我正在尝试在 R 中创建一个自定义渐变比例,它将根据值改变颜色。

基本上:

对于介于150 之间的值,我希望填充颜色为darkblueblue 之间的渐变。

对于介于50100 之间的值,我希望填充颜色为lightblueyellow 之间的渐变。

等等……

我已经尝试了下面的代码,但这显然是错误的方法:

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=''))

结果:https://www.youtube.com/watch?v=HZcnhUr6ghw

【问题讨论】:

    标签: r ggplot2 usmap


    【解决方案1】:

    您可以使用比例尺的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)作为浅蓝色中断。

    【讨论】:

    • 非常感谢您的回复。我正在尝试弄清楚如何将数据集中的值传递到色标中。
    • 我的问题是我正在使用一堆图来创建动画,并且我不希望渐变比例任意向上移动。无论比例有多高,我都希望颜色保持不变。
    • 修复限制(而不是让 ggplot2 动态确定它们)也应该适合。
    • 我不太确定如何解决这些限制。我也使用休息时间吗?
    • 您也可以手动设置它们,然后在limits 参数和rescale(..., from = limits) 位中使用手动限制。
    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2021-06-27
    • 2010-12-22
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    相关资源
    最近更新 更多