2012-07-30 14 views
54

मैं वर्षा बारप्लॉट को बेहतर बनाने के लिए ggplot2 का उपयोग कर रहा हूं।विभिन्न आकार और रंग के साथ ggplot2 उपशीर्षक कैसे जोड़ें?

library(ggplot2) 
library(gridExtra) 
secu <- seq(1, 16, by=2) 
melt.d <- data.frame(y=secu, x=LETTERS[1:8]) 
m <- ggplot(melt.d, aes(x=x, y=y)) + 
    geom_bar(fill="darkblue") + 
    labs(x="Weather stations", y="Accumulated Rainfall [mm]") + 
    opts(axis.text.x=theme_text(angle=-45, hjust=0, vjust=1), 
     title=expression("Rainfall"), plot.margin = unit(c(1.5, 1, 1, 1), "cm"), 
     plot.title = theme_text(size = 25, face = "bold", colour = "black", vjust = 5)) 
z <- arrangeGrob(m, sub = textGrob("Location", x = 0, hjust = -3.5, vjust = -33, gp = gpar(fontsize = 18, col = "gray40"))) #Or guessing x and y with just option 
z 

मैं hjust और ggplot2 पर vjust पर अनुमान लगाने का नंबर का उपयोग कर से बचने के लिए पता नहीं कैसे:

यहाँ मैं क्या हासिल करना चाहते का एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण है? क्या उपशीर्षक डालने का कोई बेहतर तरीका है (न केवल \ n का प्रयोग करें, बल्कि विभिन्न टेक्स्ट रंग और आकार वाले उपशीर्षक)?

मुझे एक पीडीएफ फ़ाइल रखने के लिए ggsave के साथ उपयोग करने में सक्षम होना चाहिए।

Add a footnote citation outside of plot area in R?

How can I add a subtitle and change the font size of ggplot plots in R?

किसी भी मदद के लिए धन्यवाद:

यहाँ दो संबंधित सवाल कर रहे हैं।

+0

vjust = -33 के लिए काम किया मुझे लिनक्स पर। मुझे पता है कि सब साजिश के नीचे जाने के लिए है, लेकिन यह वही तरीका था जो मुझे चाहिए था। – Migue

+0

किसी कारण से यह मेरी साजिश को वास्तव में छोटा बनाता है और ग्राफ – zazu

+2

के नीचे एक विशाल स्थान बनाता है @hrbrmstr का उत्तर क्रमशः – andrasz

उत्तर

54

नवीनतम ggplot2 बनाता है (अर्थात, 2.1.0।9 000 या नए) में अंतर्निहित कार्यक्षमता के रूप में उपशीर्षक और नीचे-साजिश कैप्शन हैं। इसका मतलब है कि आप यह कर सकते हैं:

library(ggplot2) # 2.1.0.9000+ 

secu <- seq(1, 16, by=2) 
melt.d <- data.frame(y=secu, x=LETTERS[1:8]) 

m <- ggplot(melt.d, aes(x=x, y=y)) 
m <- m + geom_bar(fill="darkblue", stat="identity") 
m <- m + labs(x="Weather stations", 
       y="Accumulated Rainfall [mm]", 
       title="Rainfall", 
       subtitle="Location") 
m <- m + theme(axis.text.x=element_text(angle=-45, hjust=0, vjust=1)) 
m <- m + theme(plot.title=element_text(size=25, hjust=0.5, face="bold", colour="maroon", vjust=-1)) 
m <- m + theme(plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="black")) 
m 
+0

त्रुटि (फ़ंक्शन (एल, elname): "plot.subtitle" मान्य थीम तत्व नाम नहीं है। –

+0

कृपया उत्तर पढ़ें: _ "नवीनतम ggplot2 बनाता है (यानी, 2.1.0.9000 या नया)" _ – hrbrmstr

2

आप grid.arrange में भूखंड लपेटो का उपयोग करें और एक कस्टम ग्रिड आधारित शीर्षक दे सकते हैं,

enter image description here

library(ggplot2) 
library(gridExtra) 

p <- ggplot() + 
    theme(plot.margin = unit(c(0.5, 1, 1, 1), "cm")) 

tg <- grobTree(textGrob("Rainfall", y=1, vjust=1, gp = gpar(fontsize=25, face=2, col="black")), 
       textGrob("location", y=0, vjust=0, gp = gpar(fontsize=12, face=3, col="grey50")), 
       cl="titlegrob") 
heightDetails.titlegrob <- function(x) do.call(sum,lapply(x$children, grobHeight)) 

grid.arrange(p, top = tg) 
+0

ggplot उपयोग थीम के वर्तमान संस्करण और opts और theme_text के बजाय element_text जाने का तरीका प्रतीत होता है। इसके अलावा, ggplotGrob दृष्टिकोण gridExtra (gridExtra_0.8.1) और ggplot2 (ggplot2_0.9.3.1) के वर्तमान संस्करण में विफल होने लगता है – russellpierce

67

पर ध्यान न दें इस जवाबggplot2 संस्करण 2.2.0 शीर्षक और उपशीर्षक कार्यक्षमता है । @ Hrbrmstr का उत्तर below देखें।


आप एक expression अंदर नेस्टेड atop कार्यों का उपयोग विभिन्न आकारों प्राप्त करने के लिए कर सकता है। ggplot2 0.9.3

m <- ggplot(melt.d, aes(x=x, y=y)) + 
    geom_bar(fill="darkblue", stat = "identity") + 
    labs(x="Weather stations", y="Accumulated Rainfall [mm]") + 
    ggtitle(expression(atop("Rainfall", atop(italic("Location"), "")))) + 
    theme(axis.text.x = element_text(angle=-45, hjust=0, vjust=1), 
    #plot.margin = unit(c(1.5, 1, 1, 1), "cm"), 
    plot.title = element_text(size = 25, face = "bold", colour = "black", vjust = -1)) 

enter image description here

+0

धन्यवाद! यह सही काम करता है :) – Migue

+9

हाय, यह एक अद्भुत समाधान है। मैं इसका उपयोग करना चाहता हूं लेकिन 'एटॉप (इटालिक (" स्थान ") के बजाय 'मैं एक ऑब्जेक्ट रखना चाहता हूं:' एटॉप (इटैलिक (my_string_vector) '। मैंने कोशिश की लेकिन फिर उपशीर्षक का मूल्यांकन ** (my_string_vector) **। इस अभिव्यक्ति को स्ट्रिंग मान का उपयोग करने के लिए कैसे मजबूर करें और प्रदान किए गए पाठ का शाब्दिक रूप से इलाज न करें? – Konrad

+0

यह लेबल टाइल्स 'ylab' और 'xlab' –

7

के लिए

संपादित कोड अपडेट किया गया ऐसा प्रतीत होता है opts ggplot 2 0.9.1 और अब कार्यात्मक के रूप में मान्य नहीं है। यह मेरे लिए नवीनतम संस्करणों के साथ आज के रूप में काम करता है: + ggtitle(expression(atop("Top line", atop(italic("2nd line"), ""))))

+0

यह अंतिम के बिना भी काम करता है, "" - 'वह हिस्सा क्या है? – naught101

+0

मुझे मारता है। मैंने एक उदाहरण की प्रतिलिपि बनाई हो जिसे मैंने कहीं और देखा था। –

+0

शायद @ SandyMuspratt के उत्तर से ऊपर: पी - मैं इसे अब समझता हूं, 'एटॉप()' सलाखों के बिना एक अंश की तरह कुछ है। इसलिए पहले 'एटॉप()' को पहले के अंदर डालने से आपको उप-अंश मिलता है, पाठ आनुपातिक रूप से छोटा होता है। '" "उप-अंश का निचला भाग है। हालांकि यह अनावश्यक प्रतीत होता है - शायद 'atop() 'में दूसरे पैरामीटर, या कुछ के लिए एक डिफ़ॉल्ट खाली स्ट्रिंग है। – naught101

6

यह संस्करण gtable फ़ंक्शन का उपयोग करता है। यह शीर्षक में पाठ की दो पंक्तियों की अनुमति देता है। प्रत्येक पंक्ति का पाठ, आकार, रंग और फ़ॉन्ट चेहरे दूसरे से स्वतंत्र रूप से सेट किया जा सकता है। हालांकि, फ़ंक्शन केवल एक प्लॉट पैनल के साथ एक साजिश को संशोधित करेगा।

माइनर संपादित करें: v2.0.0 ggplot2 को अपडेट किया जा रहा

# The original plot 
library(ggplot2) 

secu <- seq(1, 16, by = 2) 
melt.d <- data.frame(y = secu, x = LETTERS[1:8]) 

m <- ggplot(melt.d, aes(x = x, y = y)) + 
    geom_bar(fill="darkblue", stat = "identity") + 
    labs(x = "Weather stations", y = "Accumulated Rainfall [mm]") + 
    theme(axis.text.x = element_text(angle = -45, hjust = 0, vjust = 1)) 


# The function to set text, size, colour, and face 
plot.title = function(plot = NULL, text.1 = NULL, text.2 = NULL, 
    size.1 = 12, size.2 = 12, 
    col.1 = "black", col.2 = "black", 
    face.1 = "plain", face.2 = "plain") { 

library(gtable) 
library(grid) 

gt = ggplotGrob(plot) 

text.grob1 = textGrob(text.1, y = unit(.45, "npc"), 
    gp = gpar(fontsize = size.1, col = col.1, fontface = face.1)) 
text.grob2 = textGrob(text.2, y = unit(.65, "npc"), 
    gp = gpar(fontsize = size.2, col = col.2, fontface = face.2)) 

text = matrix(list(text.grob1, text.grob2), nrow = 2) 
text = gtable_matrix(name = "title", grobs = text, 
    widths = unit(1, "null"), 
    heights = unit.c(unit(1.1, "grobheight", text.grob1) + unit(0.5, "lines"), unit(1.1, "grobheight", text.grob2) + unit(0.5, "lines"))) 

gt = gtable_add_grob(gt, text, t = 2, l = 4) 
gt$heights[2] = sum(text$heights) 

class(gt) = c("Title", class(gt)) 

gt 
} 

# A print method for the plot 
print.Title <- function(x) { 
    grid.newpage() 
    grid.draw(x) 
} 


# Try it out - modify the original plot 
p = plot.title(m, "Rainfall", "Location", 
    size.1 = 20, size.2 = 15, 
    col.1 = "red", col.2 = "blue", 
    face.2 = "italic") 

p 

enter image description here

1

आपने गौर किया होगा कि सैंडी के कोड "वर्षा" के लिए एक साहसिक शीर्षक का उत्पादन नहीं करता - बनाने के लिए अनुदेश यह बोल्ड थीम() फ़ंक्शन के बजाय atop() फ़ंक्शन के भीतर होना चाहिए।

ggplot(melt.d, aes(x=x, y=y)) + 
geom_bar(fill="darkblue", stat = "identity") + 
labs(x="Weather stations", y="Accumulated Rainfall [mm]") + 
ggtitle(expression(atop(bold("Rainfall"), atop(italic("Location"), "")))) + 
theme(axis.text.x = element_text(angle=-45, hjust=0, vjust=1), 
plot.title = element_text(size = 25, colour = "black", vjust = -1)) 

enter image description here

3

यह gtable को grobs जोड़ सकते हैं और एक फैंसी शीर्षक है कि रास्ता बनाने के लिए भी मुश्किल नहीं है,

library(ggplot2) 
library(grid) 
library(gridExtra) 
library(magrittr) 
library(gtable) 

p <- ggplot() + 
    theme(plot.margin = unit(c(0.5, 1, 1, 1), "cm")) 

lg <- list(textGrob("Rainfall", x=0, hjust=0, 
        gp = gpar(fontsize=24, fontfamily="Skia", face=2, col="turquoise4")), 
       textGrob("location", x=0, hjust=0, 
         gp = gpar(fontsize=14, fontfamily="Zapfino", fontface=3, col="violetred1")), 
      pointsGrob(pch=21, gp=gpar(col=NA, cex=0.5,fill="steelblue"))) 

margin <- unit(0.2, "line") 
tg <- arrangeGrob(grobs=lg, layout_matrix=matrix(c(1,2,3,3), ncol=2), 
        widths = unit.c(grobWidth(lg[[1]]), unit(1,"null")), 
        heights = do.call(unit.c, lapply(lg[c(1,2)], grobHeight)) + margin) 

grid.newpage() 
ggplotGrob(p) %>% 
    gtable_add_rows(sum(tg$heights), 0) %>% 
    gtable_add_grob(grobs=tg, t = 1, l = 4) %>% 
    grid.draw() 

enter image description here

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