2016-03-31 7 views
5

मैं अपने पहलू लपेटने के लेबल में दो अलग-अलग आकार के पाठ बनाना चाहता हूं।ggplot facet wrap लेबल में विभिन्न फ़ॉन्ट आकारों का उपयोग कैसे करें?

उदाहरण के लिए:

  • प्रजाति एक्स (आकार 14)
  • कुल पकड़ (n = 133) (आकार 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() 

क्या कोई यह महसूस करने की संभावना है?

+3

यह एक अच्छा सवाल है, लेकिन आप अपने उदाहरण कम से कम और प्रतिलिपि प्रस्तुत करने योग्य बनाने पर विचार कर सकते हैं। जैसे [दस्तावेज़ीकरण] से उदाहरणों में से एक को अनुकूलित करें (http://docs.ggplot2.org/current/facet_wrap.html)। – Axeman

+0

मैं एक्सेल फ़ाइल कैसे अपलोड कर सकता हूं, ताकि आप कोड को पुन: पेश कर सकें? –

+0

कृपया मत करो। आपका प्रश्न आपके विशिष्ट डेटा से बंधे नहीं है, न ही आपके प्रश्न में सबसे अधिक कोड प्रासंगिक है। एक साधारण उदाहरण बनाएं जो उत्तर-एर के लिए न्यूनतम प्रयास के साथ आपकी समस्या को दिखाता है। फिर, दस्तावेज़ीकरण से उदाहरणों में से एक का उपयोग करना एक सुपर सरल उदाहरण बनाने का एक सीधा-आगे तरीका है। ध्यान रखें कि प्रश्न भविष्य के पाठकों के लिए भी उपयोगी होना चाहिए। [कुछ और युक्तियों के लिए यहां देखें] (http: // stackoverflow।com/प्रश्न/5963269/कैसे करने वाली बनाने के एक महान-R-प्रतिलिपि प्रस्तुत करने योग्य-उदाहरण)। – Axeman

उत्तर

4

नीचे दिया गया समाधान एक हैक है जिसमें यह पहलू लेबल की दूसरी पंक्ति के लिए एक छोटा फ़ॉन्ट आकार प्राप्त करने के लिए सुपरस्क्रिप्ट (या सबस्क्रिप्ट) का उपयोग करता है। मुझे यकीन नहीं है कि स्ट्रिप ग्रब्स के प्रत्यक्ष हेरफेर का उपयोग किए बिना लेबल आकार के बेहतर नियंत्रण कैसे प्राप्त करें, हालांकि ऐसा करने के लिए labeller फ़ंक्शन लिखने का कोई तरीका हो सकता है।

हम उदाहरण के लिए अंतर्निहित mtcars डेटा फ्रेम का उपयोग करेंगे। सबसे पहले, हम कॉलम जोड़ देंगे जो फ़ेसटिंग और लेबलिंग दोनों के लिए उपयोग किए जाएंगे। हम cyl द्वारा पहलू करेंगे, लेकिन हम उस पहलू के लिए सिलेंडरों की संख्या प्रदर्शित करने के लिए लेबल की पहली पंक्ति और उस पहलू में डेटा बिंदुओं की संख्या प्रदर्शित करने के लिए दूसरी पंक्ति चाहते हैं। ऐसा करने के लिए, हम mtcars में दो नए कॉलम बनाएंगे, जिन्हें Label1 और Label2 कहा जाता है जिसे हम पहलू लेबल की प्रत्येक पंक्ति बनाने के लिए उपयोग करेंगे। हम ग्राफ में इच्छित लेबल प्राप्त करने के लिए इन दो कॉलमों से पहलू करेंगे। (Label3Label2 के समान है, लेकिन सुपरस्क्रिप्ट के बजाय सबस्क्रिप्ट उपयोग करता है, यह केवल मामलों आप साजिश पैनल के शीर्ष करने के लिए दूसरी पंक्ति के नीचे से दूरी को बदलना चाहते हैं।)

Label1 और Label2 पाठ हैं , लेकिन वे अभिव्यक्ति के रूप में हैं ताकि हम साजिश बनाते समय छोटे सबस्क्रिप्टेड टेक्स्ट प्राप्त करने के लिए label_parsed का उपयोग कर सकें।

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) 

अब हम साजिश बना सकते हैं। Label1 और Label2 द्वारा फ़ेसटिंग हमें दो पंक्तियां देता है। चूंकि हमने Label2 के लिए एक सबस्क्रिप्टेड अभिव्यक्ति बनाई है, इसलिए जब हम पहलू लेबल करने के लिए label_parsed का उपयोग करते हैं तो यह एक छोटे फ़ॉन्ट में प्रस्तुत किया जाता है। मैं को Label1 के सापेक्ष थोड़ा बड़ा होने के लिए पसंद करूंगा, लेकिन इस (हैकी) विधि के साथ इसे नियंत्रित करने का कोई तरीका नहीं है। इसके अलावा, हालांकि element_text में lineheight तर्क है, ggplot इसका सम्मान नहीं कर रहा है। नतीजतन, मैंने दो लेबलों के बीच की जगह को कम करने के लिए स्ट्रिप लेबल के लिए मैन्युअल रूप से लाइनहाइट रीसेट कर दिया है।

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

संबंधित मुद्दे