2016-03-31 54 views
5

Desidero creare due diverse dimensioni di testo nelle etichette del mio involucro delle faccette.Come utilizzare le diverse dimensioni dei caratteri nelle etichette wrap a sfaccettatura ggplot?

Ad esempio:

  • Specie X (taglia 14)
  • cattura totale (n = 133) (dimensione 12)

enter image description here

test <- read.csv(paste0(path, "Costello Artvgl2 for Stack.csv"), sep = ";", dec = ",", header = T) 

str(test) 


test$Wert <- factor(test$Wert, levels = c("one","two","three","four","five","six")) 


test$Sampling.site <- factor(test$Sampling.site, levels = c("Species X Area T","Species Y Area T","Species X Area A","Species Y Area B","Species X Area B","Species Y Area C")) 


levels(test$Sampling.site) <- c("Species X\nTotal catch (n=133)", "Species Y\nTotal catch (n=185)", "Species X\nSampling area A (n=57)", "Species Y\nSampling area B (n=122)", 
          "Species X\nSampling area B (n=76)", "Species Y\nSampling area C (n=63)") 

theme_new <- function(base_size = 12, base_family = base_family){ 
theme_bw(base_size = base_size) %+replace% 
theme(
    axis.text.x =  element_text(size = 8), 
    axis.text.y =  element_text(size = 8), 
    axis.title.x =  element_text(size = 12, vjust = 0.01), 
    axis.title.y =  element_text(size = 12, vjust = 0.9, angle = 90), 

    plot.title =  element_text(size = 10, face = "bold"), 

    legend.key=   element_rect(colour= NA, fill =NA, size = 0.5), 
    legend.key.size = unit(1, "lines"), 
    legend.text =  element_text(size = 8), 
    legend.title =  element_blank(), 

    strip.background = element_rect(fill = NA, colour = NA), 
    strip.text =  element_text(size = 8, face = "bold",hjust = 0.5, vjust = 0.9), 

    panel.background = element_rect(fill = "white"), 
    panel.border =  element_rect(fill = NA, colour="black"), 
    panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank(), 
    panel.margin =  unit(1, "lines") 

) 
} 

ggplot(test, aes(Fi, Pi),group=Wert)+ 
geom_point(aes(colour = factor(Wert),shape = factor(Wert)),size=3)  +       
    scale_shape_manual(values=c(20,18,19,15,16,17))+      
    scale_x_continuous(limits=c(0, 1),breaks=c(0,0.2,0.4,0.6,0.8,1.0))+  
    scale_colour_brewer(type = "qual", palette = "Paired")+ 
    scale_y_continuous(limits=c(0, 100),breaks=c(0,20,40,60,80,100))+   
    labs(x = "Frequency of occurrence", y = "Prey-specific abundance [%]")+ 
    facet_wrap(~Sampling.site,scales = "free",ncol = 2) + 
    theme_new() 

C'è un possibilità di realizzarlo?

+3

Questa è una buona domanda, ma si può prendere in considerazione rendere il vostro esempio minimo e riproducibile. Per esempio. adattare uno degli esempi da [la documentazione] (http://docs.ggplot2.org/current/facet_wrap.html). – Axeman

+0

Come posso caricare un file Excel, quindi è possibile riprodurre il codice? –

+0

Per favore non farlo. La tua domanda non è legata ai tuoi dati specifici, né la maggior parte del codice nella tua domanda è pertinente. Fai un semplice esempio che illustra il tuo problema con il minimo sforzo per il rispondente. Di nuovo, usare semplicemente uno degli esempi della documentazione è un modo semplice per fare un esempio semplicissimo. Tieni presente che le domande dovrebbero essere utili anche per i futuri lettori. [Vedi qui per ulteriori suggerimenti] (http: // StackOverflow.com/domande/5963269/how-to-make-a-great-r-riproducibile-esempio). – Axeman

risposta

4

La soluzione seguente è un trucco in quanto utilizza un apice (o pedice) per ottenere una dimensione del carattere più piccola per la seconda riga dell'etichetta sfaccettatura. Non sono sicuro di come ottenere un controllo più accurato delle dimensioni dell'etichetta senza ricorrere alla manipolazione diretta dei grobs delle strisce, anche se potrebbe esserci un modo per scrivere una funzione labeller per farlo.

Utilizzeremo il frame di dati mtcars integrato per l'esempio. Innanzitutto, aggiungeremo colonne che verranno utilizzate sia per sfaccettature che per etichettatura. Facciamo sfaccettatura di cyl, ma vogliamo che la prima riga dell'etichetta visualizzi il numero di cilindri per quel facet e la seconda riga per visualizzare il numero di punti di dati in quel facet. Per fare ciò, creeremo due nuove colonne in mtcars, chiamate Label1 e Label2 che useremo per creare ogni riga dell'etichetta facet. Facciamo sfaccettatura da queste due colonne per ottenere le etichette che vogliamo nel grafico. (Label3 è simile a Label2, ma usa pedice invece di apice; questo solo importa se si desidera modificare la distanza dalla parte inferiore della seconda linea alla parte superiore del pannello trama.)

Label1 e Label2 sono stringhe di testo , ma sono sotto forma di espressioni in modo che possiamo usare label_parsed per ottenere un testo con indici più piccoli quando creiamo la trama.

library(ggplot2) 
library(dplyr) 
library(grid) 

mtcars.new = mtcars %>% group_by(cyl) %>% 
    summarise(Label1=paste0("bold(Cylinders:~", unique(cyl),")"), 
      Label2=paste0("bold(NULL[Count:~", length(cyl),"])"), 
      Label3=paste0("bold(NULL^{Count:~", length(cyl),"})")) %>% 
    full_join(mtcars) 

Ora possiamo creare la trama. Facetting da Label1 e Label2 ci dà due linee. Poiché abbiamo creato un'espressione con indice per Label2, questo viene visualizzato in un carattere più piccolo quando si utilizza label_parsed per etichettare le faccette. Preferirei che lo Label2 fosse un po 'più grande, rispetto a Label1, ma non c'è modo di controllarlo con questo metodo (hacky). Inoltre, sebbene element_text abbia un argomento lineheight, ggplot non sembra rispettarlo. Di conseguenza, ho ripristinato manualmente l'altezza della linea per le etichette delle strisce per ridurre lo spazio tra le due etichette.

p = ggplot(mtcars.new, aes(wt, mpg)) + 
    geom_point() + 
    facet_grid(. ~ Label1 + Label2, labeller=label_parsed) + 
    theme_bw() + 
    theme(strip.background=element_rect(fill=NA, color=NA), 
     strip.text=element_text(size=12)) 

g <- ggplotGrob(p) 
g$heights[[3]] = unit(0.5,"lines") 

grid.draw(g) 

enter image description here