Ggplot2 में अलग-अलग पहलू पर पाठ की व्याख्या


150

मैं निम्नलिखित कोड के साथ भूखंड के अंतिम पहलू पर कुछ पाठ को एनोटेट करना चाहता हूं:

library(ggplot2)
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p <- p + facet_grid(. ~ cyl)
p <- p + annotate("text", label = "Test", size = 4, x = 15, y = 5)
print(p)

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

लेकिन यह कोड हर पहलू पर पाठ को एनोटेट करता है। यदि आप मुझे केवल एक पहलू पर एनोटेट पाठ प्राप्त करने के लिए मार्गदर्शन करते हैं, तो मैं बहुत सराहना करूंगा।


1
मेरा मानना ​​है कि यह अभी तक लागू नहीं हुआ है , इसलिए मुझे संदेह है कि आपको पाठ के साथ एक डेटा फ्रेम और फेसिंग चर के लिए एक कॉलम बनाने की कोशिश की गई और सही तरीके का सहारा लेना होगा।
जोरन

जवाबों:


144

आमतौर पर आप ऐसा कुछ करेंगे:

ann_text <- data.frame(mpg = 15,wt = 5,lab = "Text",
                       cyl = factor(8,levels = c("4","6","8")))
p + geom_text(data = ann_text,label = "Text")

यह कारक चर को पूरी तरह से निर्दिष्ट किए बिना काम करना चाहिए, लेकिन शायद कुछ चेतावनी फेंक देगा:

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


2
जब मैं अपने faceted प्लॉट पर geom_text () का उपयोग करने का प्रयास करता हूं, तो मैं कुछ धुंधले लेबल में भागता हूं। यह यहाँ पर चर्चा की गई एक ही समस्या है ( group.google.com/forum/?fromgroups=# -topic/ggplot2/evsbeBT48M4 ), और एनोटेट ("पाठ", ...) का उपयोग करके हल किया गया था। क्या किसी और को geom_text () के साथ धुंधले लेबल मिलते हैं?
मार्गरेट

6
@ मार्गरेट आमतौर पर, ऐसा इसलिए है क्योंकि आपने गलती से ggplot को अपने मूल डेटा फ्रेम में प्रत्येक पंक्ति के लिए प्रत्येक लेबल की एक प्रतिलिपि (अंक, रेखाओं, आदि के साथ एक) की साजिश करने के लिए कहा है। ध्यान दें कि मैं geom_textकेवल एक पंक्ति के साथ एक अलग डेटा फ़्रेम पास करता हूं ।
जोरान

3
ठीक है, मुझे लगता है कि धन्यवाद मिला। क्या होगा यदि आप अपने अलग प्लॉट पर 3 अलग-अलग लेबल लगाना चाहते हैं? मैंने कई पंक्तियों के साथ एक डेटाफ़्रेम की कोशिश की, जैसे कि मेरे पास प्रत्येक पहलू था, और प्रत्येक पंक्ति में अद्वितीय लेबल। शायद मुझे इसे एक अलग प्रश्न के रूप में शुरू करना चाहिए।
मार्गरेट

8
आपके समाधान के लिए धन्यवाद। मैं सोच रहा हूं कि क्या मैं भी इसका इस्तेमाल कर सकता हूं annotate()...?
ध्रुवीकरण करें

2
@ user3420448 वही, आपको बस प्रत्येक मुखर चर के लिए मान निर्दिष्ट करना होगा।
जोरान १५'१

106

यहाँ पाठ एनोटेशन के बिना प्लॉट है:

library(ggplot2)

p <- ggplot(mtcars, aes(mpg, wt)) +
  geom_point() +
  facet_grid(. ~ cyl) +
  theme(panel.spacing = unit(1, "lines"))
p

पाठ एनोटेशन के बिना साजिश

पाठ एनोटेशन को होल्ड करने के लिए एक अतिरिक्त डेटा फ्रेम बनाते हैं:

dat_text <- data.frame(
  label = c("4 cylinders", "6 cylinders", "8 cylinders"),
  cyl   = c(4, 6, 8)
)
p + geom_text(
  data    = dat_text,
  mapping = aes(x = -Inf, y = -Inf, label = label),
  hjust   = -0.1,
  vjust   = -1
)

किनारों पर पाठ एनोटेशन के साथ प्लॉट करें

वैकल्पिक रूप से, हम प्रत्येक लेबल की स्थिति को मैन्युअल रूप से निर्दिष्ट कर सकते हैं:

dat_text <- data.frame(
  label = c("4 cylinders", "6 cylinders", "8 cylinders"),
  cyl   = c(4, 6, 8),
  x     = c(20, 27.5, 25),
  y     = c(4, 4, 4.5)
)

p + geom_text(
  data    = dat_text,
  mapping = aes(x = x, y = y, label = label)
)

मैन्युअल रूप से तैनात पाठ लेबल के साथ प्लॉट करें

हम प्लॉट को दो पहलुओं में भी लेबल कर सकते हैं:

dat_text <- data.frame(
  cyl   = c(4, 6, 8, 4, 6, 8),
  am    = c(0, 0, 0, 1, 1, 1)
)
dat_text$label <- sprintf(
  "%s, %s cylinders",
  ifelse(dat_text$am == 0, "automatic", "manual"),
  dat_text$cyl
)
p +
  facet_grid(am ~ cyl) +
  geom_text(
    size    = 5,
    data    = dat_text,
    mapping = aes(x = Inf, y = Inf, label = label),
    hjust   = 1.05,
    vjust   = 1.5
  )

दो चर द्वारा पहलू

टिप्पणियाँ:

  • आप उपयोग कर सकते हैं -Infऔर Infएक पैनल के किनारों पर पाठ स्थिति।
  • आप पाठ औचित्य को समायोजित hjustऔर उपयोग कर सकते हैं vjust
  • टेक्स्ट लेबल डेटा फ़्रेम dat_textमें एक कॉलम होना चाहिए जो आपके facet_grid()या उसके साथ काम करता है facet_wrap()

6
यह उत्तर स्वीकृत उत्तर से बेहतर है (स्पष्ट रूप से दोनों के बीच 5 साल का अंतर) प्रत्येक चरण के माध्यम से यह स्पष्ट रूप से कैसे चलता है। इसके अलावा अधिक स्पष्टता और स्पष्टीकरण।
ब्रैंडन

1
यदि आप पाठ को कई पंक्तियों में जोड़ना चाहते हैं, तो सुनिश्चित करें कि colnames()पाठ में आपका data.frameडेटा से संबंधित डेटा से मिलान करना है।
कोट्स

जब मैं अपने किसी एक पहलू के लिए ऐसा करने की कोशिश करता हूं, तो एनोटेशन दिखाता है, लेकिन वास्तविक बिंदु निकल गए हैं (या अस्पष्ट?)।
बेन जी

बेन जी, आप अपना कोड और आंकड़ा साझा करने के लिए एक नया पोस्ट बनाने पर विचार कर सकते हैं।
कामिल स्लोविकॉस्की

36

यदि कोई रिपोर्ट या प्रकाशन के लिए पहलुओं को लेबल करने का आसान तरीका ढूंढ रहा है , तो egg( CRAN ) पैकेज में निफ्टी tag_facet()और tag_facet_outside()फ़ंक्शंस हैं।

library(ggplot2)

p <- ggplot(mtcars, aes(qsec, mpg)) + 
  geom_point() + 
  facet_grid(. ~ am) +
  theme_bw(base_size = 12)

# install.packages('egg', dependencies = TRUE)
library(egg)

अंदर टैग करें

चूक

tag_facet(p)

नोट: यदि आप स्ट्रिप टेक्स्ट और बैकग्राउंड को रखना चाहते हैं, तो मूल फ़ंक्शन से जोड़ने strip.textऔरstrip.background वापस लाने themeया हटाने का प्रयास करें ।theme(strip.text = element_blank(), strip.background = element_blank())tag_facet()

tag_facet <- function(p, open = "(", close = ")", tag_pool = letters, x = -Inf, y = Inf, 
                      hjust = -0.5, vjust = 1.5, fontface = 2, family = "", ...) {

  gb <- ggplot_build(p)
  lay <- gb$layout$layout
  tags <- cbind(lay, label = paste0(open, tag_pool[lay$PANEL], close), x = x, y = y)
  p + geom_text(data = tags, aes_string(x = "x", y = "y", label = "label"), ..., hjust = hjust, 
                vjust = vjust, fontface = fontface, family = family, inherit.aes = FALSE) 
}

शीर्ष दाईं ओर संरेखित करें और रोमन अंकों का उपयोग करें

tag_facet(p, x = Inf, y = Inf, 
          hjust = 1.5,
          tag_pool = as.roman(1:nlevels(factor(mtcars$am))))

नीचे बाएँ संरेखित करें और बड़े अक्षरों का उपयोग करें

tag_facet(p, 
          x = -Inf, y = -Inf, 
          vjust = -1,
          open = "", close = ")",
          tag_pool = LETTERS)

अपने स्वयं के टैग परिभाषित करें

my_tag <- c("i) 4 cylinders", "ii) 6 cyls")
tag_facet(p, 
          x = -Inf, y = -Inf, 
          vjust = -1, hjust = -0.25,
          open = "", close = "",
          fontface = 4,
          size = 5,
          family = "serif",
          tag_pool = my_tag)

बाहर टैग

p2 <- ggplot(mtcars, aes(qsec, mpg)) + 
  geom_point() + 
  facet_grid(cyl ~ am, switch = 'y') +
  theme_bw(base_size = 12) +
  theme(strip.placement = 'outside')

tag_facet_outside(p2)

संपादित करें : स्टिकबेलर पैकेज का उपयोग करके एक और विकल्प जोड़ना

- `.n` numbers the facets numerically: `"1"`, `"2"`, `"3"`...
- `.l` numbers the facets using lowercase letters: `"a"`, `"b"`, `"c"`...
- `.L` numbers the facets using uppercase letters: `"A"`, `"B"`, `"C"`...
- `.r` numbers the facets using lowercase Roman numerals: `"i"`, `"ii"`, `"iii"`...
- `.R` numbers the facets using uppercase Roman numerals: `"I"`, `"II"`, `"III"`...

# devtools::install_github("rensa/stickylabeller")
library(stickylabeller)

ggplot(mtcars, aes(qsec, mpg)) + 
  geom_point() + 
  facet_wrap(. ~ am, 
             labeller = label_glue('({.l}) am = {am}')) +
  theme_bw(base_size = 12)

रेप्रेक्स पैकेज (v0.2.1) द्वारा बनाया गया


2
स्रोत का कहना है कि "एक डमी टेक्स्ट लेयर को एक ggplot में लेबल के पहलुओं को जोड़ता है और चेहरे की स्ट्रिप्स को रिक्त करने के लिए सेट करता है।" एर्गो, यदि आपके पास कस्टम फ़ेसिट लेबल स्ट्रिप्स हैं जो आप खोना नहीं चाहते हैं, तो tag_facetnixing द्वारा स्क्रिप्ट को संपादित करेंstrip.text = element_blank()
CrunchyTopping

@ क्रंचीचोटिंग यह वास्तव में टोपी थी जिसे मैं ढूंढ रहा था, लेकिन यह मेरे लिए काम नहीं करता है:Warning: Ignoring unknown parameters: strip.text
efrem

1
ऊपर मेरे मुद्दों का जवाब देने के लिए ... यह पोस्ट अच्छी तरह से बताती है कि स्ट्रिप्स कैसे रखें: stackoverflow.com/a/56064130/3609450
efrem

22

मुझे लगता है कि लैब के ऊपर के जवाब के लिए = "टेक्स्ट" बेकार है, नीचे दिया गया कोड भी ठीक है।

ann_text <- data.frame(mpg = 15,wt = 5,
                       cyl = factor(8,levels = c("4","6","8")))
p + geom_text(data = ann_text,label = "Text" )

हालाँकि यदि आप अलग-अलग सब-ग्राफ में अलग-अलग लेबल लगाना चाहते हैं, तो यह इस तरह से ठीक होगा:

ann_text <- data.frame(mpg = c(14,15),wt = c(4,5),lab=c("text1","text2"),
                       cyl = factor(c(6,8),levels = c("4","6","8")))
p + geom_text(data = ann_text,aes(label =lab) )

7
आपको गहराई से समझाना चाहिए कि पहले से दिए गए और स्वीकृत जवाब की तुलना में आपका समाधान क्या प्रदान करता है।
साशा वुल्फ

3
धन्यवाद, यह विभिन्न उप-ग्राफ़ को लेबल करने के लिए उपयोगी था।
डेथकिल 14

किसी कारण से, जब मैं ऐसा करता हूं, तो यह कारकों (= 2) और सिलेंडर = 3 के लिए (खाली) पहलुओं को जोड़ता है।
एमुद्रक

6

ज़ोरान के उत्कृष्ट उत्तर पर थोड़ा विस्तार करते हुए, यह स्पष्ट करने के लिए कि लेबल डेटाफ्रेम कैसे काम करता है।

आप क्रमशः "mpg" और "wt" को x और y निर्देशांक के रूप में सोच सकते हैं, (मुझे इसका नाम बदलने से मूल चर नामों पर नज़र रखना आसान लगता है, जैसा कि कामिल के उत्कृष्ट उत्तर में भी है)। आपको प्रति लेबल एक पंक्ति की आवश्यकता है, और "सिलेंडर" कॉलम दिखाता है कि प्रत्येक पंक्ति किस पहलू से संबद्ध है।

ann_text<-data.frame(mpg=c(25,15),wt=c(3,5),cyl=c(6,8),label=c("Label 1","Label 2"))

ann_text
>  mpg wt cyl  label
>  25  3   6   Label 1
>  15  5   8   Label 2

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p <- p + facet_grid(. ~ factor(cyl))
p + geom_text(data = ann_text,label=ann_text$label)

लेबल के साथ साजिश


2

मुझे eggपैकेज के बारे में पता नहीं था , इसलिए यहां एक सादा ggplot2पैकेज समाधान है

library(tidyverse)
library(magrittr)
Data1=data.frame(A=runif(20, min = 0, max = 100), B=runif(20, min = 0, max = 250), C=runif(20, min = 0, max = 300))
Data2=data.frame(A=runif(20, min = -10, max = 50), B=runif(20, min = -5, max = 150), C=runif(20, min = 5, max = 200))
bind_cols(
Data1 %>% gather("Vars","Data_1"),
Data2 %>% gather("Vars","Data_2")
) %>% select(-Vars1) -> Data_combined
Data_combined %>%
  group_by(Vars) %>%
  summarise(r=cor(Data_1,Data_2),
            r2=r^2,
            p=(pt(abs(r),nrow(.)-2)-pt(-abs(r),nrow(.)-2))) %>%
  mutate(rlabel=paste("r:",format(r,digits=3)),
         plabel=paste("p:",format(p,digits=3))) ->
  label_df 
label_df %<>% mutate(x=60,y=190)
Data_combined %>%
  ggplot(aes(x=Data_1,y=Data_2,color=Vars)) +
  geom_point() + 
  geom_smooth(method="lm",se=FALSE) +
  geom_text(data=label_df,aes(x=x,y=y,label=rlabel),inherit.aes = FALSE) + 
  geom_text(data=label_df,aes(x=x,y=y-10,label=plabel),inherit.aes = FALSE) + 
    facet_wrap(~ Vars)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.