我想知道是否还有调整如何使用与绘制的组件不同的组件为geom_bar堆栈图形着色?
澄清说我有一个包含四个组成部分的数据框:种类,数量,日期和类型。
species count date type
1 a 20 2016-05-22 Phy
2 b 34 2016-05-22 Phy
3 c 45 2016-05-22 Phy
4 d 4 2016-05-22 Zoo
5 e 43 2016-05-22 Zoo
6 f 9 2016-05-22 Bact
7 g 19 2016-05-22 Bact
8 h 32 2016-05-22 Bact
9 a 16 2016-05-23 Phy
10 b 0 2016-05-23 Phy
11 c 0 2016-05-23 Phy
12 d 2 2016-05-23 Zoo
13 e 42 2016-05-23 Zoo
14 f 23 2016-05-23 Bact
15 g 22 2016-05-23 Bact
16 h 21 2016-05-23 Bact
所以我的问题是我想在ggplot中绘制堆积条:
ggplot(df, aes(x = date, y=count, group = species, fill = Species)) +
geom_bar(stat = "identity")
但是,我希望条形的颜色由"类型"确定,每种类型都有自己的颜色标度。如果物种a-c都在" Phy"例如,物种a,b和c将是不同的蓝色。
任何帮助都将不胜感激。
谢谢! →
答案 0 :(得分:2)
这是一种解决方案,按类型重新排序物种因子,然后将不同的调色板拼接在一起。如果您不喜欢生成的特定颜色,请选择不同的调色板。
library(forcats)
library(tidyverse)
library(scales)
# Reorder the levels of the species factor by type
df = df %>%
mutate(species = fct_reorder(species, as.numeric(type)))
unique_df = df %>% distinct(type, species)
type_counts = table(unique_df$type)
colours = character(0)
# Need to manually fill this at least up to the number of types
palettes = c("Blues", "Greens", "Reds")
for (i in 1:length(type_counts)) {
colours = c(colours, brewer_pal(palette = palettes[i])(type_counts[i]))
}
ggplot(df, aes(x = date, y=count, group = species, fill = species)) +
geom_bar(stat = "identity", colour = "black") +
scale_fill_manual(values = colours) +
theme_bw()
答案 1 :(得分:2)
这是一个根据评论主题的解决方案,使用facet作为物种的类型和颜色。在实践中,它可能不如此示例有效,具体取决于数据中有多少日期,类型和种类。
ggplot(df, aes(date, count)) +
geom_col(aes(fill = species)) +
facet_grid(. ~ type) +
scale_fill_brewer(palette = "Spectral") +
theme_light()
答案 2 :(得分:0)
此类数据更适合slopegraph。这将显示清晰的图案,这些图案在堆叠条形图中不可见。
例如,现在显而易见的是,虽然细菌种类在第1天具有异质丰度,但是处理使它们在第2天收敛到单一丰度。植物都受到处理的有害影响,一些严重但“一个“只是轻微的。这些动物几乎没有受到影响,保留了以前的社区结构。
require(dplyr)
ggplot(df, aes(date, count, group = species)) +
facet_grid(type ~ .) +
geom_line(aes(colour = type), size = 3, show.legend = F) +
geom_line() +
geom_text(data = function(x) {x %>% filter(date == min(date))},
aes(label = species), nudge_x = -.025) +
theme_bw()