वहाँ ggplot2 में किंवदंती वस्तुओं के बीच अंतर को बदलने का एक तरीका है?


120

वहाँ ggplot2 में किंवदंती वस्तुओं के बीच अंतर को बदलने का एक तरीका है? मेरे पास वर्तमान में है

legend.position ="top" 

जो स्वचालित रूप से एक क्षैतिज किंवदंती पैदा करता है। हालांकि, आइटम की रिक्ति एक साथ बहुत करीब है और मैं सोच रहा हूं कि उन्हें कैसे अलग करना है।


यह इस के लिए एक मौजूदा समाधान है कि अब optsमूल्यह्रास है उपयोगी होगा ।
भू


3
तुंग का जवाब, वर्तमान में इस धागे के नीचे, जुलाई 2018 अपडेट है। कीड़े को ठीक कर दिया गया है और ऊपर के पास्टबिन में से एक की तरह हैकी वर्कअराउंड की अब जरूरत नहीं है।
पैट्रिक टीटी

जवाबों:


90

ggplot2 v3.0.0जुलाई 2018 में जारी किया गया कार्य संशोधित करने के विकल्प हैं legend.spacing.x, legend.spacing.yऔर legend.text

उदाहरण: किंवदंती कुंजियों के बीच क्षैतिज रिक्ति बढ़ाना

library(ggplot2)

ggplot(mtcars, aes(factor(cyl), fill = factor(cyl))) + 
  geom_bar() +
  coord_flip() +
  scale_fill_brewer("Cyl", palette = "Dark2") +
  theme_minimal(base_size = 14) +
  theme(legend.position = 'top', 
        legend.spacing.x = unit(1.0, 'cm'))

नोट: यदि आप केवल किंवदंती पाठ के दाईं ओर रिक्ति का विस्तार करना चाहते हैं, तो उपयोग करें stringr::str_pad()

उदाहरण: लीजेंड की लेबल्स को नीचे की ओर ले जाएं और वर्टिकल स्पेसिंग बढ़ाएं

ggplot(mtcars, aes(factor(cyl), fill = factor(cyl))) + 
  geom_bar() +
  coord_flip() +
  scale_fill_brewer("Cyl", palette = "Dark2") +
  theme_minimal(base_size = 14) +
  theme(legend.position = 'top', 
        legend.spacing.x = unit(1.0, 'cm'),
        legend.text = element_text(margin = margin(t = 10))) +
  guides(fill = guide_legend(title = "Cyl",
                             label.position = "bottom",
                             title.position = "left", title.vjust = 1)) 

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

ggplot(mtcars, aes(mpg, wt)) +
  geom_point(aes(fill = hp), pch = I(21), size = 5)+
  scale_fill_viridis_c(guide = FALSE) +
  theme_classic(base_size = 14) +
  theme(legend.position = 'top', 
        legend.spacing.x = unit(0.5, 'cm'),
        legend.text = element_text(margin = margin(t = 10))) +
  guides(fill = guide_colorbar(title = "HP",
                               label.position = "bottom",
                               title.position = "left", title.vjust = 1,
                               # draw border around the legend
                               frame.colour = "black",
                               barwidth = 15,
                               barheight = 1.5)) 


ऊर्ध्वाधर किंवदंतियों के लिए , सेटिंग legend.key.sizeकेवल किंवदंती कुंजियों के आकार को बढ़ाती है, न कि उनके बीच ऊर्ध्वाधर स्थान

ggplot(mtcars) +
  aes(x = cyl, fill = factor(cyl)) +
  geom_bar() +
  scale_fill_brewer("Cyl", palette = "Dark2") +
  theme_minimal(base_size = 14) +
  theme(legend.key.size = unit(1, "cm"))

किंवदंती कुंजियों के बीच की दूरी बढ़ाने के लिए, legend-draw.rफ़ंक्शन के संशोधन की आवश्यकता है। अधिक जानकारी के लिए इस समस्या को देखें

# function to increase vertical spacing between legend keys
# @clauswilke
draw_key_polygon3 <- function(data, params, size) {
  lwd <- min(data$size, min(size) / 4)

  grid::rectGrob(
    width = grid::unit(0.6, "npc"),
    height = grid::unit(0.6, "npc"),
    gp = grid::gpar(
      col = data$colour,
      fill = alpha(data$fill, data$alpha),
      lty = data$linetype,
      lwd = lwd * .pt,
      linejoin = "mitre"
    ))
}

# register new key drawing function, 
# the effect is global & persistent throughout the R session
GeomBar$draw_key = draw_key_polygon3

ggplot(mtcars) +
  aes(x = cyl, fill = factor(cyl)) +
  geom_bar() +
  scale_fill_brewer("Cyl", palette = "Dark2") +
  theme_minimal(base_size = 14) +
  theme(legend.key = element_rect(color = NA, fill = NA),
        legend.key.size = unit(1.5, "cm")) +
  theme(legend.title.align = 0.5)


3
इस पर ध्यान दिलाने के लिए धन्यवाद। यह इतनी बड़ी नई सुविधा है, मैं हमेशा @ user2568648 के गंदे-फिक्स, हाहा का उपयोग कर रहा था!
तजेबो

1
किंवदंती कुंजियों के बीच ऊर्ध्वाधर रिक्ति बढ़ाने के लिए आपका कार्य एकमात्र समाधान है जो मैंने पाया है कि बिल्कुल मेरी इच्छा और उपयोग में आसानी के साथ काम करता है। धन्यवाद!
डोकोनकोक्ट

69

मुझे लगता है कि सबसे अच्छा विकल्प guide_legendभीतर उपयोग करना है guides:

p + guides(fill=guide_legend(
                 keywidth=0.1,
                 keyheight=0.1,
                 default.unit="inch")
      )

के उपयोग पर ध्यान दें default.unit, gridपैकेज लोड करने की आवश्यकता नहीं है ।


2
इसके लिए और अधिक उत्थान की आवश्यकता है, अन्य उत्तर पुराने हैं।
ब्रैंडन बर्टेल्सन

8
यह क्षैतिज किंवदंतियों के लिए काम कर सकता है। हालाँकि, प्लॉट के दाईं ओर मेरी खड़ी किंवदंती के लिए, यह केवल कुंजी की ऊँचाई को बढ़ाता है, न कि चाबियों के बीच की दूरी। मेरी किंवदंती कुंजी अभी भी एक दूसरे के बहुत करीब हैं।
मुहसिन जाहिद उगुर

9
Mushin कहते हैं, इस बात याद करते हैं, अन्य जवाब के साथ के रूप में, अगर पौराणिक कथा है VERTICAL यह कुंजी के बीच की जगह padding बिना कथा कुंजियों (जैसे रेखा खंड) फैला है।
पैट्रिक

Geom_line और geom_point के साथ अच्छी तरह से काम करता है।
नील्स होल्स्ट

45

एक साधारण फिक्स जो मैं क्षैतिज किंवदंतियों में स्थान जोड़ने के लिए उपयोग करता हूं, बस लेबल में रिक्त स्थान जोड़ें (नीचे निकालें देखें):

  scale_fill_manual(values=c("red","blue","white"),
                    labels=c("Label of category 1          ",
                             "Label of category 2          ",
                             "Label of category 3"))

13
यह अब तक का एकमात्र उत्तर है जो प्रश्न से संबंधित है! यह कई प्रविष्टियों के मामले में सहायक हो सकता है scale_fill_manual(values=values, labels=setNames(paste(labels, " "), entries)):।
सासचह

2
तकनीकी रूप से बहुत अच्छा नहीं है, खासकर जब आपको उन जगहों को कारक स्तरों में पेश करना पड़ता है, लेकिन यह एकमात्र काम करने वाला समाधान है।
पैट्रिक बुचर

2
या हम str_pad का उपयोग जीवन को थोड़ा आसान बनाने के लिए कर सकते हैं
Tung

37

अब पैकेज optsमें पदावनत किया जाता है, इसके बजाय ggplot2फ़ंक्शन themeका उपयोग किया जाना चाहिए:

library(grid) # for unit()
... + theme(legend.key.height=unit(3,"line"))
... + theme(legend.key.width=unit(3,"line"))

18
यह समाधान उन दोनों के बीच रिक्ति के विपरीत बक्से की ऊंचाई / चौड़ाई को बदल देता है।
बेर्क यू।

25

एक किंवदंती में प्रविष्टियों के बीच रिक्ति जोड़ने के लिए, विषय तत्व के मार्जिन को समायोजित करें legend.text

प्रत्येक लीजेंड लेबल के दाईं ओर 30pt स्थान जोड़ने के लिए (क्षैतिज कथा के लिए उपयोगी हो सकता है):

p + theme(legend.text = element_text(
    margin = margin(r = 30, unit = "pt")))

प्रत्येक लीजेंड लेबल के बाईं ओर 30pt स्थान जोड़ने के लिए (एक ऊर्ध्वाधर कथा के लिए उपयोगी हो सकता है):

p + theme(legend.text = element_text(
    margin = margin(l = 30, unit = "pt")))

किसी ggplot2वस्तु के लिए p। कीवर्ड हैं legend.textऔर margin

[संपादित करने के बारे में ध्यान दें: जब यह उत्तर पहली बार पोस्ट किया गया था, तो एक बग था। बग को अब ठीक कर दिया गया है]


3
बग को अब ठीक कर दिया गया है, यह स्वीकृत उत्तर होना चाहिए।
जियोकोमाई

1
इन मामलों पर जुलाई 2018 के अपडेट के लिए तुंग का जवाब भी देखें।
PatrickT

17

लगता है कि सबसे अच्छा तरीका (2018 में) वस्तु के legend.key.sizeतहत उपयोग करना themeहै। (जैसे, यहाँ देखें )।

#Set-up:
    library(ggplot2)
    library(gridExtra)

    gp <- ggplot(data = mtcars, aes(mpg, cyl, colour = factor(cyl))) +
        geom_point()

यदि आप उपयोग कर रहे हैं तो यह वास्तविक आसान है theme_bw():

  gpbw <- gp + theme_bw()

#Change spacing size:

  g1bw <- gpbw + theme(legend.key.size = unit(0, 'lines'))
  g2bw <- gpbw + theme(legend.key.size = unit(1.5, 'lines'))
  g3bw <- gpbw + theme(legend.key.size = unit(3, 'lines'))

  grid.arrange(g1bw,g2bw,g3bw,nrow=3)

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

हालाँकि, यह अन्यथा बहुत अच्छी तरह से काम नहीं करता है (जैसे, यदि आपको अपने लेजेंड प्रतीक पर ग्रे बैकग्राउंड की आवश्यकता है):

  g1 <- gp + theme(legend.key.size = unit(0, 'lines'))
  g2 <- gp + theme(legend.key.size = unit(1.5, 'lines'))
  g3 <- gp + theme(legend.key.size = unit(3, 'lines'))

  grid.arrange(g1,g2,g3,nrow=3)

#Notice that the legend symbol squares get bigger (that's what legend.key.size does). 

#Let's [indirectly] "control" that, too:
  gp2 <- g3
  g4 <- gp2 + theme(legend.key = element_rect(size = 1))
  g5 <- gp2 + theme(legend.key = element_rect(size = 3))
  g6 <- gp2 + theme(legend.key = element_rect(size = 10))

  grid.arrange(g4,g5,g6,nrow=3)   #see picture below, left

ध्यान दें कि सफेद वर्ग किंवदंती शीर्षक को अवरुद्ध करना शुरू कर देता है (और अंततः ग्राफ ही यदि हम मूल्य में वृद्धि करते रहे)।

  #This shows you why:
    gt <- gp2 + theme(legend.key = element_rect(size = 10,color = 'yellow' ))

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

उपरोक्त समस्या को ठीक करने के लिए मुझे कोई काम नहीं मिला है ... यदि आपको कोई विचार आता है, तो मुझे टिप्पणियों में बताएं, और मैं तदनुसार अपडेट करूंगा!

  • मुझे आश्चर्य है कि अगर चीजों को फिर से परत करने का कोई तरीका है $layers...

legend.keyपारदर्शी बनाएं :theme(legend.key = element_rect(size = 30,color=alpha("transparent",0)))
उकोस्टियोपैथ

1
यह सबसे सरल उत्तर था और imo का उपयोग करना सबसे आसान था
Blacklivesmatter

14

Ggplot2 पर Koshke के काम और उनके ब्लॉग ( Koshke के ब्लॉग ) से

... + theme(legend.key.height=unit(3,"line")) # Change 3 to X
... + theme(legend.key.width=unit(3,"line")) # Change 3 to X

theme_get()अन्य संपादन योग्य किंवदंती विशेषताओं को देखने के लिए कंसोल में लिखें ।


12
सुझाव के लिए धन्यवाद और कोशे के ब्लॉग के लिए लिंक! हालांकि दुर्भाग्य से यह बक्से के आकार को बदलने के लिए लगता है लेकिन वस्तुओं के बीच अंतर नहीं है।
ओवरफ्लो नाम

आप कुछ प्रकार के ओवरलेइंग ग्रोब के साथ इसे "नकली" करने में सक्षम हो सकते हैं। लेकिन मुझे नहीं लगता कि किंवदंती के अंदर अतिरिक्त रिक्ति पाने का एक तरीका है। यह केवल मैं ggplot2 की मेलिंग सूची में मिल सकता है इसके बारे में उल्लेख है: groups.google.com/forum/?fromgroups#!topic/ggplot2/PhkJpP8zJuM
ब्रैंडन Bertelsen

2
मैं इसका उपयोग किंवदंतियों के बीच अंतर को सफलतापूर्वक बढ़ाने के लिए कर सकता हूं। नकारात्मक संख्याओं का उपयोग करने से किंवदंतियों के बीच अंतर कम करने में मदद मिली।
नोवा

5

इनमें से किसी का भी उपयोग करें

legend.spacing = unit(1,"cm")
legend.spacing.x = unit(1,"cm")
legend.spacing.y = unit(1,"cm")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.