2016-01-13 9 views
6

Ho provato ad aggiungere una piccola tabella di riepilogo a un grafico che ho creato con ggplot2::ggplot(). La tabella viene aggiunta tramite gridExtra::tableGrob() all'oggetto ggplot salvato.Aggiunta di una tabella a ggplot con gridExtra e annotation_custom() modifica i limiti dell'asse y

Il mio problema è che questo sembra modificare i limiti y della mia trama originale. C'è un modo per evitarlo senza dover specificare nuovamente i limiti tramite ylim()?

Ecco un esempio minimo per il problema utilizzando il set di dati ChickWeight:

# load packages 
require(ggplot2) 
require(gridExtra) 

# create plot 
plot1 = ggplot(data = ChickWeight, aes(x = Time, y = weight, color = Diet)) + 
     stat_summary(fun.data = "mean_cl_boot", size = 1, alpha = .5) 
plot1 
# create table to add to the plot 
sum_table = aggregate(ChickWeight$weight, 
         by=list(ChickWeight$Diet), 
         FUN = mean) 
names(sum_table) = c('Diet', 'Mean') 
sum_table = tableGrob(sum_table) 

# insert table into plot 
plot1 + annotation_custom(sum_table) 

ylim problem with annotation_custom()

EDIT: Ho appena capito che sembra essere un problema con stat_summary(). Quando uso un'altra geom/layer, i limiti rimangono come erano nella trama originale. Un altro esempio per questo:

plot2 = ggplot(data = ChickWeight, aes(x = Time, y = weight, color = Diet)) + 
     geom_jitter() 
plot2 
plot2 + annotation_custom(sum_table) 

ylim problem with annotation_custom()

+0

Non sono sicuro del problema, ma non penso che sia un problema con 'stat_summary' che si fa' plot2 + stat_summary (fun.data = "mean_cl_boot", size = 1, alpha = .5) + annotation_custom (sum_table) 'allora il tuo ylim è preservato. – George

+0

È interessante. Imposta i limiti y per l'intero intervallo di dati anziché quello da 'geom = 'pointrange'' (che' stat_summary' usa di default). Quindi, se lo vedo correttamente, nel mio primo esempio ylim viene adattato all'intervallo dei valori riepilogati e visualizzati (da 'pointrange'), ma quando si aggiunge' annotation_custom' usa di nuovo l'intervallo di tutti i dati. – abel

risposta

4

Il y-intervallo per Plot1 è diverso da Plot2, il motivo è che annotation_custom prende l'estetica dal aes dichiarazione originale, non il frame di dati modificato utilizzato da stat_summary() . Per ottenere lo y range per i due grafici uguali (o approssimativamente lo stesso - vedi sotto), interrompere annotation_custom ottenendo la sua estetica dai dati originali. Cioè, sposta aes() all'interno dello stat_summary().

# load packages 
require(ggplot2) 
require(gridExtra) 

# create plot 
plot1 = ggplot(data = ChickWeight) + 
     stat_summary(aes(x = Time, y = weight, color = Diet), fun.data = "mean_cl_boot", size = 1, alpha = .5) 
plot1 

# create table to add to the plot 
sum_table = aggregate(ChickWeight$weight, 
         by=list(ChickWeight$Diet), 
         FUN = mean) 
names(sum_table) = c('Diet', 'Mean') 
sum_table = tableGrob(sum_table) 

# insert table into plot 
plot2 = plot1 + annotation_custom(sum_table, xmin = 10, xmax = 10, ymin = 200, ymax = 200) 
plot2 

enter image description here

proposito, la ragione le due trame non daranno la stessa y-gamma è a causa della funzione di bootstrap in stat_summary(). Infatti, trama ripetutamente p1, e potresti notare lievi cambiamenti nella gamma y. Oppure controlla i range y nei dati di costruzione.

ggplot_build(plot1)$layout$panel_ranges[[1]]$y.range 
ggplot_build(plot2)$layout$panel_ranges[[1]]$y.range 

Ricordiamo che ggplot non valuta funzioni fino al momento drawing - ogni volta p1 o p2 viene disegnato, viene selezionato un nuovo campione bootstrap.

Problemi correlati