R (जैसे ggplot2 के साथ) में मानचित्रों पर ओवरप्लेटिंग बिंदु - कैसे बिंदुओं को किनारे पर धकेलें, मूल पदों को चिह्नित करें, नज़दीकी बिंदुओं को मिलाएं…?


12

मुझे एक डेटाबेस मिला है जिसमें भाषाएं, उनके अनुदैर्ध्य और अक्षांश और एक विशेषता मान (या तो श्रेणी 1, श्रेणी 2 या दोनों - इस भूखंड में क्रमशः लाल, नीले और हरे रंग के रूप में चिह्नित हैं)। प्रति भाषा में तीन अंक हो सकते हैं और स्वाभाविक रूप से दो भाषा अंक एक दूसरे के बहुत करीब हो सकते हैं।

    name            longitude   latitude    sp_sum
1   Modern Armenian 45          40          both
2   Modern Armenian 45          40          both
3   Modern Armenian 45          40          spatial
4   Dieri           138         -28.1667    both
5   Dieri           138         -28.1667    both
6   Finnish         25.5577     64.7628     non-spatial
7   Crimean Tatar   28.1418     43.8398     spatial
8   Ese Ejja        -67.515     -11.7268    non-spatial
9   Makhuwa         38.8052     -14.8509    non-spatial
...

मैं आर पैकेज ggplot2 का उपयोग कर रहा हूं (यह वह है जिससे मैं सबसे अधिक परिचित हूं, इसलिए मैं इसका उपयोग करते हुए खुश रहूंगा - लेकिन अन्य समाधान भी स्वागत योग्य हैं)। यहां पिछले प्रयास से एक फसल है (कोड: नीचे देखें 1 ):

पिछले प्रयास से फसल

हर बिंदु के लिए, मैं (खुरदरा) स्थिति - और साथ ही मान - अभी भी दिखाई देना चाहूंगा। (यदि किसी एकल भाषा के लिए कई बिंदु हैं, तो वे संयुक्त हो सकते हैं।)

क्या कोई रास्ता है ...

  • ... बिंदुओं को साइड में स्थानांतरित करने के लिए बस इतना है कि वहाँ कोई overplotting नहीं है (कम बेतरतीब ढंग से, कहते हैं, geom_jitter का उपयोग करके - उदाहरण के लिए beeswarm पैकेज में उस तरह का चकमा दे रहा है )?
  • ... और / या किसी तरह की "लाइन" एक बिंदु की मूल स्थिति की ओर इशारा करते हुए अगर इसे स्थानांतरित करना था?
  • ... या इस तरह से पास-पास के बिंदुओं को संयोजित करने के लिए कि वे अभी भी स्पष्ट हैं (वहाँ शायद एक काम करने की तकनीक है जो बिनिंग का उपयोग करता है, अर्थात स्टेटिन / * या इसी तरह के प्रभाव के साथ कुछ)?
  • ... या उन वेबसाइटों पर देखी गई "इंटरएक्टिव प्लॉट" बनाने के लिए जिन्हें अभी भी एक पीडीएफ में शामिल किया जा सकता है (मैं एनीमेशन और चमकदार जैसे पैकेज की क्षमताओं के बारे में भी सोच रहा हूं )? उदाहरण के लिए, यह wals.info पर इस तरह दिखता है :

    Wals

यहाँ एक पिछली पोस्ट से, मुझे पता है कि डायरेक्टलैबल्स पैकेज लेबल को स्थानांतरित कर सकता है, लेकिन मुझे इस तरह से अंकों को स्थानांतरित करने का कोई तरीका नहीं मिला है।

स्पष्टीकरण के लिए पूछने के लिए स्वतंत्र महसूस करें!

नोट: मुझे पता है कि ओवरप्लोटिंग पर कई सवाल उठे हैं, लेकिन जिन लोगों पर मैंने गौर किया है, उनका एक अलग (यानी स्टैटिस्टिस्टिक) उद्देश्य है (मैं यह सब पढ़ने का दावा नहीं करता , इसलिए मैं ' डी के रूप में अच्छी तरह से एक लिंक स्वीकार करने के लिए खुश हो)। मैं उन पोस्ट्स को सूचीबद्ध करने की कोशिश करूंगा जो मुझे पता है और जो अच्छी तरह से प्रासंगिक हो सकती हैं (- मैंने जो पढ़ा है, इनमें से कोई भी मेरे प्रश्न का सटीक उत्तर नहीं देता है)।


1 कोड की निम्नलिखित पंक्तियों ने ऊपर से फसल बनाई।

library(OpenStreetMap)
library(ggplot2)

data <- read.csv(header = T, sep = ",", dec = ".", quote= "'",
text = "'','name','longitude','latitude','sp_sum'
'1','Modern Armenian',45,40,'both'
'2','Modern Armenian',45,40,'both'
'3','Modern Armenian',45,40,'spatial'
'4','Dieri',138,-28.1667,'both'
'5','Dieri',138,-28.1667,'both'
'6','Finnish',25.5577,64.7628,'non-spatial'
'7','Crimean Tatar',28.1418,43.8398,'spatial'
'8','Sochiapam Chinantec',-96.6079,17.7985,'non-spatial'
'9','Ese Ejja',-67.515,-11.7268,'non-spatial'
'10','Makhuwa',38.8052,-14.8509,'non-spatial'
'11','Mualang',111.077,0.31083,'non-spatial'
'12','Martuthunira',116.607,-20.9294,'non-spatial'
'13','Evenki',108.626,53.85,'both'
'14','Afrikaans',30,-22,'both'
'15','Male (Ethiopia)',36.9892,5.91975,'both'
'16','Manchu',126.557,47.3122,'both'
'17','Dime',36.3329,6.20951,'non-spatial'
'18','Koorete',37.8679,5.80545,'non-spatial'
'19','Wolaytta',37.7537,6.32668,'both'
'20','Dizin',35.5763,6.1405,'both'")

map <- openproj(openmap(c(85, -179.9), c(-60, 179.9), zoom = 2, type = "nps"))
plot <- autoplot(map) + 
  geom_point(data = data, aes(x = longitude, y = latitude),
             color = "white", alpha = 0.8, size = 8) +
  geom_point(data = data, aes(x = longitude, y = latitude, color = sp_sum),
             alpha = 0.3, size = 4)
plot

क्या ऐसा कुछ है जिसे मैं समझने और उत्तर देने में आसान बनाने के लिए सुधार कर सकता हूं? यदि आपके कोई विचार हैं तो कृपया मुझे बताएं!
मेजर

1
यह एक ऐसा प्रश्न नहीं है जिसमें मेरे पास सहायता करने के लिए प्रासंगिक कौशल हैं, लेकिन मैंने इसे कुछ सूचियों में थोड़ा अधिक दिखाई देने के लिए इसे बनाया है। यदि आपको कोई टिप्पणी नहीं मिलती है जो इसे बेहतर बनाने में मदद करती है, और किसी भी घटना में, मैं meta.gis.stackexchange.com/a/3353
Polybeo

मुझे लगता है कि आप कुछ बल-निर्देशित ग्राफ़ कार्यक्षमता का उपयोग करना चाह सकते हैं। मुझे यकीन नहीं है कि यह कैसे करना है और कुछ बिंदुओं को एंकर रखना है, लेकिन जो मैं सोच रहा हूं वह सभी समूहों (कुछ निकटता समूहन फ़ंक्शन) द्वारा पहचानना है और क्लस्टर सेंट्रो का उपयोग एक एंकर के रूप में करना है और अपने सदस्यों को तैरने देना है (और नहीं सेंट्रोइड को स्वयं प्लॉट करना - बस इसका उपयोग इसके छोटे ग्राफ में जुड़े कोने को लंगर करने के लिए)। और हां, अगर किसी भी समूह में केवल एक ही सदस्य है, तो उन्हें अपने स्थान पर भी लंगर डालना चाहिए।
अनेनो

मैं कम से एक तरफ का पालन नहीं किया है "... फिर केवल लगता है scatterplots को लागू करने के लिए," क्योंकि यह है एक scatterplot।
whuber

मैं मानता हूं कि मैंने एक गलत शब्द का इस्तेमाल किया होगा - स्कैल्पप्लॉट का मेरे कहने का मतलब यह था कि विशिष्ट सांख्यिकीय स्कैल्पलॉट जहां स्थिति आमतौर पर हमारे द्वारा यहां दिए गए प्लॉट की तुलना में कम महत्वपूर्ण है (= एक नक्शा - यदि बिंदुओं को यहां ले जाया जाता है, तो यह स्पष्ट है हाथोंहाथ)।
मेजर

जवाबों:


2

अब तक मैंने केवल एक काफी सभ्य दिखने वाला वर्कअराउंड पाया है: पैकर्स्कल्स आर पैकेज को किसी अन्य उद्देश्य के लिए डिज़ाइन किया गया हो सकता है, लेकिन यह एक दूसरे से दूर बिंदुओं को धक्का देने का एक अच्छा काम करता है (संबंधित ब्लॉग पोस्ट भी देखें )। मैं इस पैकेज के सभी आंतरिक कामकाज को नहीं समझ सकता, लेकिन सौभाग्य से, जैसा कि आप पाएंगे, वेबसाइट से उदाहरण फ़ाइल को लगभग सीधे इस्तेमाल किया जा सकता है - सभी को बदलने की आवश्यकता है चर नाम, मंडलियों के बीच की दूरी (या बिंदु) , आपके द्वारा उपयोग किए जाने वाले कार्यों पर निर्भर करता है) और ग्राफ की "सीमा" (यानी 180 °)।

(अंत में यह सब circleLayout()फंक्शन के लिए नीचे आता है , जो एक डेटा फ्रेम को लोन, लाट और रेडियस (यानी डिस्टेंस) कॉलम और दो 2-न्यूमेरिक xlim / ylim वैक्टर के साथ लेता है - यह बेहतर पॉइंट पोजिशन के साथ डेटा फ्रेम लौटाता है।)

"प्लॉट" जो आमतौर पर पैकक्राइकल्स द्वारा बनाया जाता है - आप इसे पहले से ही यहां काम करते हुए देख सकते हैं। नक्शा

  • कृपया प्रश्न से 'स्निपेट' से पहले मानचित्र के साथ इस 'के बाद' मानचित्र की तुलना करें

0

कुछ इस तरह, शायद?

data$spacing_x = 5
data$spacing_y = 5

for(i in 2:nrow(data)) {
  if( abs(data$latitude[i]-data$latitude[i+1]) < 2 ) {
    data$spacing_y[i] = data$spacing_y + 6 +jitter(data$spacing_y,8)
    data$spacing_y[i+1] = data$spacing_y + 6 + jitter(data$spacing_y,8)
  }
}

for(i in 2:nrow(data)) {
     if( abs(data$longitude[i]-data$longitude[i+1]) < 2 ) {
      data$spacing_x[i] = data$spacing_x + jitter(data$spacing_x,4)
      data$spacing_x[i+1] = data$spacing_x +jitter(data$spacing_x,4)
     }
}

for(i in 2:nrow(data)) {
  if( abs(data$spacing_y[i]-data$spacing_y[i+1]) < 1.5 ) {
    data$spacing_y[i] = data$spacing_y + 2 
    data$spacing_y[i+1] = data$spacing_y + 2
  }
}

for(i in 2:nrow(data)) {
  if( abs(data$spacing_x[i]-data$spacing_x[i+1]) < 1.5 ) {
    data$spacing_x[i] = data$spacing_x + 2 
    data$spacing_x[i+1] = data$spacing_x + 2
  }
}


plot = autoplot(map) + 
  geom_segment(data = data
               , mapping=aes(x=longitude
                             , y=latitude
                             , xend=longitude + spacing_x
                             , yend=latitude + spacing_y)
               , size=0.5, color="black"
               , alpha = 0.9) +
  geom_point(data = data
             , aes(x = longitude+spacing_x
                  , y = latitude+spacing_y)
             , color = "white"
             , alpha = 0.8, size = 8) +
  geom_point(data = data
             , aes(x = longitude+spacing_x
                   , y = latitude+spacing_y
                   , color = sp_sum)
             , alpha = 0.3, size = 4)
  xlab("") +
  ylab("")
plot

समझा। आपने wals.info के स्क्रीनशॉट से "मूल स्थिति के लिए लाइनें" को दोहराने की कोशिश की, क्या आपने नहीं किया? यह एक शुरुआत है, मुझे लगता है। लेकिन अगर मैं इसे सही ढंग से देखता हूं, तो यह मेरी समस्या के बेहतर हिस्से को हल नहीं करेगा (जैसे अंक अभी भी ओवरलैप हैं)।
मेजर

बाकी डेटा फ्रेम हेरफेर होना चाहिए। यदि कोई लूप के लिए / रिक्ति को नियंत्रित कर सकता है - उसमें एक स्टेटमेंट यह भी कह सकता है कि यदि पॉइंट्स के बीच रिक्ति x से कम है, तो उन्हें इस तरह चिन्हित करें और उस मार्कर का उपयोग पॉइंट्स को

उम्मीद है कि कोई, या आप, मेरी बदसूरत को छोरों के लिए ठीक कर सकते हैं। सौभाग्य।

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