我需要为条形图中的每个组手动设置颜色。我目前有填充=时间,这目前正在确定颜色。我们有5个品牌,每个品牌分别有2个月的价值。我需要按品牌分组,但是还需要一种显示哪个条形表示哪个月(时间)的方法,我目前可以执行此操作,但是我想为每个条形组上色。例如。brand1条=红色,brand2条=蓝色ect,同时仍有填充时间=时间
这是我的代码:
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)
Run Code Online (Sandbox Code Playgroud)
一种选择是创建一个hcl调色板,每种调色板具有不同的色调,brand并且在不同品牌之间每个月的顺序亮度相同。例如:
library(ggplot2)
library(data.table)
library(plotly)
Monthly_BMS_df <- data.table(time, value, brand)
Run Code Online (Sandbox Code Playgroud)
创建调色板:
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]))
Run Code Online (Sandbox Code Playgroud)
在下面的代码中,我们用来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)
Run Code Online (Sandbox Code Playgroud)
作为上面图解的替代方法,折线图可以使比较每个品牌的趋势变得更加容易。
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()
Run Code Online (Sandbox Code Playgroud)