R'deki haritalarda nokta çizme (örn. Ggplot2 ile) - noktaları bir tarafa nasıl itebilir, orijinal konumları işaretleyebilir, yakın noktaları birleştirebilirsiniz…?


12

Diller, boylamları ve enlemleri ve bir özellik değeri içeren bir veritabanı var (ya kategori 1, kategori 2 ya da her ikisi de - bu sırasıyla kırmızı, mavi ve yeşil işaretlenir). Dil başına en fazla üç nokta olabilir ve doğal olarak iki dil noktası birbirine çok yakın olabilir.

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

R paketini ggplot2 kullanıyorum (en çok tanıdığım kişi, bu yüzden kullanmaya devam etmekten mutluluk duyarım - ancak diğer çözümler de hoş geldiniz). İşte önceki denemeden bir ürün (kod: aşağıya bakınız 1 ):

Önceki denemeden kes

Her nokta için, (kaba) pozisyonun - ve değerin - hala görünür olmasını istiyorum. (Tek bir dil için birden fazla nokta varsa, bunlar birleştirilebilir.)

Bir yolu var mı ...

  • ... (geom_jitter kullanarak, diyelim ki, daha az rastgele - bu tür bir şey var sadece yeterli hiçbir çizme olduğu tarafa noktaları taşımak için kaçmak içinde beeswarm Örneğin pakette)?
  • ... ve / veya hareket ettirilmesi gerekiyorsa bir noktanın orijinal konumuna işaret eden bir çeşit "çizgi" mi?
  • ... veya yakın noktaları hala net olacak şekilde birleştirmek için (muhtemelen binning kullanan bir çalışma tekniği var, yani stat_bin * veya benzer bir etkiye sahip bir şey)?
  • ... ya da hala pdf içine dahil edilebilir web sitelerinde görülen gibi bir "interaktif arsa" oluşturmak için (Ben de burada animasyon ve parlak gibi paketlerin yeteneklerini düşünüyorum )? Örneğin, wals.info'da şöyle görünür :

    wals

Buradaki önceki bir gönderiden , doğrudan etiket paketinin etiketleri taşıyabileceğini biliyorum , ancak noktaları da taşımanın bir yolunu bulamadım.

Açıklama istemekten çekinmeyin!

Not: Overplot ile ilgili bir takım soruların olduğunun farkındayım, ancak hepsine baktığımların farklı (yani istatistik) bir amacı var gibi görünüyordu ( hepsini okuduğumu iddia etmiyorum , bu yüzden ' tabii ki bir bağlantıyı kabul etmekten mutluluk duyarız). Bildiğim ve alakalı olabilen yayınları listelemeye çalışacağım (- okuduğumdan, bunların hiçbiri sorumu tam olarak cevaplamıyor.)


1 Aşağıdaki kod satırları kırpma işlemini yukarıdan oluşturdu.

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

Sorunun anlaşılmasını ve yanıtlanmasını kolaylaştırmak için geliştirebileceğim bir şey var mı? Herhangi bir fikriniz varsa lütfen bize bildirin!
maj

1
Bu, yardımcı olmak için ilgili becerilere sahip olduğum bir soru değil, ancak bazı listelerde biraz daha yüksek görünmesini sağlamak için onayladım. Herhangi bir yorum alamazsanız yardım onu geliştirmek, ve her halükarda, ben sunulan tavsiye dikkat etmeden sık aralıklarla tekrar gözden geçirilerek / incelemenizi öneririz o meta.gis.stackexchange.com/a/3353
PolyGeo

Bazı kuvvet odaklı grafik işlevlerini kullanmak isteyebileceğinizi düşünüyorum. Nasıl yapılacağından ve bazı noktaları bağlantılı tuttuğumdan emin değilim, ancak düşündüğüm tüm kümeleri (bazı yakınlık gruplama işleviyle) tanımlamak ve küme sentroidini bir çapa olarak kullanmak ve üyelerinin yüzmesine izin vermek (ve sentroidin kendisini çizmek - sadece bağlı köşeleri küçük grafiğinde tutturmak için kullanmak). Ve elbette, eğer herhangi bir kümenin sadece bir üyesi varsa, o zaman bu üyelerin bulundukları yere de bağlanması gerekir.
aaryno

Bu çünkü "yine scatterplots uygulamak üzere sadece görünüyor ..." at kenara takip etmedi olduğunu bir grafiği.
whuber

Yanlış bir terim kullanmış olmam gerektiğini itiraf ediyorum - dağılım grafiği ile söylemek istediğim, konumun burada sahip olduğumuz arsa türünden genellikle daha az önemli olduğu tipik istatistiksel dağılım grafiğiydi (= bir harita - eğer noktalar burada taşınırsa, açıktır hemen).
maj

Yanıtlar:


2

Şimdiye kadar sadece oldukça iyi görünümlü bir çözüm buldum: packcircles R paketi başka bir amaç için tasarlanmış olabilir, ancak noktaları birbirinden uzağa iterek güzel bir iş çıkarır (ayrıca ilgili blog yayınına bakın ). Bu paketin tüm iç işleyişini anlamayabilirim, ancak neyse ki, bulacağınız gibi, web sitesindeki örnek dosya neredeyse doğrudan kullanılabilir - değişmesi gereken tek şey değişken isimler, daireler arasındaki mesafe (veya noktalar) , kullandığınız işlevlere bağlı olarak) ve grafiğin "sınırlarına" (yani 180 °) bağlı olarak değişir.

(Sonuçta, circleLayout()lon, lat ve radius (yani mesafe) sütunları ve iki 2-sayısal xlim / ylim vektörü içeren bir veri çerçevesini alan işleve gelir - veri çerçevesini iyileştirilmiş nokta konumlarıyla döndürür.)

Genellikle packcircles tarafından oluşturulan "çizim" - zaten burada çalıştığını görebilirsiniz. map

  • lütfen bu 'sonrası' haritasını sorudan 'önceki' harita snippet'i ile karşılaştırın

0

Belki böyle bir şey?

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

Anlıyorum. Wals.info ekran görüntüsünden "satırları orijinal konumuna" kopyalamaya çalıştınız, değil mi? Sanırım bu bir başlangıç. Ama bunu doğru görürsem, sorunumun daha iyi kısmını çözmez (örneğin, noktalar hala çakışıyor).
maj

Geri kalanı veri çerçevesi manipülasyonu olmalıdır. Bir if / for döngüsü aralığı yönetebilir - buradaki bir ifade, noktalar arasındaki boşluk

umarım birisi ya da sen çirimlerimi döngüler için düzeltebilirsin. İyi şanslar.

@InNoam: Aslında, bu 'veri çerçevesi manipülasyonunun' nasıl çalışabileceğine dair ipuçlarına açığım.
maj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.