Mam bazę danych zawierającą języki, ich długości i szerokości geograficzne oraz wartość cechy (albo kategoria 1, kategoria 2 lub obie - na wykresie są one oznaczone odpowiednio czerwonym, niebieskim i zielonym). Mogą występować maksymalnie trzy punkty na język i oczywiście dwa punkty językowe mogą znajdować się bardzo blisko siebie.
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
...
Używam pakietu R ggplot2 (to ten, który znam najbardziej, więc chętnie bym go nadal używał - ale mile widziane są również inne rozwiązania). Oto kadr z poprzedniej próby (kod: patrz poniżej 1 ):
W każdym punkcie chciałbym, aby (szorstka) pozycja - a także wartość - była nadal widoczna. (Jeśli istnieje wiele punktów dla jednego języka, można je łączyć).
Czy istnieje sposób na ...
- ... aby przesunąć punkty na bok tylko na tyle, aby nie było przerysowania (mniej losowo niż, powiedzmy, przy użyciu geom_jitter - na przykład istnieje wiele tego rodzaju unikania w pakiecie ochrony pszczół )?
- ... i / lub mieć jakąś „linię” wskazującą pierwotne położenie punktu, gdyby musiał zostać przesunięty?
- ... lub połączyć punkty poboczne w taki sposób, aby były one nadal wyraźne (prawdopodobnie istnieje tam technika działania, która wykorzystuje binowanie, tj. stat_bin * lub coś z podobnym efektem)?
... lub stworzyć „interaktywną fabułę”, taką jak te widoczne na stronach internetowych, które nadal mogą być zawarte w pliku pdf (myślę też o możliwościach pakietów takich jak animacja i błyszczące tutaj)? Na przykład wygląda to tak na wals.info :
Z poprzedniego postu wiem, że pakiet directlabels może przenosić etykiety, ale nie znalazłem sposobu, aby przenieść punkty również.
Poproś o wyjaśnienia!
Uwaga: zdaję sobie sprawę z tego, że pojawiło się wiele pytań dotyczących nadmiernego plotkowania, ale te, na które spojrzałem, wydawały się mieć inny (tj. Statystyczny) cel (nie twierdzę, że wszystko przeczytałem , więc „ d oczywiście chętnie zaakceptuje link). Spróbuję wymienić te posty, które znam i które mogą być odpowiednie (- z tego, co przeczytałem, żaden z nich nie odpowiada dokładnie na moje pytanie).
- stats.SE: Jak uniknąć nakładania się etykiet na wykresie R?
- SO: Dynamiczna etykieta punktu danych Pozycjonowanie w ggmap
1 Poniższe wiersze kodu utworzyły kadr z góry.
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
Odpowiedzi:
Do tej pory znalazłem tylko jedno całkiem przyzwoite obejście: pakiet packcircles R mógł być zaprojektowany do innego celu, ale robi dobrą robotę, odsuwając punkty od siebie (patrz także odpowiedni post na blogu ). Może nie rozumiem wszystkich wewnętrznych działań tego pakietu, ale na szczęście, jak się okaże, przykładowy plik ze strony internetowej może być używany prawie bezpośrednio - wystarczy zmienić nazwy zmiennych, odległość między okręgami (lub punktami , w zależności od używanych funkcji) i „granic” wykresu (tj. 180 °).
(Ostatecznie wszystko sprowadza się do
circleLayout()
funkcji, która przyjmuje ramkę danych z kolumnami lon, lat i promień (tj. Odległość) oraz dwa 2-numeryczne wektory xlim / ylim - zwraca ramkę danych z poprawionymi pozycjami punktów.)źródło
Może coś takiego?
źródło