将 axis.text 标签与 ggplot 中数据框变量中包含的颜色匹配
Matching axis.text labels to colors contained in data frame variable in ggplot
我想创建一个堆积条形图,其中我的 axis.text
从数据框中的变量中获取它的颜色值,该变量还提供条形的 fill
颜色。这非常重要,因为最终视觉效果的消费者将查看一系列这些条形图,因此我需要确保每种产品类型的颜色一致,即使数量值(以及顺序)会有所不同。下面是我能得到的最接近的。
# My data sample
df <- data.frame(x=1:4, Type = c("Metals", "Foodstuff", "Textiles", "Machinery"), myColour = c('blue', 'red', 'green', 'orange'), Amount = c(75, 50, 25, 5))
# Create factor to order by amount value
df$Type <- factor(df$Type, levels = df[order(df$Amount), "Type"])
# MAKE BAR
gg1 <- ggplot(df, aes(Type, Amount, fill = Type, color = myColour)) +
geom_bar(stat = 'identity', position = 'dodge', show.legend = FALSE, width = .85, colour = 'lightgrey', fill = df$myColour) +
#ggtitle("Exports Profile (%)") +
labs(x = NULL, y = NULL) +
scale_y_continuous(breaks = waiver(), limits = c(0,100)) +
theme(#plot.title = element_text(family= 'sans', color = 'black', size = 28),
#axis.title = element_text(family= 'sans', color = 'black', size = 24),
axis.text.y = element_text(colour = df$myColour, size = 18, face = 'bold'),
axis.ticks.y = element_blank(),
axis.text.x = element_text(colour = 'black', size = 16),
axis.ticks.x = element_line(colour = 'grey60'),
axis.ticks.length = unit(3, "mm"),
axis.line = element_line(NULL),
plot.background = element_rect(fill = NULL),
panel.background = element_rect(fill = 'white', colour = 'white'),
panel.grid.major.x = element_line(colour = 'grey60', linetype = 'dashed'),
panel.grid.major.y = element_line(colour = 'grey60', linetype = 'dashed'),
#panel.margin = unit(c(0,0,0,0), "mm"),
aspect.ratio = (600/450)) +
coord_flip()
gg1
产生:
您的因子水平与因子顺序的变化不一致。
请注意,我对您的 df
进行了更改,因此它在重新排序时确实发生了变化,更改在 Amount
列中。
df <- data.frame(x=1:4, Type = c("Metals", "Foodstuff", "Textiles", "Machinery"),
myColour = c('blue', 'red', 'green', 'orange'), Amount = c(50, 75, 25, 5))
帮自己一个忙,加载 tidyverse
library(tidyverse)
然后使用theme_set
theme_set(theme_classic()+
theme(panel.grid.major.x = element_line(colour = 'grey60', linetype = 'dashed'),
panel.grid.major.y = element_line(colour = 'grey60', linetype = 'dashed'),
axis.ticks.y = element_blank(),
axis.text.x = element_text(colour = 'black', size = 16),
axis.ticks.x = element_line(colour = 'grey60'),
axis.ticks.length = unit(3, "mm"),
aspect.ratio = (600/450),
axis.title.x=element_blank(),
axis.title.y=element_blank()))
然后您可以 'hack' 重新调整因素(可能不是最好的方法,但可以做到)。
df %>% arrange(Amount) %>%
mutate(myColour = factor(myColour, myColour),
Type = factor(Type, Type)) -> df1
然后更容易提取颜色级别作为绘图矢量。
mycols <- as.vector(levels(df1$myColour))
然后剧情
ggplot(df1, aes(Type, Amount, color = myColour, fill = myColour)) +
geom_bar(stat = 'identity', position = 'dodge', show.legend = FALSE, width = .85) +
theme(axis.text.y = element_text(colour = mycols, size = 18, face = 'bold')) +
coord_flip() +
scale_fill_manual(values = mycols) +
scale_color_manual(values = mycols)
希望对你有用。
这是无效的原始编辑,因此可以忽略:在代码中的两个实例中将 df$myColour
更改为 myColour
。
有了那么多主题调整,您真的应该考虑使用 theme_set
。
我想创建一个堆积条形图,其中我的 axis.text
从数据框中的变量中获取它的颜色值,该变量还提供条形的 fill
颜色。这非常重要,因为最终视觉效果的消费者将查看一系列这些条形图,因此我需要确保每种产品类型的颜色一致,即使数量值(以及顺序)会有所不同。下面是我能得到的最接近的。
# My data sample
df <- data.frame(x=1:4, Type = c("Metals", "Foodstuff", "Textiles", "Machinery"), myColour = c('blue', 'red', 'green', 'orange'), Amount = c(75, 50, 25, 5))
# Create factor to order by amount value
df$Type <- factor(df$Type, levels = df[order(df$Amount), "Type"])
# MAKE BAR
gg1 <- ggplot(df, aes(Type, Amount, fill = Type, color = myColour)) +
geom_bar(stat = 'identity', position = 'dodge', show.legend = FALSE, width = .85, colour = 'lightgrey', fill = df$myColour) +
#ggtitle("Exports Profile (%)") +
labs(x = NULL, y = NULL) +
scale_y_continuous(breaks = waiver(), limits = c(0,100)) +
theme(#plot.title = element_text(family= 'sans', color = 'black', size = 28),
#axis.title = element_text(family= 'sans', color = 'black', size = 24),
axis.text.y = element_text(colour = df$myColour, size = 18, face = 'bold'),
axis.ticks.y = element_blank(),
axis.text.x = element_text(colour = 'black', size = 16),
axis.ticks.x = element_line(colour = 'grey60'),
axis.ticks.length = unit(3, "mm"),
axis.line = element_line(NULL),
plot.background = element_rect(fill = NULL),
panel.background = element_rect(fill = 'white', colour = 'white'),
panel.grid.major.x = element_line(colour = 'grey60', linetype = 'dashed'),
panel.grid.major.y = element_line(colour = 'grey60', linetype = 'dashed'),
#panel.margin = unit(c(0,0,0,0), "mm"),
aspect.ratio = (600/450)) +
coord_flip()
gg1
产生:
您的因子水平与因子顺序的变化不一致。
请注意,我对您的 df
进行了更改,因此它在重新排序时确实发生了变化,更改在 Amount
列中。
df <- data.frame(x=1:4, Type = c("Metals", "Foodstuff", "Textiles", "Machinery"),
myColour = c('blue', 'red', 'green', 'orange'), Amount = c(50, 75, 25, 5))
帮自己一个忙,加载 tidyverse
library(tidyverse)
然后使用theme_set
theme_set(theme_classic()+
theme(panel.grid.major.x = element_line(colour = 'grey60', linetype = 'dashed'),
panel.grid.major.y = element_line(colour = 'grey60', linetype = 'dashed'),
axis.ticks.y = element_blank(),
axis.text.x = element_text(colour = 'black', size = 16),
axis.ticks.x = element_line(colour = 'grey60'),
axis.ticks.length = unit(3, "mm"),
aspect.ratio = (600/450),
axis.title.x=element_blank(),
axis.title.y=element_blank()))
然后您可以 'hack' 重新调整因素(可能不是最好的方法,但可以做到)。
df %>% arrange(Amount) %>%
mutate(myColour = factor(myColour, myColour),
Type = factor(Type, Type)) -> df1
然后更容易提取颜色级别作为绘图矢量。
mycols <- as.vector(levels(df1$myColour))
然后剧情
ggplot(df1, aes(Type, Amount, color = myColour, fill = myColour)) +
geom_bar(stat = 'identity', position = 'dodge', show.legend = FALSE, width = .85) +
theme(axis.text.y = element_text(colour = mycols, size = 18, face = 'bold')) +
coord_flip() +
scale_fill_manual(values = mycols) +
scale_color_manual(values = mycols)
希望对你有用。
这是无效的原始编辑,因此可以忽略:在代码中的两个实例中将 df$myColour
更改为 myColour
。
有了那么多主题调整,您真的应该考虑使用 theme_set
。