कैसे अलग आकार और रंग के साथ एक ggplot2 उपशीर्षक जोड़ने के लिए?


88

मैं 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

मुझे नहीं पता कि ggplot2 पर hjust और vjust पर अनुमान लगाने की संख्या का उपयोग करने से कैसे बचें? वहाँ एक उपशीर्षक डाल करने के लिए एक बेहतर तरीका है (न सिर्फ \ n का उपयोग कर रहा है, लेकिन विभिन्न पाठ रंग और आकार के साथ एक उपशीर्षक)?

मैं एक पीडीएफ फाइल के लिए ggsave के साथ उपयोग करने में सक्षम होने की जरूरत है।

यहाँ दो संबंधित प्रश्न हैं:

R में प्लॉट क्षेत्र के बाहर फुटनोट उद्धरण जोड़ें?

मैं एक उपशीर्षक कैसे जोड़ सकता हूं और आर में ggplot भूखंडों के फ़ॉन्ट आकार को बदल सकता हूं?

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


लिनक्स पर मेरे लिए vjust = -33 ने काम किया। मुझे पता है कि उप का मतलब भूखंड से नीचे जाना है, लेकिन यह एकमात्र तरीका था जो मुझे मिला था।
माइग्रेन

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

2
@hrbrmstr का उत्तर आजकल जाने का रास्ता लगता है
andschar

जवाबों:


102

नवीनतम ggplot2 बिल्ड (यानी, 2.1.0.9000 या नया) में उपशीर्षक और नीचे-प्लॉट कैप्शन में अंतर्निहित कार्यक्षमता है। इसका मतलब है कि आप यह कर सकते हैं:

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

त्रुटि (फ़ंक्शन (el, elname)): "plot.subtitle" एक मान्य थीम तत्व स्थान नहीं है।
Luís de Sousa

1
कृपया जवाब पढ़ें: "नवीनतम ggplot2 बिल्ड (यानी, 2.1.0.9000 या नया)"
hrbrmstr

75

इस उत्तर ggplot2 संस्करण को अनदेखा करें 2.2.0 में शीर्षक और उपशीर्षक कार्यक्षमता है। नीचे @ hrbrmstr का उत्तर देखें


आप विभिन्न आकारों को प्राप्त करने के लिए नेस्टेड atopफ़ंक्शन का उपयोग कर सकते expressionहैं।

EDIT 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))

यहाँ छवि विवरण दर्ज करें


10
नमस्ते, यह एक अद्भुत समाधान है। मैं इसका उपयोग करना चाहूंगा लेकिन इसके बजाय atop(italic("Location")मैं एक वस्तु रखना चाहूंगा atop(italic(my_string_vector):। मैंने कोशिश की कि लेकिन तब उपशीर्षक का मूल्यांकन (my_string_vector) कर दिया जाए । इस मूल्य को स्ट्रिंग मान का उपयोग करने के लिए कैसे मजबूर करें और प्रदान किए गए पाठ का शाब्दिक रूप से इलाज न करें?
कोनराड

1
अगर आपको bquoteइसके बजाय चर का उपयोग करने में परेशानी हो रही है expression, तो आपको यहाँ
toto_tico

3
@Konrad वस्तुओं का उपयोग करने के लिए, वस्तुओं को इसके expressionसाथ बदलें bquoteऔर लपेटें .(), इस तरह, "main.title" नामक एक वस्तु में संग्रहीत मुख्य शीर्षक के लिए और "sub.title" नामक एक वस्तु में संग्रहीत उपशीर्षक के लिए: ggtitle(bquote(atop(.(main.title), atop(italic(.(sub.title)), "")))) क्रेडिट Didedisis को जाता है यहां एलफर्ट्स का जवाब: stackoverflow.com/questions/19957536/…
coip

10

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


यह भी अंतिम के बिना काम करता है , ""- उस भाग के लिए क्या है?
n

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

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

ऐसा प्रतीत होता है कि @ SandyMuspratt का उत्तर संशोधित होने के बाद मैंने अपना उत्तर मेरे जैसे कोड को प्रतिबिंबित करने के लिए पोस्ट किया। :-)
एरेन कैंब्रिज

9

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

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()

यहाँ छवि विवरण दर्ज करें


8

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

लघु संपादन: ggplot2 v2.0.0 को अद्यतन करना

# 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

यहाँ छवि विवरण दर्ज करें


3

आप ग्रिड में लपेटें साजिश का उपयोग कर सकते हैं। व्यवस्थित करें और एक कस्टम ग्रिड-आधारित शीर्षक पास करें,

यहाँ छवि विवरण दर्ज करें

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)

Ggplot के वर्तमान संस्करण क्रमशः opts और theme_text के बजाय विषय और तत्व_टेक्स्ट का उपयोग करते हैं। इसके अलावा, ggplotGrob का दृष्टिकोण ग्रिडएक्स्ट्रा (ग्रिडएक्स्ट्रा_0.8.1) और ggplot2 (ggplot2_0.9.3.1) के वर्तमान संस्करण में विफल होता दिख रहा है
russellpierra

2

आपने देखा होगा कि सैंडी का कोड "रेनफॉल" के लिए बोल्ड शीर्षक नहीं देता है - इस बोल्ड को बनाने का निर्देश थीम () फंक्शन के बजाय टॉप () फ़ंक्शन के भीतर होना चाहिए।

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))

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.