始终在 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")
对于不同的产品,我尝试使用 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")