У меня есть база данных, содержащая языки, их долготу и широту и значение элемента (либо категория 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
...
Я использую пакет R ggplot2 (это тот, с которым я больше всего знаком, поэтому я был бы рад продолжать его использовать - но другие решения также приветствуются). Вот кадрирование с предыдущей попытки (код: см. Ниже 1 ):
Для каждой точки я хотел бы, чтобы (грубая) позиция - а также значение - все еще были видны. (Если есть несколько точек для одного языка, они могут быть объединены.)
Есть ли способ либо ...
- ... переместить точки в сторону настолько, чтобы не было переполнения (менее случайно, чем, скажем, с помощью geom_jitter - в пакете beeswarm , например, много таких уклонений )?
- ... и / или иметь какую-то "линию", указывающую на исходное положение точки, если ее нужно было перемещать?
- ... или комбинировать точки сближения таким образом, чтобы они все еще были ясны (возможно, существует метод работы, использующий биннинг, то есть stat_bin * или что-то с аналогичным эффектом)?
... или создать "интерактивный сюжет", подобный тем, которые можно увидеть на веб-сайтах, которые все еще можно включить в PDF-файл (я также думаю о возможностях таких пакетов, как анимация и блестящие материалы )? Например, на wals.info это выглядит так :
Из предыдущего поста я знаю, что пакет directlabels может перемещать метки, но я также не нашел способа заставить его перемещать точки.
Не стесняйтесь просить разъяснений!
Примечание: я знаю, что было несколько вопросов о перепланировке, но те, которые я изучил, похоже, имеют другую (то есть статистическую) цель (я не утверждаю, что прочитал все это , поэтому я ' Конечно, я тоже буду рад принять ссылку. Я постараюсь перечислить те сообщения, которые я знаю и которые вполне могут быть актуальны (- из того, что я прочитал, ни один из них точно не отвечает на мой вопрос).
- stats.SE: Как избежать наложения меток на графике R?
- SO: динамическое позиционирование метки данных в ggmap
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
Ответы:
До сих пор я нашел только один достаточно приличный обходной путь: пакет packcircles R, возможно, был разработан для другой цели, но он отлично справляется с отжиманием точек друг от друга (см. Также соответствующее сообщение в блоге ). Возможно, я не понимаю всю внутреннюю работу этого пакета, но, к счастью, как вы увидите, файл примера с веб-сайта можно использовать почти напрямую - все, что нужно изменить, - это имена переменных, расстояние между кругами (или точками). в зависимости от используемых вами функций) и «пределов» графика (т. е. 180 °).
(В конце концов все сводится к
circleLayout()
функции, которая принимает фрейм данных со столбцами lon, lat и radius (то есть расстояние) и двумя 2-числовыми векторами xlim / ylim - он возвращает фрейм данных с улучшенными позициями точек.)источник
Может быть, как-то так?
источник