设置具有不同“父”级的调色板?

时间:2019-09-15 23:20:18

标签: r leaflet r-leaflet

我正在尝试使用传单包在地图中使用看起来像这样的数据着色:

+--------+---------+-------+
| region | terrain | sales |
+--------+---------+-------+
|      1 | 1A      |   253 |
|      1 | 1B      |   280 |
|      1 | 1C      |   360 |
|      1 | 1D      |   350 |
|      1 | 1E      |   335 |
|      1 | 1F      |   275 |
|      2 | 2A      |   200 |
|      2 | 2B      |   300 |
|      2 | 2C      |   400 |
|      2 | 2D      |   250 |
|      2 | 2E      |   350 |
+--------+---------+-------+

虽然我知道如何基于一个变量创建调色板,但我想基于每个“父”变量创建一个调色板。

因此,假设我想要1 = "Reds"2 = "Blues",但是在这两种“父”颜色内,然后我希望这些区域内的所有地形都根据销售情况进行阴影处理?

2 个答案:

答案 0 :(得分:2)

您可以使用ERROR, Could not open test.file为矢量/数据列生成特定的颜色

设置数据

library(colourvalues)

上色

## using a known / reproducible data object
df <- mapdeck::capitals

## making a 'region' column to represent your data
df$region <- ifelse( tolower( substr(df$country,1,1) ) %in% letters[1:13], 1, 2 )

## a random 'sales' column
df$sales <- rnorm(n = nrow(df) )

绘图

library(colourvalues)

## order the data first so we can simply `<- c()` the result
df <- df[with(df, order(region)), ]


region1 <- colour_values( x = df[ df$region == 1, "sales"], palette = "reds" )
region2 <- colour_values( x = df[ df$region == 2, "sales"], palette = "blues")

df$colours <- c(region1, region2)

enter image description here

答案 1 :(得分:1)

这不是显式使用leaflet,而是使用RColorBrewer(导入传单)

此功能将按给定的第一列拆分数据帧,并依次为每个第二个颜色赋予每个Pals颜色。

最后,我已将其分配给一列,但您可能想要不同地使用它。

library(RColorBrewer)
library(dplyr)
createCustomPalette <- function(df, parentCol = "region",subCol = "terrain",
                                Pals = c("Blues", "Reds", "Greens", "Greys", "Oranges", "Purples"),
                                returnDF = FALSE){
  Parents <- as.numeric(unique(df[[parentCol]]))

  ParCols <- lapply(seq_along(Parents), function(x) 
    RColorBrewer::brewer.pal(length(unique(df[df[parentCol]==Parents[x],subCol])), Pals[x]))


  Cols <- unlist(ParCols) 

  Colsdf <- data.frame(Col = Cols, sub = unlist(lapply(Parents, function(x) unique(df[df[[parentCol]]==x,][[subCol]]))),
                       stringsAsFactors = F)

  outdf <- dplyr::right_join(Colsdf,df, by = c("sub"=subCol))

  # outdf <- merge(df, Colsdf, by.x = subCol, by.y = "sub", all.x = T, sort = FALSE )

  if(returnDF){
    return(outdf) 
  }else{
    return(outdf$Col)
  }
}
mydf$Cols <- createCustomPalette(mydf)
scales::show_col(mydf$Cols)

我试图避免使用dplyr,因为我不想添加新的库,但是合并和维护行顺序(这对于获取颜色很重要)对于使用R来说很痛苦。不想使用dplyr,只需添加行号并合并然后排序即可。