Сгруппированный столбчатый график GGPLOT с фасетками: несколько выровненных меток на столбец?
(РЕДАКТИРОВАТЬ: проблемы, поднятые в этом посте, решаются ниже)
Я пытаюсь заставить свой барный сюжет выглядеть определенным образом. Я надеюсь, что вы можете следовать за мной, не объяснив, какова цель этого сюжета или контекст данных, так что я сейчас углублюсь.
Я использую этот код
ggplot(ds, aes(x=fraction, y=AUC)) +
geom_bar(aes(fill=factor(demographics, c("adjusted", "not adjusted"))), position=position_dodge(width=0.9), stat="identity") +
facet_grid(~FN, switch="x") +
geom_text(aes(label=round(AUC, 2), fontface="bold", vjust=-0.4), position=position_dodge(width=0.9), size=2.75) +
theme(legend.title=element_blank(), legend.position="bottom",
axis.text.y=element_blank(),
axis.title.x=element_blank(), axis.ticks.x=element_blank(), axis.ticks.y=element_blank(),
panel.background=element_blank())
произвести следующий сюжет
Однако я хочу увидеть
что значения AUC в верхней части столбцов правильно выровнены с каждым отдельным столбцом (сгруппированы по "демографии" [отрегулировано / не отрегулировано]), а не с серединой группы "фракция" (сыворотка / плазма), как это правильно сейчас
что каждый из двух стержней в последнем фасете "FN=5" имеет только половину их текущей ширины (чтобы сопоставить ширину других стержней в фасетах от "FN=1" до "FN=4"
что внутри каждой полосы есть вертикальная метка. Эта метка хранится в символьной переменной "features", содержащейся в наборе данных "ds", используемом для печати графика
ds <- structure(list(ds = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L,
2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L), .Label = c("1",
"2", "3", "4"), class = "factor"), FN = structure(c(1L, 2L, 3L,
4L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 5L, 1L,
2L, 3L, 4L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L,
5L), .Label = c("FN=1", "FN=2", "FN=3", "FN=4", "FN=5"), class = "factor"),
fraction = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("serum",
"plasma"), class = "factor"), demographics = structure(c(1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L,
2L, 2L, 2L, 2L, 2L), .Label = c("not adjusted", "adjusted (age, sex, education, ethnicity, ApoE4)"
), class = "factor"), AUC = c(0.741264171455195, 0.749961174095356,
0.797639384997671, 0.763006678055599, 0.894704146606616,
0.9038670601025, 0.90169280944246, 0.912564062742662, 0.912564062742662,
0.672077922077922, 0.715367965367965, 0.746753246753247,
0.791125541125541, 0.804112554112554, 0.827922077922078,
0.829004329004329, 0.83982683982684, 0.83982683982684, 0.741264171455195,
0.749961174095356, 0.797639384997671, 0.763006678055599,
0.894704146606616, 0.9038670601025, 0.90169280944246, 0.912564062742662,
0.912564062742662, 0.672077922077922, 0.715367965367965,
0.746753246753247, 0.791125541125541, 0.804112554112554,
0.827922077922078, 0.829004329004329, 0.83982683982684, 0.83982683982684
), features = c("p21", "p3 + p21", "p3 + p7 + p19", "p1 + p8 + p21 + p23",
"p8", "p11 + p24", "p14 + p17 + p24", "p11 + p13 + p14 + p17",
"p11 + p13 + p14 + p17", "p13", "p9 + p17", "p9 + p14 + p17",
"p7 + p9 + p17 + p19", "p20", "p9 + p19", "p9 + p17 + p19",
"p4 + p8 + p9 + p17", "p4 + p8 + p9 + p17", "p21", "p3 + p21",
"p3 + p7 + p19", "p1 + p8 + p21 + p23", "p8", "p11 + p24",
"p14 + p17 + p24", "p11 + p13 + p14 + p17", "p11 + p13 + p14 + p17",
"p13", "p9 + p17", "p9 + p14 + p17", "p7 + p9 + p17 + p19",
"p20", "p9 + p19", "p9 + p17 + p19", "p4 + p8 + p9 + p17",
"p4 + p8 + p9 + p17")), .Names = c("ds", "FN", "fraction",
"demographics", "AUC", "features"), row.names = c(NA, -36L), class = "data.frame")
РЕДАКТИРОВАТЬ: В конце концов, используя справку в разделе комментариев, я использовал этот код
ggplot(ds, aes(x=fraction, y=AUC, fill=factor(demographics, c("adjusted (age, sex, education, ethnicity, ApoE4)", "not adjusted")))) +
geom_bar(position=position_dodge(width=0.9), stat="identity") +
facet_grid(~FN) +
geom_text(aes(label=round(AUC, 2), fontface="bold", vjust=1), position=position_dodge(width=0.9), size=2.75) +
geom_text(aes(y=0.3, label=features, fontface="bold"), color="white", position=position_dodge(width=0.9), angle=90, size=3) +
theme_bw() +
theme(legend.title=element_blank(), legend.position="bottom",
axis.text.y=element_blank(),
axis.title.x=element_blank(), axis.title.y=element_text(face="bold"), axis.ticks.x=element_blank(), axis.ticks.y=element_blank(),
panel.background=element_blank(), panel.grid.minor=element_blank(), panel.grid.major=element_blank())
чтобы получить результаты, которые я первоначально хотел (я передумал на половину ширины столбцов в фасете "FN=5", хотя), выглядя так
Чтобы улучшить читаемость, я решил перевернуть график, используя этот код
ggplot(ds, aes(x=fraction, y=AUC, fill=factor(demographics, c("not adjusted", "adjusted (age, sex, education, ethnicity, ApoE4)")))) +
geom_bar(position=position_dodge(width=0.9), stat="identity") +
facet_grid(FN~.) +
geom_text(aes(y=AUC, label=round(AUC, 2), fontface="bold"), position=position_dodge(width=0.9), hjust=1.15, size=3.25) +
geom_text(aes(y=0.4, label=features, fontface="bold"), position=position_dodge(width=0.9), color="white", size=3) +
theme_bw() +
theme(legend.title=element_blank(), legend.position="bottom",
axis.title.x=element_text(face="bold"), axis.title.y=element_blank(),
axis.ticks.x=element_blank(), axis.ticks.y=element_blank(),
panel.background=element_blank(), panel.grid.minor=element_blank(), panel.grid.major=element_blank(),
strip.text.y = element_text(angle=0)) + coord_flip()
в результате горизонтальный линейный график теперь выглядит следующим образом (цвета и порядок клавиш легенды пока не совсем верны)