始终在 R 中使用相同的填充颜色 barplot ggplot2

Always use the same fill colors barplot ggplot2 in R

对于不同的产品,我尝试使用 R 中的 ggplot 在堆叠条形图中绘制每个销售渠道的销售额。我将产品绘制在 x 轴上,将数量绘制在 y 轴上。填充是通道。

我的代码如下所示:

ggplot(df, aes(x=products, y=sales, fill=channel)) + geom_bar(stat = "identity")

共有 4 种不同的销售渠道(网站、电子邮件、街头销售、直接消息)。我面临的问题是,对于不同的产品,使用不同的绘图颜色,因为并非所有产品都使用每个销售渠道进行销售。重要的是要知道我想在单独的图中绘制每个产品。例如,product1 已使用所有四个销售渠道,因此将在堆叠条形图中使用四种不同的颜色。然而,product2 只使用了三个销售渠道(网站、电子邮件和街头销售),因此将在堆叠条形图中使用三种不同的颜色。因此,对于使用四个通道的产品的绘图,R 对产品使用不同的颜色。

有没有一种方法,无论产品使用多少个销售渠道,我都可以始终使用相同的颜色?

编辑:我按照要求添加了代码,见下文:

products <- c("product1","product1","product1","product1","product1","product1","product1",
          "product2","product2","product2","product2","product2","product2",
          "product3","product3","product3","product3","product3","product3","product3",
          "product4","product4","product4","product4","product4","product4","product4","product4")

sales <- c(5,12,14,21,8,9,11,2,5,6,8,19,21,13,14,5,22,19,17,13,12,10,8,6,9,11,15,16)
saleschannel <- c("website","website","website","email","street sales","direct message","direct message",
              "website","website","email","email","street sales","street sales",
              "website","website","email","email","street sales","street sales","direct message",
              "website","website","email","email","street sales","street sales","direct message","direct message")

df <- data.frame(products, sales, saleschannel)
df_1 <- subset(df, products=="product1")
df_2 <- subset(df, products=="product2")

plot_product1 <- ggplot(df_1, aes(x=products, y=sales, fill=saleschannel)) +  geom_bar(stat = "identity")

plot_product2 <- ggplot(df_2, aes(x=products, y=sales, fill=saleschannel)) +  geom_bar(stat = "identity")

library(cowplot)
plot_grid(plot_product1, plot_product2)

这让我得到以下情节:

您可以使用 scale_fill_manual(values = ...),以及每个销售渠道的预设颜色。

首先,您需要获得颜色的明确名称。您可以使用您喜欢的任何其他颜色,例如包 RColorBrewer 有一些选项。在这里,我使用 ggplot2 默认值,如 this SO answer:

所示
# n: number of colors to generate
gg_color_hue <- function(n) {
  hues = seq(15, 375, length = n + 1)
  hcl(h = hues, l = 65, c = 100)[1:n]
}

接下来,通过创建命名字符串向量为每个销售渠道定义颜色,其中名称是 saleschannel 级别,值是颜色:

s = unique(saleschannel)
cols = setNames(gg_color_hue(length(s)), s)
cols
##       website          email   street sales direct message 
##     "#F8766D"      "#7CAE00"      "#00BFC4"      "#C77CFF" 

为您的绘图添加明确的色标。在您的情况下,选择的美学是 fill,因此您需要 scale_fill_manual。您还可以将 + scale_fill_manual(...) 添加到 plot_productX:

定义的末尾
plot_product1 <- plot_product1 + scale_fill_manual(values = cols)
plot_product2 <- plot_product2 + scale_fill_manual(values = cols)

然后使用 plot_grid(替代方案是 gridExtra::grid.arrange),如您的问题

你能试试这个代码吗:

library(dplyr)
df1<-df%>%filter(products %in% c( "product1" ,"product2")) 

ggplot(df1,aes(x=products,y=sales,fill=saleschannel))+geom_bar(stat="identity")