Rのマップでのポイントのオーバープロット(たとえばggplot2を使用)-ポイントを横に押して、元の位置をマークし、近接ポイントを結合する方法は…?


12

言語、その経度と緯度、および特徴値(カテゴリ1、カテゴリ2、または両方-プロットではこれらはそれぞれ赤、青、緑でマークされています)を含むデータベースを持っています。言語ごとに最大3つのポイントがあり、当然ながら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
...

Rパッケージggplot2を使用しています(これは私が最もよく知っているパッケージですので、引き続き使用できますが、他のソリューションも歓迎します)。これは、以前の試みからの抜粋です(コード:下記1を参照):

前の試行から切り取る

すべてのポイントについて、(おおまかな)位置と値がまだ表示されていることを望みます。(1つの言語に複数のポイントがある場合、それらを組み合わせることができます。)

方法はありますか...

  • ...オーバープロットが発生しないようにポイントを十分に側方に移動するには(たとえば、geom_jitterを使用した場合よりもランダムではありません- たとえば、ビースウォームパッケージにそのような覆い焼きたくさんあります)?
  • ...および/または移動する必要がある場合に、ポイントの元の位置を指すある種の「線」を作成するには?
  • ...または、それらがまだ明確な方法で近接ポイントを結合する(おそらく、ビニングを使用する実用的なテクニックがあります。すなわち、stat_bin *または同様の効果を持つ何か)。
  • ...または、PDFに含めることができるWebサイトで見られるような「インタラクティブプロット」を作成する(アニメーション光沢のあるパッケージの機能についても考えています)。たとえば、wals.infoでは次のようになります。

    ウォルス

ここでの以前の投稿から、directlabelsパッケージはラベルを移動できることを知っていますが、ポイントを移動させる方法も見つけていません。

明確化を要求すること自由に感じなさい!

注:オーバープロットには多くの質問があったことは承知していますが、私が調べたすべての質問には異なる(つまり、統計的な)目的があるようです(すべてを読んだは主張しませんので、 dもちろん、リンクも喜んで受け入れます)。私が知っていて、関連性が高いと思われる投稿をリストしようとします(-私が読んだことから、これらはどれも私の質問に正確に答えません。)


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

質問の理解と回答を容易にするために改善できることはありますか?アイデアがあれば教えてください!
MAJ

1
これは私が支援する関連スキルを持っている質問ではありませんが、一部のリストで少し高く見えるようにそれを支持しました。改善に役立つコメントが得られない場合、いずれにしても、meta.gis.stackexchange.com
a /

私はあなたがいくつかの強制指向グラフ機能を使用したいと思うかもしれないと思っています。私はそれを行う方法といくつかのポイントを固定したままにする方法がわかりませんが、私は考えているのは、すべてのクラスターを特定し(いくつかの近接グループ化機能によって)、クラスター重心をアンカーとして使用し、そのメンバーをフロートさせます重心自体をプロットします-それを使用して、小さなグラフに接続された頂点を固定します)。そしてもちろん、いずれかのクラスターにメンバーが1つしかない場合は、それらもその場所に固定する必要があります。
aaryno

これ散布図であるため、「...再び散布図にのみ適用されるようです」で脇を追っていませんでした。
whuber

間違った用語を使用したに違いない- 散布図で言ったのは、ここにある種類のプロットよりも位置の重要性が一般的に低い典型的な統計散布でした(=マップ-ポイントがここに移動した場合、それは明らかです)すぐに)。
maj

回答:


2

これまでのところ、かなりまともな回避策は1つしか見つかりませんでした。 packcircles Rパッケージは別の目的のために設計された可能性がありますが、ポイントをお互いから遠ざけて素晴らしい仕事をします(対応するブログ投稿も参照してください)。私はこのパッケージのすべての内部動作を理解していないかもしれませんが、幸いなことに、あなたが見つけるように、ウェブサイトのサンプルファイルはほぼ直接使用できます-変更する必要があるのは変数名、円間の距離(または点) 、使用する機能に応じて)およびグラフの「制限」(つまり180°)。

(最後に、circleLayout()関数はすべてlon、lat、radius(つまり距離)列のデータフレームと2つの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のスクリーンショットから「元の位置への線」を複製しようとしましたか?始まりだと思います。しかし、これを正しく見ると、問題の大部分を解決できません(たとえば、ポイントがまだ重複しています)。
MAJ

残りはデータフレーム操作です。IF /間隔支配することができるforループ-ステートメントは、その中にも点の間の間隔がx未満である場合、そのようにマークし、そのマーカーポイントを連結するために使用することができると言うことができる

うまくいけば、誰かまたはあなたが私のmyいforループを修正することができます。幸運を。

@InNoam:実際、私はこの「データフレーム操作」がどのように機能するかについてのヒントに心を開いています。
MAJ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.