2015-05-12 35 views
7

Posso trovare una soluzione per i seguenti problemi. Gradirei molto aiuto!Le barre in geom_bar hanno larghezze indesiderate diverse quando si utilizza facet_wrap

Il seguente codice produce i grafici a barre utilizzando il facet. Tuttavia, a causa dello "spazio extra" ggplot2 ha in alcuni gruppi rende le barre molto più larghe, anche se specifichi una larghezza di 0.1 o simile. Lo trovo molto fastidioso dal momento che lo fa apparire molto poco professionale. Voglio che tutte le barre abbiano lo stesso aspetto (eccetto per il riempimento). Spero che qualcuno possa dirmi come risolvere questo problema.

In secondo luogo, come posso riordinare le diverse classi nelle finestre delle faccette in modo che l'ordine sia sempre C1, C2 ... C5, M, F, Tutti ove applicabile. L'ho provato ordinando i livelli del fattore, ma dal momento che non tutte le classi sono presenti in ogni parte del grafico non ha funzionato, o almeno presumo che sia stata la ragione.

In terzo luogo, come è possibile ridurre lo spazio tra le barre? In modo che l'intero grafico sia più compresso. Anche se riduco l'immagine per l'esportazione, R ridimensiona le barre più piccole ma gli spazi tra le barre sono ancora enormi.

Apprezzerei il feedback per una di quelle risposte!

I miei dati: http://pastebin.com/embed_iframe.php?i=kNVnmcR1

My Code:

library(dplyr) 
library(gdata) 
library(ggplot2) 
library(directlabels) 
library(scales) 

all<-read.xls('all_auto_visual_c.xls') 

all$station<-as.factor(all$station) 
#all$group.new<-factor(all$group, levels=c('C. hyperboreus','C. glacialis','Special Calanus','M. longa','Pseudocalanus sp.','Copepoda')) 

allp <- ggplot(data = all, aes(x=shortname2, y=perc_correct, group=group,fill=sample_size)) + 

    geom_bar(aes(fill=sample_size),stat="identity", position="dodge", width=0.1, colour="NA") + scale_fill_gradient("Sample size (n)",low="lightblue",high="navyblue")+ 
    facet_wrap(group~station,ncol=2,scales="free_x")+ 

    xlab("Species and stages") + ylab("Automatic identification and visual validation concur (%)") + 
    ggtitle("Visual validation of predictions") + 
    theme_bw() + 

    theme(plot.title = element_text(lineheight=.8, face="bold", size=20,vjust=1), axis.text.x = element_text(colour="grey20",size=12,angle=0,hjust=.5,vjust=.5,face="bold"), axis.text.y = element_text(colour="grey20",size=12,angle=0,hjust=1,vjust=0,face="bold"), axis.title.x = element_text(colour="grey20",size=15,angle=0,hjust=.5,vjust=0,face="bold"), axis.title.y = element_text(colour="grey20",size=15,angle=90,hjust=.5,vjust=1,face="bold"),legend.position="none", strip.text.x = element_text(size = 12, face="bold", colour = "black", angle = 0), strip.text.y = element_text(size = 12, face="bold", colour = "black")) 
allp 

#ggsave(allp, file="auto_visual_stackover.jpeg", height= 11, width= 8.5, dpi= 400,) 

Il grafico corrente che ha bisogno di un po 'di fissaggio:

enter image description here

Grazie mille!

+1

1. sarà massima con 'geom_bar',' width' viene interpretata come una percentuale della distanza tra barre adiacenti. Forse usa 'geom_segment', quindi' size' sarà interpretato come assoluto. Per 2, riordinare i livelli fattoriali è il modo per farlo. Per 3, aumenta 'width', lo hai impostato a 0.1, quindi stai dicendo a ggplot di usare solo il 10% dello spazio (o usa' geom_segment'). – Gregor

+0

Grazie! Lo esaminerò. Una domanda riguardante i livelli dei fattori. Posso mettere tutte le classi (C1 .... C2 e 1 ecc.) In un fattore di livello anche se non di tutte sono presenti nelle stesse sfaccettature? –

risposta

5

Supponendo che le larghezze barre sono inversamente proporzionale al numero di x-break, un fattore di scala appropriato può essere costruito nella funzione geom_bar(). Ma prima, calcola il numero di x-break in ciascun pannello, calcola il fattore di scala e rimettili nel frame di dati "tutto".

Aggiornamento a ggplot2 2.0.0 Ogni colonna menzionata in facet_wrap ottiene la propria riga nella striscia. Nella modifica, una nuova variabile etichetta è impostata nel dataframe in modo che l'etichetta della striscia rimanga su una riga.

# Calculate scaling factor and insert into data frame 
library(plyr) 
N = ddply(all, .(station, group), function(x) length(row.names(x))) 
N$Fac = N$V1/max(N$V1) 
all = merge(all, N[,-3], by = c("station", "group")) 

all$label = paste(all$group, all$station, sep = ", ") 

allp <- ggplot(data = all, aes(x=shortname2, y=perc_correct, group=group,fill=sample_size)) + 

     # Adjust the bar widths according to the scaling factor 
    geom_bar(aes(width = .5*Fac), stat="identity", position="dodge", colour="NA") + 

    scale_fill_gradient("Sample size (n)",low="lightblue",high="navyblue")+ 
    facet_wrap(~label,ncol=2,scales="free_x")+ 
    # facet_wrap(group~station,ncol=2,scales="free_x")+ 
    xlab("Species and stages") + ylab("Automatic identification and visual validation concur (%)") + 
    ggtitle("Visual validation of predictions") + 
    theme_bw() + 
    theme(plot.title = element_text(lineheight=.8, face="bold", size=20,vjust=1), 
    axis.text.x = element_text(colour="grey20",size=12,angle=0,hjust=.5,vjust=.5,face="bold"), 
    axis.text.y = element_text(colour="grey20",size=12,angle=0,hjust=1,vjust=0,face="bold"), 
    axis.title.x = element_text(colour="grey20",size=15,angle=0,hjust=.5,vjust=0,face="bold"), 
    axis.title.y = element_text(colour="grey20",size=15,angle=90,hjust=.5,vjust=1,face="bold"), 
    legend.position="none", 
    strip.text.x = element_text(size = 12, face="bold", colour = "black", angle = 0), 
    strip.text.y = element_text(size = 12, face="bold", colour = "black")) 

allp 

enter image description here

+1

Molto bello, grazie! –

6

Ecco cosa ho fatto dopo il suggerimento di Gregor. L'utilizzo di geom_segment e geom_point rende un grafico carino come penso.

library(ggplot2) 

all<-read.xls('all_auto_visual_c.xls') 

all$station<-as.factor(all$station) 
all$group.new<-factor(all$group, levels=c('C. hyperboreus','C. glacialis','Combined','M. longa','Pseudocalanus sp.','Copepoda')) 
all$shortname2.new<-factor(all$shortname2, levels=c('All','F','M','C5','C4','C3','C2','C1','Micro',  'Oith','Tric','Cegg','Cnaup','C3&2','C2&1')) 

allp<-ggplot(all, aes(x=perc_correct, y=shortname2.new)) + 
    geom_segment(aes(yend=shortname2.new), xend=0, colour="grey50") + 
    geom_point(size=4, aes(colour=sample_size)) + 
    scale_colour_gradient("Sample size (n)",low="lightblue",high="navyblue") + 
    geom_text(aes(label = perc_correct, hjust = -0.5)) + 
    theme_bw() + 
    theme(panel.grid.major.y = element_blank()) + 
    facet_grid(group.new~station,scales="free_y",space="free") + 
    xlab("Automatic identification and visual validation concur (%)") + ylab("Species and stages")+ 
    ggtitle("Visual validation of predictions")+ 
    theme_bw() + 
    theme(plot.title = element_text(lineheight=.8, face="bold", size=20,vjust=1), axis.text.x = element_text(colour="grey20",size=12,angle=0,hjust=.5,vjust=.5,face="bold"), axis.text.y = element_text(colour="grey20",size=12,angle=0,hjust=1,vjust=0,face="bold"), axis.title.x = element_text(colour="grey20",size=15,angle=0,hjust=.5,vjust=0,face="bold"), axis.title.y = element_text(colour="grey20",size=15,angle=90,hjust=.5,vjust=1,face="bold"),legend.position="none", strip.text.x = element_text(size = 12, face="bold", colour = "black", angle = 0), strip.text.y = element_text(size = 8, face="bold", colour = "black")) 

allp 

ggsave(allp, file="auto_visual_no_label.jpeg", height= 11, width= 8.5, dpi= 400,) 

Questo è quello che produce!

enter image description here

+1

Bel lavoro! Grazie per aver postato la tua risposta!Mi piace lo stile "dotplot" come hai fatto qui, ma se preferisci le barre dovresti essere in grado di ingrassare i geom_segments impostando 'size' molto grande. – Gregor

+0

Grazie! Si, potresti ma in questo caso mi piace che sia sottile e non distraente. Il colore di riempimento nel punto è sufficiente, suppongo, anche se la scala dei colori non è eccellente per la stampa .... –