facet_grid 使用 ggplot2 显示百分比组成
facet_grid showing composition in percent with ggplot2
我正在尝试获取我的数据框的分面网格。
目的是总结每个个体 (n=24) 每个进化枝(A、B、C、D、E、F)的组成(以百分比表示)。
而且每个进化枝的总和不是100%,但最终确实接近了。
None 的人得到了进化枝 B 或进化枝 F。
这是我的 R 脚本:
library(scales)
library(reshape)
library(ggplot2)
#Add an id variable for the filled regions
X_clade$ind <- factor(X_clade$ind)
X_clade$days <- factor(X_clade$days)
X_clade$temperature <- factor(X_clade$temperature)
X_clade$D <- NULL
Clade <- c(X_clade$A, X_clade$B, X_clade$C, X_clade$E, X_clade$F)
Abundance= 100*cumsum(Clade)/sum(Clade)
str(X_clade)
Abundance
hist(Clade$A)
#subset
file.29<-X_clade[(X_clade$days == 29),]
file.65<-X_clade[(X_clade$days == 65),]
file.53<-X_clade[(X_clade$days == 53),]
#install.packages("wesanderson")
library(wesanderson)
plot_bar(X_clade)
file.29$B <- NULL
file.29$F <- NULL
seq(0.1,1,by=0.1)
p1<-ggplot(file.29,aes(x = ind, y=Abundance,fill = Clade)) +
geom_bar(position = "fill",stat = "identity") +
scale_y_continuous(labels = percent_format()) +
theme(panel.background = element_blank(),
panel.border=element_rect(fill=NA),
panel.grid.minor = element_blank(),
axis.text.x=element_text(colour="black",size=11),
axis.text.y=element_text(colour="black",size=11),
axis.title =element_blank()) + guides(fill=FALSE) +
facet_grid(days~temperature,scales="free_x")
p1
p_1M=ggplot(file.29,aes(x = ind, y=Abundance,fill = Clade))
p_1M
p2<-ggplot(file.53,aes(x = ind, y=Abundance,fill = Clade)) +
geom_bar(position = "fill",stat = "identity") +
scale_y_continuous(labels = percent_format()) +
theme(panel.background = element_blank(),
panel.border=element_rect(fill=NA),
panel.grid.minor = element_blank(),
strip.text.x = element_blank(),
axis.text.x=element_text(colour="black",size=11),
axis.text.y=element_text(colour="black",size=11),
axis.title =element_blank()) +guides(fill=FALSE) +
facet_grid(days~temperature,scales="free_x")
p2
p3<-ggplot(file.65,aes(x = ind, y=Abundance,fill = Clade)) +
geom_bar(position = "fill",stat = "identity") +
scale_y_continuous(labels = percent_format()) +
theme(panel.background = element_blank(),
panel.border=element_rect(fill=NA),
panel.grid.minor = element_blank(),
strip.text.x = element_blank(),
axis.text.x=element_text(colour="black",size=11),
axis.text.y=element_text(colour="black",size=11),
axis.title =element_blank()) + guides(fill=FALSE) +
facet_grid(days~temperature,scales="free_x")
p3
library(gridExtra)
grid.arrange(p1, p2, p3, nrow=3)
但对于每个图 (p1、p2、p3),我都收到相同的错误消息:错误:美学必须为长度 1 或与数据 (8) 相同:x、y、填充。
任何关于如何解决这个问题的见解都会很可爱!我确信我离它不远了。
但是,一路卡住了!
全力以赴
主场
一种解决方案是使用 facet_wrap
关闭条带标签并使用 inkscape 或 photoshop 添加所需的标签来绘制数据。
library(tidyverse)
d %>%
gather(k, v, -days, -ind, -temperature) %>%
ggplot(aes(x = factor(ind), y=v, fill = k)) +
geom_col() +
scale_y_continuous(labels = function(x) paste0(x, "%")) +
facet_wrap(~temperature + days, scales="free_x", dir = "v", ncol=2) +
theme(strip.text = element_blank(),
legend.position = "bottom")
或者试试这个
p1 <- d %>%
gather(k, v, -days, -ind, -temperature) %>%
filter(days == 29) %>%
ggplot(aes(x = factor(ind), y=v, fill = k)) +
geom_col() +
scale_y_continuous(labels = function(x) paste0(x, "%")) +
facet_grid(days~temperature, scales="free_x")+
xlab("") +
theme(legend.position = "none")
p2 <- d %>%
gather(k, v, -days, -ind, -temperature) %>%
filter(days == 53) %>%
ggplot(aes(x = factor(ind), y=v, fill = k)) +
geom_col() +
scale_y_continuous(labels = function(x) paste0(x, "%")) +
facet_grid(days~temperature, scales="free_x")+
xlab("") +
theme(strip.text.x = element_blank(),
legend.position = "none")
p3 <- d %>%
gather(k, v, -days, -ind, -temperature) %>%
filter(days == 65) %>%
ggplot(aes(x = factor(ind), y=v, fill = k)) +
geom_col() +
scale_y_continuous(labels = function(x) paste0(x, "%")) +
facet_grid(days~temperature, scales="free_x")+
theme(strip.text.x = element_blank(),
legend.position = "none")
p4 <- d %>%
gather(k, v, -days, -ind, -temperature) %>%
ggplot(aes(x = factor(ind), y=v, fill = k)) +
geom_col() +
theme_void()
library(cowplot)
cowplot::plot_grid(plot_grid(p1, p2, p3, ncol = 1), get_legend(p4), rel_widths = c(0.9,0.1))
这里有一个版本,结合了purrr
和cowplot
来制作一个地块列表并将它们排列在一起。我通过拆分 temperature
上的数据来模仿 facet_grid
,使用 facet_wrap
制作单独的图列。使用 imap
,我得到了每个拆分数据框的名称——温度——并将其用于标题。然后我做了一些稍微有点棘手的事情来提取图例,从两个图中删除图例,使左侧图上的条形文本不可见,并将它们全部并排绘制。
library(tidyverse)
df2 <- df %>%
mutate_at(vars(days, temperature, ind), as.factor) %>%
gather(key = group, value = value, -ind, -days, -temperature) %>%
mutate(value = value / 100)
plots <- df2 %>%
split(.$temperature) %>%
imap(function(dat, temp) {
ggplot(dat, aes(x = ind, y = value, fill = group)) +
geom_col() +
scale_y_continuous(labels = scales::percent) +
scale_fill_discrete(drop = T) +
labs(x = NULL, y = NULL) +
facet_wrap(~ days, ncol = 1, scales = "free_x", strip.position = "right") +
theme_minimal() +
theme(strip.text.y = element_text(angle = 0, face = "italic"),
plot.title = element_text(hjust = 0.5, face = "italic")) +
ggtitle(paste0(temp, "°C"))
})
例如,图表的第一列如下所示:
plots[[1]]
我将第一列的条形文本设为白色以匹配条形背景,因为我希望它仍然占用一些 space(因此列仍具有相同的宽度)但不可见.
legend <- cowplot::get_legend(plots[[1]])
no_legends <- plots %>% map(~. + theme(legend.position = "none"))
no_legends[[1]] <- no_legends[[1]] + theme(strip.text = element_text(color = "white"))
使用 cowplot
并遵循 one of its vignettes,我制作了两个没有图例的地块的一个网格,以及第一个网格加上图例的第二个网格,并调整相对宽度以很好地适应.您可以从这里进行很多间距和调整。
two_plots <- cowplot::plot_grid(plotlist = no_legends)
cowplot::plot_grid(two_plots, legend, rel_widths = c(2, 0.25))
由 reprex package (v0.2.0) 创建于 2018-05-25。
我正在尝试获取我的数据框的分面网格。
目的是总结每个个体 (n=24) 每个进化枝(A、B、C、D、E、F)的组成(以百分比表示)。
而且每个进化枝的总和不是100%,但最终确实接近了。 None 的人得到了进化枝 B 或进化枝 F。
这是我的 R 脚本:
library(scales)
library(reshape)
library(ggplot2)
#Add an id variable for the filled regions
X_clade$ind <- factor(X_clade$ind)
X_clade$days <- factor(X_clade$days)
X_clade$temperature <- factor(X_clade$temperature)
X_clade$D <- NULL
Clade <- c(X_clade$A, X_clade$B, X_clade$C, X_clade$E, X_clade$F)
Abundance= 100*cumsum(Clade)/sum(Clade)
str(X_clade)
Abundance
hist(Clade$A)
#subset
file.29<-X_clade[(X_clade$days == 29),]
file.65<-X_clade[(X_clade$days == 65),]
file.53<-X_clade[(X_clade$days == 53),]
#install.packages("wesanderson")
library(wesanderson)
plot_bar(X_clade)
file.29$B <- NULL
file.29$F <- NULL
seq(0.1,1,by=0.1)
p1<-ggplot(file.29,aes(x = ind, y=Abundance,fill = Clade)) +
geom_bar(position = "fill",stat = "identity") +
scale_y_continuous(labels = percent_format()) +
theme(panel.background = element_blank(),
panel.border=element_rect(fill=NA),
panel.grid.minor = element_blank(),
axis.text.x=element_text(colour="black",size=11),
axis.text.y=element_text(colour="black",size=11),
axis.title =element_blank()) + guides(fill=FALSE) +
facet_grid(days~temperature,scales="free_x")
p1
p_1M=ggplot(file.29,aes(x = ind, y=Abundance,fill = Clade))
p_1M
p2<-ggplot(file.53,aes(x = ind, y=Abundance,fill = Clade)) +
geom_bar(position = "fill",stat = "identity") +
scale_y_continuous(labels = percent_format()) +
theme(panel.background = element_blank(),
panel.border=element_rect(fill=NA),
panel.grid.minor = element_blank(),
strip.text.x = element_blank(),
axis.text.x=element_text(colour="black",size=11),
axis.text.y=element_text(colour="black",size=11),
axis.title =element_blank()) +guides(fill=FALSE) +
facet_grid(days~temperature,scales="free_x")
p2
p3<-ggplot(file.65,aes(x = ind, y=Abundance,fill = Clade)) +
geom_bar(position = "fill",stat = "identity") +
scale_y_continuous(labels = percent_format()) +
theme(panel.background = element_blank(),
panel.border=element_rect(fill=NA),
panel.grid.minor = element_blank(),
strip.text.x = element_blank(),
axis.text.x=element_text(colour="black",size=11),
axis.text.y=element_text(colour="black",size=11),
axis.title =element_blank()) + guides(fill=FALSE) +
facet_grid(days~temperature,scales="free_x")
p3
library(gridExtra)
grid.arrange(p1, p2, p3, nrow=3)
但对于每个图 (p1、p2、p3),我都收到相同的错误消息:错误:美学必须为长度 1 或与数据 (8) 相同:x、y、填充。
任何关于如何解决这个问题的见解都会很可爱!我确信我离它不远了。 但是,一路卡住了!
全力以赴
主场
一种解决方案是使用 facet_wrap
关闭条带标签并使用 inkscape 或 photoshop 添加所需的标签来绘制数据。
library(tidyverse)
d %>%
gather(k, v, -days, -ind, -temperature) %>%
ggplot(aes(x = factor(ind), y=v, fill = k)) +
geom_col() +
scale_y_continuous(labels = function(x) paste0(x, "%")) +
facet_wrap(~temperature + days, scales="free_x", dir = "v", ncol=2) +
theme(strip.text = element_blank(),
legend.position = "bottom")
或者试试这个
p1 <- d %>%
gather(k, v, -days, -ind, -temperature) %>%
filter(days == 29) %>%
ggplot(aes(x = factor(ind), y=v, fill = k)) +
geom_col() +
scale_y_continuous(labels = function(x) paste0(x, "%")) +
facet_grid(days~temperature, scales="free_x")+
xlab("") +
theme(legend.position = "none")
p2 <- d %>%
gather(k, v, -days, -ind, -temperature) %>%
filter(days == 53) %>%
ggplot(aes(x = factor(ind), y=v, fill = k)) +
geom_col() +
scale_y_continuous(labels = function(x) paste0(x, "%")) +
facet_grid(days~temperature, scales="free_x")+
xlab("") +
theme(strip.text.x = element_blank(),
legend.position = "none")
p3 <- d %>%
gather(k, v, -days, -ind, -temperature) %>%
filter(days == 65) %>%
ggplot(aes(x = factor(ind), y=v, fill = k)) +
geom_col() +
scale_y_continuous(labels = function(x) paste0(x, "%")) +
facet_grid(days~temperature, scales="free_x")+
theme(strip.text.x = element_blank(),
legend.position = "none")
p4 <- d %>%
gather(k, v, -days, -ind, -temperature) %>%
ggplot(aes(x = factor(ind), y=v, fill = k)) +
geom_col() +
theme_void()
library(cowplot)
cowplot::plot_grid(plot_grid(p1, p2, p3, ncol = 1), get_legend(p4), rel_widths = c(0.9,0.1))
这里有一个版本,结合了purrr
和cowplot
来制作一个地块列表并将它们排列在一起。我通过拆分 temperature
上的数据来模仿 facet_grid
,使用 facet_wrap
制作单独的图列。使用 imap
,我得到了每个拆分数据框的名称——温度——并将其用于标题。然后我做了一些稍微有点棘手的事情来提取图例,从两个图中删除图例,使左侧图上的条形文本不可见,并将它们全部并排绘制。
library(tidyverse)
df2 <- df %>%
mutate_at(vars(days, temperature, ind), as.factor) %>%
gather(key = group, value = value, -ind, -days, -temperature) %>%
mutate(value = value / 100)
plots <- df2 %>%
split(.$temperature) %>%
imap(function(dat, temp) {
ggplot(dat, aes(x = ind, y = value, fill = group)) +
geom_col() +
scale_y_continuous(labels = scales::percent) +
scale_fill_discrete(drop = T) +
labs(x = NULL, y = NULL) +
facet_wrap(~ days, ncol = 1, scales = "free_x", strip.position = "right") +
theme_minimal() +
theme(strip.text.y = element_text(angle = 0, face = "italic"),
plot.title = element_text(hjust = 0.5, face = "italic")) +
ggtitle(paste0(temp, "°C"))
})
例如,图表的第一列如下所示:
plots[[1]]
我将第一列的条形文本设为白色以匹配条形背景,因为我希望它仍然占用一些 space(因此列仍具有相同的宽度)但不可见.
legend <- cowplot::get_legend(plots[[1]])
no_legends <- plots %>% map(~. + theme(legend.position = "none"))
no_legends[[1]] <- no_legends[[1]] + theme(strip.text = element_text(color = "white"))
使用 cowplot
并遵循 one of its vignettes,我制作了两个没有图例的地块的一个网格,以及第一个网格加上图例的第二个网格,并调整相对宽度以很好地适应.您可以从这里进行很多间距和调整。
two_plots <- cowplot::plot_grid(plotlist = no_legends)
cowplot::plot_grid(two_plots, legend, rel_widths = c(2, 0.25))
由 reprex package (v0.2.0) 创建于 2018-05-25。