Точка перенапруження на картах у 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 пакеті, наприклад)?
  • ... та / або мати якусь "лінію", що вказує на початкове положення точки, якщо її потрібно було перемістити?
  • ... або поєднувати точки закриття таким чином, щоб вони все ще були зрозумілими (можливо, там працює техніка роботи, яка використовує binning, тобто stat_bin * або щось із подібним ефектом)?
  • ... або створити "інтерактивний сюжет", подібний до тих, які можна побачити на веб-сайтах, які все ще можна включити в pdf (я також думаю про здібності пакунків, таких як анімація та блискучі тут)? Наприклад, це виглядає так на wals.info :

    вали

З попередньої публікації тут я знаю, що пакет прямої позначки може переміщувати мітки, але я не знайшов способу змусити його також переміщувати точки.

Не соромтеся просити роз'яснення!

Примітка. Я знаю, що виникло ціла низка питань щодо перезволоження, але ті, на які я все розглядав, здавалося, мають інше (тобто статистичне) призначення (я не претендую на те , що я все це прочитав , тому я " буду рада прийняти посилання, звичайно). Я спробую перерахувати ті публікації, які я знаю і які можуть бути актуальними (- з того, що я прочитав, жодне з цих не відповідає точно на моє запитання.)


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
Це питання, з яким я маю відповідні навички, але я закликав його зробити так, щоб у деяких списках виглядав трохи вище. Якщо ви не отримаєте жодних коментарів, які допомагають би покращити його, і в будь-якому випадку, я рекомендую переглядати / переглядати його через часті проміжки часу, дотримуючись
PolyGeo

Я думаю, ви можете скористатися функцією графа, спрямованої на силу. Я не впевнений, як це зробити і зберегти якісь точки на якорі, але я думаю, що визначити всі кластери (за деякою функцією групування близькості) і використовувати центроїд кластера як якор і дозволити його членам плавати (а не побудувати графік самого центру - просто використовуючи його для закріплення з'єднаних вершин у його маленькому графіку). І звичайно, якщо у будь-яких кластерів є лише один член, вони також повинні бути прикріплені до їх місця розташування.
ааріно

Я не слідувати в стороні на «... знову ж, здається , тільки застосувати до діаграм розсіювання» , тому що це є розсіюванням.
whuber

Я визнаю, що, мабуть, я використав неправильний термін - те, що я мав на увазі сказати розсипом, був типовим статистичним розсіювачем, де позиція, як правило, менш важлива, ніж у тому вигляді, який ми маємо тут (= карта - якщо точки переміщуються сюди, це очевидно негайно).
Maj

Відповіді:


2

Поки що я знайшов лише один досить пристойний зовнішній вигляд: Пакет packcircles R, можливо, був розроблений з іншою метою, але це добре справляється, відштовхуючи окуляри один від одного (також дивіться відповідну публікацію в блозі ). Я, можливо, не розумію всіх внутрішніх функцій цього пакету, але на щастя, як ви побачите, прикладний файл із веб-сайту можна використовувати майже безпосередньо - все, що потрібно змінити, - це назви змінних, відстань між колами (або точками) , залежно від використовуваних функцій) та "меж" графіка (тобто 180 °).

(Зрештою, все зводиться до circleLayout()функції, яка приймає кадр даних із стовпцями lon, lat та радіусом (тобто відстані) та двома двоцифровими xlim / ylim векторами - він повертає кадр даних із покращеними позицій точки.)

"Сюжет", який, як правило, створюють packcircles - ви можете бачити його вже тут. карта

  • порівняйте карту "після" із фрагментом карти "до" із запитання

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, чи не так? Думаю, це початок. Але якщо я бачу це правильно, це не вирішить кращої частини моєї проблеми (наприклад, бали все ще перекриваються).
майор

Решта повинна бути маніпуляцією кадром даних. Цикл if / for може управляти міжряддями - висловлювання в ньому також може сказати, що якщо інтервал між точками менший за x, позначте їх як такі, і цей маркер можна використовувати для об'єднання точок

сподіваємось, хтось, або ви, зможете виправити мою негарну петлю. Удачі.

@InNoam: Насправді я відкритий до натяків на те, як ця маніпуляція кадром даних може працювати.
майор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.