Я застрял в этом вопросе в течение длительного времени.По сути, мне нужно сгенерировать столбчатые столбцы бактериальных таксонов в двумерной грани facet_grid.Это не проблема - однако мне нужно использовать 2 разных графика меток оси X.
Я смотрел на эти темы, которые помогают, но все еще не удовлетворяют:
Формировать метки оси X на facet_grid ggplot: drop lables
Принудительное использование меток оси x на графе facet_grid: для каждой строки метки оси X различаются
Включение текста оси X для всех фасетов графика facet_grid
Мой первый фрейм данных:
structure(list(variable = structure(c(1L, 1L, 1L, 15L, 15L, 15L,
8L, 8L, 8L, 14L, 14L, 14L, 11L, 11L, 11L, 6L, 6L, 6L, 9L, 9L,
9L, 2L, 2L, 2L, 4L, 4L, 4L, 13L, 13L, 13L, 12L, 12L, 12L, 10L,
10L, 10L, 3L, 3L, 3L, 7L, 7L, 7L, 5L, 5L, 5L), .Label = c("Control-5C10-7F",
"Control-5C20-7M", "Treatment-5T16-7M", "Treatment-5T10-7F",
"Treatment-5T20-7F", "Control-5C18-7F", "Treatment-5T17-7F",
"Control-5C11-7F", "Control-5C19-7M", "Treatment-5T16-7F", "Control-5C17-7F",
"Treatment-5T11-7M", "Treatment-5T10-7M", "Control-5C11-7M",
"Control-5C10-7M"), class = "factor"), value = c(0.331838128419,
0.352404886374, 0.0718854601356, 0.354207630618, 0.294475795902,
0.0531792027053, 0.29236332445, 0.468273675353, 0.0607016856192,
0.293872306838, 0.362196681338, 0.066892937885, 0.365593390631,
0.307405564259, 0.0440421535284, 0.355757725414, 0.344565656834,
0.0385728714381, 0.321804993859, 0.357477936005, 0.0189435852408,
0.29485205349, 0.323279812948, 0.0613479971185, 0.330899082108,
0.0950818222943, 0.00477515444166, 0.382399029908, 0.118943005246,
0.00476898392234, 0.369726433283, 0.163932867784, 0.00531688661114,
0.309218704951, 0.146836936202, 0.196198995646, 0.395112160831,
0.185072972204, 0.00267743643869, 0.306483893184, 0.330640754636,
0.0715509081212, 0.301275805191, 0.388917814857, 0.0356065705157
), Type = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L), .Label = c("Control", "Treatment"), class = "factor"),
Time.Sex = structure(c(2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L,
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L,
2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L,
2L, 2L, 2L, 2L, 2L, 2L), .Label = c("7d.M", "7d.F"), class = "factor"),
IndividualID = c("5C10", "5C10", "5C10", "5C10", "5C10",
"5C10", "5C11", "5C11", "5C11", "5C11", "5C11", "5C11", "5C17",
"5C17", "5C17", "5C18", "5C18", "5C18", "5C19", "5C19", "5C19",
"5C20", "5C20", "5C20", "5T10", "5T10", "5T10", "5T10", "5T10",
"5T10", "5T11", "5T11", "5T11", "5T16", "5T16", "5T16", "5T16",
"5T16", "5T16", "5T17", "5T17", "5T17", "5T20", "5T20", "5T20"
), Sex = c("F", "F", "F", "M", "M", "M", "F", "F", "F", "M",
"M", "M", "F", "F", "F", "F", "F", "F", "M", "M", "M", "M",
"M", "M", "F", "F", "F", "M", "M", "M", "M", "M", "M", "F",
"F", "F", "M", "M", "M", "F", "F", "F", "F", "F", "F"), Rep = c(1,
1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 3, 3,
3, 4, 4, 4, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3,
3, 3, 3, 4, 4, 4), IndividualID.Sex = c("5C10.F", "5C10.F",
"5C10.F", "5C10.M", "5C10.M", "5C10.M", "5C11.F", "5C11.F",
"5C11.F", "5C11.M", "5C11.M", "5C11.M", "5C17.F", "5C17.F",
"5C17.F", "5C18.F", "5C18.F", "5C18.F", "5C19.M", "5C19.M",
"5C19.M", "5C20.M", "5C20.M", "5C20.M", "5T10.F", "5T10.F",
"5T10.F", "5T10.M", "5T10.M", "5T10.M", "5T11.M", "5T11.M",
"5T11.M", "5T16.F", "5T16.F", "5T16.F", "5T16.M", "5T16.M",
"5T16.M", "5T17.F", "5T17.F", "5T17.F", "5T20.F", "5T20.F",
"5T20.F"), Genus = c("o__Bacteroidales;g__Parabacteroides",
"o__Lactobacillales;g__Lactobacillus", "o__Clostridiales;g__Lachnospiraceae NK4A136 group",
"o__Bacteroidales;g__Parabacteroides", "o__Lactobacillales;g__Lactobacillus",
"o__Clostridiales;g__Lachnospiraceae NK4A136 group", "o__Bacteroidales;g__Parabacteroides",
"o__Lactobacillales;g__Lactobacillus", "o__Clostridiales;g__Lachnospiraceae NK4A136 group",
"o__Bacteroidales;g__Parabacteroides", "o__Lactobacillales;g__Lactobacillus",
"o__Clostridiales;g__Lachnospiraceae NK4A136 group", "o__Bacteroidales;g__Parabacteroides",
"o__Lactobacillales;g__Lactobacillus", "o__Clostridiales;g__Lachnospiraceae NK4A136 group",
"o__Bacteroidales;g__Parabacteroides", "o__Lactobacillales;g__Lactobacillus",
"o__Clostridiales;g__Lachnospiraceae NK4A136 group", "o__Bacteroidales;g__Parabacteroides",
"o__Lactobacillales;g__Lactobacillus", "o__Clostridiales;g__Lachnospiraceae NK4A136 group",
"o__Bacteroidales;g__Parabacteroides", "o__Lactobacillales;g__Lactobacillus",
"o__Clostridiales;g__Lachnospiraceae NK4A136 group", "o__Bacteroidales;g__Parabacteroides",
"o__Lactobacillales;g__Lactobacillus", "o__Clostridiales;g__Lachnospiraceae NK4A136 group",
"o__Bacteroidales;g__Parabacteroides", "o__Lactobacillales;g__Lactobacillus",
"o__Clostridiales;g__Lachnospiraceae NK4A136 group", "o__Bacteroidales;g__Parabacteroides",
"o__Lactobacillales;g__Lactobacillus", "o__Clostridiales;g__Lachnospiraceae NK4A136 group",
"o__Bacteroidales;g__Parabacteroides", "o__Lactobacillales;g__Lactobacillus",
"o__Clostridiales;g__Lachnospiraceae NK4A136 group", "o__Bacteroidales;g__Parabacteroides",
"o__Lactobacillales;g__Lactobacillus", "o__Clostridiales;g__Lachnospiraceae NK4A136 group",
"o__Bacteroidales;g__Parabacteroides", "o__Lactobacillales;g__Lactobacillus",
"o__Clostridiales;g__Lachnospiraceae NK4A136 group", "o__Bacteroidales;g__Parabacteroides",
"o__Lactobacillales;g__Lactobacillus", "o__Clostridiales;g__Lachnospiraceae NK4A136 group"
), variable2 = c("7d.F-1", "7d.F-1", "7d.F-1", "7d.M-1",
"7d.M-1", "7d.M-1", "7d.F-2", "7d.F-2", "7d.F-2", "7d.M-2",
"7d.M-2", "7d.M-2", "7d.F-3", "7d.F-3", "7d.F-3", "7d.F-4",
"7d.F-4", "7d.F-4", "7d.M-3", "7d.M-3", "7d.M-3", "7d.M-4",
"7d.M-4", "7d.M-4", "7d.F-1", "7d.F-1", "7d.F-1", "7d.M-1",
"7d.M-1", "7d.M-1", "7d.M-2", "7d.M-2", "7d.M-2", "7d.F-2",
"7d.F-2", "7d.F-2", "7d.M-3", "7d.M-3", "7d.M-3", "7d.F-3",
"7d.F-3", "7d.F-3", "7d.F-4", "7d.F-4", "7d.F-4"), pos = c(0.1,
0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1,
0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2,
0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2,
0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2)), .Names = c("variable",
"value", "Type", "Time.Sex", "IndividualID", "Sex", "Rep", "IndividualID.Sex",
"Genus", "variable2", "pos"), row.names = c(NA, -45L), class = "data.frame")
Второй фрейм данных, используемый во внутренней функции ggplot.
structure(list(variable2 = c("7d.F-1", "7d.M-1", "7d.F-2", "7d.M-2",
"7d.F-3", "7d.F-4", "7d.M-3", "7d.M-4", "7d.F-1", "7d.M-1", "7d.M-2",
"7d.F-2", "7d.M-3", "7d.F-3", "7d.F-4"), IndividualID = c("5C10",
"5C10", "5C11", "5C11", "5C17", "5C18", "5C19", "5C20", "5T10",
"5T10", "5T11", "5T16", "5T16", "5T17", "5T20"), Type = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Control",
"Treatment"), class = "factor")), .Names = c("variable2", "IndividualID",
"Type"), row.names = c(1L, 4L, 7L, 10L, 13L, 16L, 19L, 22L, 25L,
28L, 31L, 34L, 37L, 40L, 43L), class = "data.frame")
Мой код:
index_x <<- 0
index_k <<- 0
p <- ggplot(data=df, aes(x=variable2, y=value, fill=Genus)) +
facet_grid("Type ~ Time.Sex", scales="free_x", space="free_x") +
geom_bar(stat="identity", size=0.0) +
geom_bar( size=0.0, stat="identity", show.legend=FALSE) +
##I tried with some level of success to include the labels I want inside the stacked bars themselves, but
## would ideally like them to be on the x-axis.
geom_text(aes(y=pos, label=IndividualID), vjust=0, angle=90, size=3) +
xlab("Category") +
ylab("Abundance %") +
ggtitle(paste0("Taxa abundance")) +
theme(
panel.border=element_rect(fill=NA, linetype="solid", colour = "black", size=0.25),
axis.text.x=element_text(size=9, colour="black", angle=as.numeric(90)),
axis.text.y=element_text(size=9, colour="black"),
axis.title=element_text(family="Helvetica", size=10),
plot.title = element_text(lineheight=1.2, face="bold", size=25),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
panel.background=element_blank(),
legend.key.size = unit(0.35, "cm"),
legend.text = element_text(size=12, face="bold"),
legend.title = element_text(size=12, face="bold"),
legend.spacing = unit(1, "cm"),
legend.position="right",
strip.text.x = element_text(angle=90, vjust=0, size=7, face="bold"),
strip.text.y = element_text(hjust=0, angle=0, size=7, face="bold"),
strip.background = element_blank(),
panel.spacing.y = unit(0.3, "lines")
) + scale_fill_manual(values=vColors) +
## I wrote an internal function to force the x labels
scale_x_discrete(name="IndividualID", labels = function(x){
final_labels = c()
if(index_x %% length(curr_order_x) == 0){
index_k <<- index_k + 1
}
df_labels2 = df_labels_orig[df_labels_orig[[ facets[1] ]] == rev(curr_order_y)[index_k], ]
for(i in 1:length(x)){
final_labels = c(final_labels, df_labels2[df_labels2$variable2 == x[i],]$IndividualID)
}
index_x <<- index_x + 1
print(final_labels)
return(final_labels)
}
)
print(p)
Длякоторый я получаю следующим образом: Но я хотел бы иметь индивидуальные идентификаторы, которые находятся в столбцах с накоплением непосредственно под осью X.Итак, вот что я сделал, подумав, что я могу отобразить метки принудительной оси X из внутренней функции, описанной выше, с помощью gTable.
# Then following the references I found on SO, I tried the following:
index_x <<- 0
index_k <<- 0
g <- ggplotGrob(p)
panels <- grep("panel", g$layout$name)
top <- unique(g$layout$t[panels])
top.row <- gtable:::rbind_gtable(
g[seq.int(min(top)), ],
g[max(top)+1,], "first"
)
bottom.row <- g[(max(top)-1):nrow(g), ]
all <- gtable:::rbind_gtable(top.row, bottom.row, "first")
grid.newpage()
grid.draw(all)
Для которого я получаю: Xось одинакова в двух рядах, и я бы хотел, чтобы они соответствовали тому, что они на самом деле представляют.Кажется, это хорошо работает для нижних панелей, но метки оси X на верхних панелях содержат те же метки, что и на нижних панелях.Я также потерял легенду.
Редактировать: Вот что я хотел бы получить для конечного результата: