2016-03-31 13 views
5

Ich möchte zwei verschiedene Textgrößen in den Etiketten meines Facettenwickels erstellen.Wie verwendet man verschiedene Schriftgrößen in ggplot facet wrap Etiketten?

Zum Beispiel:

  • Spezies X (Größe 14)
  • Gesamt catch (n = 133), (Größe 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() 

Gibt es ein Möglichkeit, das zu realisieren?

+3

Dies ist eine gute Frage, aber Sie können Ihr Beispiel minimal und reproduzierbar in Erwägung ziehen. Z.B. Passe eines der Beispiele aus [der Dokumentation] an (http://docs.ggplot2.org/current/facet_wrap.html). – Axeman

+0

Wie kann ich eine Excel-Datei hochladen, damit Sie den Code reproduzieren können? –

+0

Bitte nicht. Ihre Frage ist nicht an Ihre spezifischen Daten gebunden, noch ist der Großteil des Codes in Ihrer Frage relevant. Machen Sie ein einfaches Beispiel, das Ihr Problem mit minimalem Aufwand für den Beantworter darstellt. Auch hier ist es einfach, eines der Beispiele aus der Dokumentation zu verwenden, um ein einfaches Beispiel zu geben. Denken Sie daran, dass Fragen auch für zukünftige Leser nützlich sein sollten. [Siehe hier für weitere Tipps] (http: // stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproduzierbar-Beispiel). – Axeman

Antwort

4

Die Lösung unten ist ein Hack, dass sie einen Exponenten (oder Index) verwenden eine kleinere Schriftgröße für die zweite Zeile des Facette Label zu erhalten. Ich bin mir nicht sicher, wie man die Etikettengröße besser kontrollieren kann, ohne direkt auf die Strip-Grobs zuzugreifen, obwohl es eine Möglichkeit geben könnte, eine labeller-Funktion dafür zu schreiben.

Wir werden den eingebauten in mtcars Datenrahmen für das Beispiel. Zuerst fügen wir Spalten hinzu, die sowohl für die Facettierung als auch für die Beschriftung verwendet werden. Wir werden durch cyl konfrontiert, aber wir wollen die erste Zeile des Etiketts die Anzahl der Zylinder für diese Facette anzeigen und die zweite Zeile die Anzahl der Datenpunkte in dieser Facette anzeigen. Um dies zu tun, erstellen wir zwei neue Spalten in mtcars, genannt Label1 und Label2, die wir verwenden werden, um jede Zeile der Facettenbezeichnung zu erstellen. Wir werden durch diese beiden Spalten konfrontiert, um die gewünschten Bezeichnungen in der Grafik zu erhalten. (Label3 ist ähnlich Label2, verwendet aber Index statt hoch; Das ist nur, wenn Sie den Abstand vom Boden der zweiten Linie an die Spitze des Plots Panel ändern möchten.)

Label1 und Label2 sind Textstrings , aber sie sind in der Form von Ausdrücken, so dass wir verwenden können, um kleineren indizierten Text zu erhalten, wenn wir das Diagramm erstellen.

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) 

Jetzt können wir die Handlung erstellen. Facettierung von Label1 und Label2 gibt uns zwei Zeilen. Da wir einen subskribierten Ausdruck für Label2 erstellt haben, wird dieser in einer kleineren Schriftart gerendert, wenn wir die Facetten mit beschriften. Ich würde bevorzugen, dass die Label2 ein bisschen größer ist, relativ zu Label1, aber es gibt keine Möglichkeit, das mit dieser (Hacky) Methode zu kontrollieren. Auch wenn element_text ein lineheight Argument hat, scheint ggplot es nicht zu respektieren. Als Ergebnis habe ich die Zeilenhöhe für die Streifenetiketten manuell zurückgesetzt, um den Abstand zwischen den beiden Etiketten zu verringern.

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