堆积的条形图与每个酒吧的颜色渐变

时间:2018-04-13 13:32:45

标签: r ggplot2 colors color-scheme

我想为堆叠的条形图着色,以便每个条形图都有自己的父颜色,每个条形图中的颜色都是此父颜色的渐变。

示例:

这是一个最小的例子。我希望每个条形的颜色对于color是不同的,每个条形内的渐变由“清晰度”设置。

library(ggplot2)

ggplot(diamonds, aes(color)) + 
  geom_bar(aes(fill = clarity), colour = "grey")

enter image description here

在我真正的问题中,我每组都有很多组:需要18种不同的条形图,有39种不同的渐变颜色。

2 个答案:

答案 0 :(得分:6)

我创建了一个函数ColourPalleteMulti,它允许您根据数据中的子组创建多个颜色托盘:

ColourPalleteMulti <- function(df, group, subgroup){

  # Find how many colour categories to create and the number of colours in each
  categories <- aggregate(as.formula(paste(subgroup, group, sep="~" )), df, function(x) length(unique(x)))
  category.start <- (scales::hue_pal(l = 100)(nrow(categories))) # Set the top of the colour pallete
  category.end  <- (scales::hue_pal(l = 40)(nrow(categories))) # set the bottom

  # Build Colour pallette
  colours <- unlist(lapply(1:nrow(categories),
                          function(i){
                            colorRampPalette(colors = c(category.start[i], category.end[i]))(categories[i,2])}))
  return(colours)
}

基本上,该功能可识别您拥有的不同组数,然后计算每组中的颜色数。然后它将所有不同的调色板连接在一起。

要使用调色板,最简单的方法是添加一个新列group,它将用于制作调色板的两个值粘贴在一起:

library(ggplot2)

# Create data
df <- diamonds
df$group <- paste0(df$color, "-", df$clarity, sep = "")

# Build the colour pallete
colours <-ColourPalleteMulti(df, "color", "clarity")

# Plot resultss
ggplot(df, aes(color)) + 
  geom_bar(aes(fill = group), colour = "grey") +
  scale_fill_manual("Subject", values=colours, guide = "none")

enter image description here

修改

如果您希望每个条形图中的颜色不同,您只需更改用于绘制条形图的变量的方式:

# Plot resultss
ggplot(df, aes(cut)) + 
  geom_bar(aes(fill = group), colour = "grey") +
  scale_fill_manual("Subject", values=colours, guide = "none")

enter image description here

  

谨慎提示:老实说,您想要绘制的数据集可能包含太多子类别,因此无法使用。

     

此外,虽然这在视觉上非常令人愉悦,但我建议避免使用这样的色标。它更多的是让情节看起来很漂亮,不同的颜色是多余的,因为我们已经知道数据来自X轴的哪个组。

答案 1 :(得分:2)

实现颜色渐变的更简单方法是使用alpha来更改颜色的透明度。但是,这可能会产生意想不到的后果,因为透明度意味着您可以通过图表查看指南。

library(ggplot2)

ggplot(diamonds, aes(color, alpha = clarity)) + 
  geom_bar(aes(fill = color), colour = "grey") +
  scale_alpha_discrete(range = c(0,1))

enter image description here