Geom_point में लेबल बिंदु


178

मैं जिस डेटा के साथ खेल रहा हूं वह नीचे सूचीबद्ध इंटरनेट स्रोत से आता है

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep=",")

मैं क्या करना चाहता हूं, इस तालिका से दो मीट्रिक की तुलना में एक 2 डी अंक ग्राफ बना है, जिसमें प्रत्येक खिलाड़ी ग्राफ पर एक डॉट का प्रतिनिधित्व करता है। मेरे पास निम्नलिखित कोड हैं:

nbaplot <- ggplot(nba, aes(x= MIN, y= PTS, colour="green", label=Name)) + 
                  geom_point() 

यह मुझे निम्नलिखित देता है:

एनबीए प्लॉट

मुझे जो चाहिए वह डॉट्स के ठीक बगल में खिलाड़ी के नाम का एक लेबल है। मुझे लगा कि ggplot के सौंदर्यशास्त्र में लेबल फ़ंक्शन मेरे लिए ऐसा करेगा, लेकिन यह नहीं हुआ।

मैं भी कोशिश की text()समारोह और textxy()समारोह से library(calibrate), न तो जिनमें से ggplot साथ काम करने के लिए प्रकट होता है।

मैं इन बिंदुओं में नाम लेबल कैसे जोड़ सकता हूं?

जवाबों:


280

प्रयोग करें geom_text, aesलेबल के साथ । आप hjust, vjustपाठ की स्थिति को समायोजित करने के लिए खेल सकते हैं ।

ggplot(nba, aes(x= MIN, y= PTS, colour="green", label=Name))+
  geom_point() +geom_text(aes(label=Name),hjust=0, vjust=0)

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

संपादित करें: एक निश्चित सीमा के ऊपर केवल मान लेबल करें:

  ggplot(nba, aes(x= MIN, y= PTS, colour="green", label=Name))+
  geom_point() +
  geom_text(aes(label=ifelse(PTS>24,as.character(Name),'')),hjust=0,vjust=0)

सशर्त लेबल के साथ चार्ट


4
क्या लेबल्स को इधर-उधर शिफ्ट करने का कोई तरीका है (कभी उन्हें थोड़ा चकमा दें), ताकि वे ओवरलैप न हों?
थॉमस ब्राउन

2
मुझे नहीं लगता कि कोई आसान उपाय है ggplot2। शायद यह आपकी मदद कर सकता है।
अगस्त्य १।

1
क्या किसी निश्चित मूल्य से ऊपर केवल अंक दर्ज करने का कोई तरीका है, उदाहरण के लिए उपरोक्त भूखंड पर पीटीएस 24 से अधिक है?
ONeillMB1

ठीक से 'चकमा देना', इस hjust = -0.1पर विचार करें कि मुद्रित बिंदुओं को कभी भी डेटा बिंदु से थोड़ा दूर किया जाए।
पैट्रिक

लेबल को चारों ओर स्थानांतरित करने के लिए, ggrepel पर विचार करें
होमर व्हाइट

92

ggrepelपैकेज ओवरलैपिंग पाठ लेबल एक दूसरे से दूर पीछे धकेलने के लिए महान काम करता है। आप या तो geom_label_repel()(पाठ के चारों ओर आयतें) या geom_text_repel()फ़ंक्शंस का उपयोग कर सकते हैं ।

library(ggplot2)
library(ggrepel)

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep = ",")

nbaplot <- ggplot(nba, aes(x= MIN, y = PTS)) + 
  geom_point(color = "blue", size = 3)

### geom_label_repel
nbaplot + 
  geom_label_repel(aes(label = Name),
                  box.padding   = 0.35, 
                  point.padding = 0.5,
                  segment.color = 'grey50') +
  theme_classic()

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

### geom_text_repel
# only label players with PTS > 25 or < 18
# align text vertically with nudge_y and allow the labels to 
# move horizontally with direction = "x"
ggplot(nba, aes(x= MIN, y = PTS, label = Name)) + 
  geom_point(color = dplyr::case_when(nba$PTS > 25 ~ "#1b9e77", 
                                      nba$PTS < 18 ~ "#d95f02",
                                      TRUE ~ "#7570b3"), 
             size = 3, alpha = 0.8) +
  geom_text_repel(data          = subset(nba, PTS > 25),
                  nudge_y       = 32 - subset(nba, PTS > 25)$PTS,
                  size          = 4,
                  box.padding   = 1.5,
                  point.padding = 0.5,
                  force         = 100,
                  segment.size  = 0.2,
                  segment.color = "grey50",
                  direction     = "x") +
  geom_label_repel(data         = subset(nba, PTS < 18),
                  nudge_y       = 16 - subset(nba, PTS < 18)$PTS,
                  size          = 4,
                  box.padding   = 0.5,
                  point.padding = 0.5,
                  force         = 100,
                  segment.size  = 0.2,
                  segment.color = "grey50",
                  direction     = "x") +
  scale_x_continuous(expand = expand_scale(mult = c(0.2, .2))) +
  scale_y_continuous(expand = expand_scale(mult = c(0.1, .1))) +
  theme_classic(base_size = 16)

संपादित करें:ggrepel लाइनों के साथ उपयोग करने के लिए , इसे और इसे देखें ।

2019-05-01 को रेप्रेक्स पैकेज ( v0.2.0 ) द्वारा बनाया गया ।


1
साफ! मुझे वास्तव में पहला प्लॉट पसंद है। मैंने अपने डेटा के साथ यह कोशिश की और मैं इस नतीजे से खुश हूं कि सिवाय इसके कि किंवदंती प्लॉट में दिखाए गए आकृतियों के बजाय "ए" दिखाती है। (मैं एक कारक के अनुसार अंक भेद करने के लिए एक सौंदर्य आकृति का उपयोग करता हूं)
मधुमक्खी आदमी

2
मैंने अब इस मुद्दे को (a) geom_label_repel stackoverflow.com/questions/12041042/… के बिना किसी प्लॉट की किंवदंती को निकालकर और फिर (b) इसे फिर से जोड़कर ग्रिडएक्स्ट्रा: ग्रिड के साथ जोड़ा। यदि आप एक सरल समाधान जानते हैं, तो मैं अभी भी इसकी सराहना करूंगा!
मधुमक्खी पालन

1
@beeguy: मुझे यकीन नहीं है कि आप जो पूछ रहे हैं वह मुझे मिल जाएगा, लेकिन मैंने हाल ही में ggplot2देव पर एक प्रतिबद्ध देखा है जो इसी तरह की चीज का उल्लेख करता है github.com/tidyverse/ggplot2/commit/… । आप अपनी समस्या को ठीक करने के लिए ggplot2& के दोनों देव संस्करण को स्थापित करने का प्रयास कर सकते ggrepelहैं
तुंग

1
@beeguy: fyi वहाँ भी lemonपैकेज है जो प्लॉट किंवदंती में हेरफेर करने में बहुत अच्छा है।
तुंग

1
टिप के लिए धन्यवाद
मधुमक्खी आदमी

10

उपर्युक्त उदाहरण के रूप में ifelse का उपयोग करने के बजाय, कोई डेटा को कुछ थ्रेशोल्ड मानों के आधार पर लेबल करने से पहले प्रीफ़िल्टर कर सकता है, यह प्लॉटिंग डिवाइस के लिए बहुत काम बचाता है:

xlimit <- 36
ylimit <- 24
ggplot(myData)+geom_point(aes(myX,myY))+
    geom_label(data=myData[myData$myX > xlimit & myData$myY> ylimit,], aes(myX,myY,myLabel))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.