Я пытаюсь написать script, который создает четыре разных графика в одном изображении. В частности, я хочу как можно ближе воссоздать эту графику:
Мой текущий script создает четыре сюжета, похожие на них, но я не могу понять, как соответствующим образом распределить экранную недвижимость. Я хочу:
- измените высоту и ширину графиков так, чтобы все четверо имели равномерную ширину, один был значительно выше других, которые имеют равномерную высоту среди них.
- определить положение легенд по координатам, чтобы эффективно использовать пространство экрана
- изменить форму изображения в явном виде по мере необходимости (возможно, мне понадобится она ближе к квадратной форме в какой-то момент)
ПОЛУЧИТЬ НЕКОТОРЫЕ ДАННЫЕ ДЛЯ УСТАНОВКИ
pt_id = c(1:279) # DEFINE PATIENT IDs
smoke = rbinom(279,1,0.5) # DEFINE SMOKING STATUS
hpv = rbinom(279,1,0.3) # DEFINE HPV STATUS
data = data.frame(pt_id, smoke, hpv) # PRODUCE DATA FRAME
ДОБАВИТЬ АНАТОМИЧЕСКИЕ ДАННЫЕ САЙТА
data$site = sample(1:4, 279, replace = T)
data$site[data$site == 1] = "Hypopharynx"
data$site[data$site == 2] = "Larynx"
data$site[data$site == 3] = "Oral Cavity"
data$site[data$site == 4] = "Oropharynx"
data$site_known = 1 # HACK TO FACILITATE PRODUCING BARPLOTS
ДОБАВИТЬ ДАННЫЕ ЧАСТОТЫ МУТАЦИИ
data$freq = sample(1:1000, 279, replace = F)
DEFINE BARPLOT
require(ggplot2)
require(gridExtra)
bar = ggplot(data, aes(x = pt_id, y = freq)) + geom_bar(stat = "identity") + theme(axis.title.x = element_blank(), axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylab("Number of Mutations")
# DEFINE BINARY PLOTS
smoke_status = ggplot(data, aes(x=pt_id, y=smoke, fill = "red")) + geom_bar(stat="identity") + theme(legend.position = "none", axis.title.x = element_blank(), axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylab("Smoking Status")
hpv_status = ggplot(data, aes(x=pt_id, y = hpv, fill = "red")) + geom_bar(stat="identity") + theme(legend.position = "none", axis.title.x = element_blank(), axis.ticks.x = element_blank(), axis.text.x = element_blank()) + ylab("HPV Status")
site_status = ggplot(data, aes(x=pt_id, y=site_known, fill = site)) + geom_bar(stat="identity")
ПРОИЗВОДИТЕ ЧЕТЫРЕ ГРАФСТВА ВМЕСТЕ
grid.arrange(bar, smoke_status, hpv_status, site_status, nrow = 4)
Я подозреваю, что функции, необходимые для выполнения этих задач, уже включены в ggplot2 и gridExtra, но я не смог понять, как это сделать. Кроме того, если какой-либо из моего кода является чрезмерно многословным или есть более простой, более элегантный способ сделать то, что я уже сделал, пожалуйста, не стесняйтесь прокомментировать это.