Sto provando a scrivere uno script che produce quattro grafici diversi in una singola immagine. In particolare, voglio ricreare il più fedelmente questa grafica il più possibile:R - come allocare lo spazio dello schermo su complesse immagini ggplot
mio script corrente produce quattro trame simili a queste, ma io non riesco a capire come allocare schermo immobiliare di conseguenza. Voglio:
- modificare l'altezza e la larghezza delle piazzole modo che tutti e quattro hanno larghezza uniforme, uno è sostanzialmente più alto degli altri aventi altezza uniforme tra loro
- definiscono la posizione delle leggende da coordinate in modo da poter utilizzare lo spazio dello schermo in modo efficace
- modificare la forma complessiva della mia immagine in modo esplicito come necessario (forse ho bisogno a forma quadrata più vicino ad un certo punto)
generare qualche DATI tracciare
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
AGGIUNGERE sito anatomico DATI
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
ADD mutazione dati di frequenza
data$freq = sample(1:1000, 279, replace = F)
DEFINIRE 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")
produrre quattro GRAFICI INSIEME
grid.arrange(bar, smoke_status, hpv_status, site_status, nrow = 4)
Sospetto che le funzioni necessarie per svolgere queste attività siano già incluse in ggplot2 e gridExtra ma non sono stato in grado di capire come. Inoltre, se qualcuno del mio codice è eccessivamente prolisso o c'è un modo più semplice e più elegante di fare ciò che ho già fatto, per favore sentiti libero di commentare anche questo.
Per la prima domanda è possibile specificare un layout con 6 righe e quindi inserire il grafico superiore nelle prime 3 righe. Vedi la funzione multiplot qui per [http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/] – RHA
Questo genere di cose di solito richiede di fare le cose "manualmente" usando gli strumenti nel pacchetto ** grid ** . Vorrei iniziare osservando 'ggplot_build' e' ggplot_gtable' per scomporre i grafici nei grobs del componente, e quindi probabilmente finirai per costruire il tuo layout ('grid.layout') e disegnare ogni grob in finestre specifiche. – joran
Puoi anche dare un'occhiata al ['gtable' wiki] (https://github.com/baptiste/gtable/wiki/Description) – Henrik