【问题标题】:manually set colors per group in barplot ggplot在barplot ggplot中手动设置每组颜色
【发布时间】:2017-09-22 01:25:42
【问题描述】:

我需要为条形图中的每个组手动设置颜色。我目前有填充=时间,这目前正在确定颜色。 我们有 5 个品牌和每个品牌 2 个月的价值。我需要按品牌分组,但还需要一种方法来显示哪个条代表哪个月(时间),我目前可以这样做,但是我想为每个条组着色。例如。品牌 1 条 = 红色,品牌 2 条 = 蓝色等,同时仍有填充 = 时间

这是我的代码:

colors <- c("#98999B", "#F4C400", "#CB003D", "#6BABE5", "#E65400", "#542C82")

time <- c("February 2017","March 2017","February 2017","March 2017","February 2017","March 2017","February 2017","March 2017","February 2017","March 2017")
value <- as.numeric(c("3.08","3.64","1.61","1.81","-1.02","-1.09","-5.23","-5.08","-1.51","-1.43"))
brand <- c("brand1","brand1","brand2","brand2","brand3","brand3","brand4","brand4","brand5","brand5")

Monthly_BMS_df <- as.data.table(cbind(time,value,brand))

bar <- ggplot(Monthly_BMS_df, aes(brand, value, fill = time)) + 
  geom_bar(stat="identity", position = "dodge") +
 theme(legend.position='none') + scale_fill_manual(values=colors)

ggplotly(bar, width=1000,height=350)

【问题讨论】:

    标签: r ggplot2 plotly


    【解决方案1】:

    一种选择是创建一个hcl 调色板,每个brand 具有不同的色调,并且不同品牌的每个月具有相同的连续亮度。例如:

    library(ggplot2)
    library(data.table)
    library(plotly)
    
    Monthly_BMS_df <- data.table(time, value, brand)
    

    创建调色板:

    nb = length(unique(Monthly_BMS_df$brand))
    nm = length(unique(Monthly_BMS_df$time))
    
    colors = apply(expand.grid(seq(70,40,length=nm), 100, seq(15,375,length=nb+1)[1:nb]), 1, 
                   function(x) hcl(x[3],x[2],x[1]))
    

    在下面的代码中,我们使用fill=interaction(time, brand) 将不同的颜色映射到品牌和月份的每个组合。然后scale_fill_manual 分配我们在上面创建的调色板。每个月的亮度都会降低,因此三月比二月更暗。

    bar <- ggplot(Monthly_BMS_df, aes(brand, value, fill=interaction(time, brand))) + 
      geom_hline(yintercept=0, colour="grey60") +
      geom_bar(stat="identity", position = "dodge", show.legend=FALSE) +
      scale_fill_manual(values=colors) +
      theme_classic()
    
    ggplotly(bar, width=1000, height=350) 
    

    作为上图的替代方案,折线图可能更容易比较每个品牌的趋势。

    library(dplyr)
    
    ggplot(Monthly_BMS_df, aes(time, value, group=brand, colour=brand)) + 
      geom_hline(yintercept=0, colour="grey60") +
      geom_text(data=Monthly_BMS_df %>% filter(time==min(time)),
                aes(label=brand), position=position_nudge(-0.25)) +
      geom_line(linetype="12", alpha=0.5, size=0.7) +
      geom_text(aes(label=value)) +
      guides(colour=FALSE) +
      theme_classic()
    

    【讨论】:

    • 答案看起来很有用。调色板创建的解释会让它变得更好!
    猜你喜欢
    • 2013-08-16
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多