R의지도에서 점 과도 플로팅 (예 : ggplot2)-점을 측면으로 밀고, 원래 위치를 표시하고, 근접 점을 결합하는 방법…?


12

언어, 경도 및 위도 및 기능 값 (카테고리 1, 카테고리 2 또는 둘 다-플롯에서 각각 빨강, 파랑 및 녹색으로 표시됨)이 포함 된 데이터베이스가 있습니다. 언어 당 최대 3 개의 지점이있을 수 있으며 자연스럽게 두 개의 언어 지점이 서로 매우 가까이있을 수 있습니다.

    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 패키지가 레이블을 이동할 수 있다는 것을 알고 있지만 포인트를 이동시키는 방법을 찾지 못했습니다.

설명을 요청하십시오.

참고 : 과도 플로팅에 대해 여러 가지 질문이 있다는 것을 알고 있지만 모두 살펴본 내용은 다른 (예 : 통계적) 목적을 가진 것으로 보입니다 ( 모두 읽지 않았다고 주장 하므로 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

질문을 이해하고 답변하기 쉽게 개선 할 수있는 것이 있습니까? 당신이 어떤 아이디어가 있으면 알려주세요!
메이

1
이것은 도움이되는 관련 기술이있는 질문이 아니지만 일부 목록에서 조금 더 높게 보이도록 그것을 찬성했습니다. 개선에 도움이되는 의견이없고 어떤 경우에도 meta.gis.stackexchange.com/a/3353
PolyGeo

강제 지시 그래프 기능을 사용하고 싶을 것 같습니다. 나는 그것을 어떻게하고 어떤 점을 고정시키는 방법을 모르겠지만, 내가 생각하고있는 것은 (일부 근접 그룹화 기능으로) 모든 클러스터를 식별하고 클러스터 중심을 앵커로 사용하고 구성원을 플로팅하는 것입니다 (그리고 중심 자체를 플로팅하여 연결된 정점을 작은 그래프에 고정시키는 데 사용합니다). 물론 클러스터에 멤버가 하나만있는 경우 해당 클러스터도 해당 위치에 고정되어야합니다.
aaryno

이 때문에 "다시 산점도에 적용 할 경우에만 것 같다 ..."에서 옆을 따르지 않았고 입니다 산점도.
whuber

나는 내가 잘못된 용어를 사용했음을 인정한다.- 산점도 (scatterplot) 가 말하는 것은 일반적인 통계적 산점도는 우리가 여기에있는 도표의 종류보다 위치가 일반적으로 덜 중요하다. 바로).
maj

답변:


2

지금까지 나는 상당히 괜찮은 해결책을 찾았습니다 .packcircles R 패키지는 다른 목적으로 설계되었을 수도 있지만 점을 서로 멀어지게하는 좋은 일을합니다 (또한 해당 블로그 게시물 참조 ). 나는이 패키지의 모든 내부 작업을 이해하지 못할 수도 있지만 다행히도 웹 사이트의 예제 파일을 거의 직접 사용할 수 있습니다. 변수 이름, 원 사이의 거리 (또는 점) , 사용하는 기능에 따라 다름) 및 그래프의 "한계"(예 : 180 °).

결국 모든 circleLayout()함수는 lon, lat 및 radius (즉, 거리) 열과 두 개의 2 숫자 xlim / ylim 벡터가있는 데이터 프레임 을 사용하는 함수로 귀착됩니다 . 포인트 위치가 개선 된 데이터 프레임을 반환합니다.

일반적으로 packcircles에 의해 생성 된 "플롯"-여기에서 이미 작동하는 것을 볼 수 있습니다. 지도

  • 이 'after'맵을 질문의 'before'맵 스 니펫과 비교하십시오.

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 / 간격에 적용 할 수 루프 - 성명 그 안에도 지점 사이의 간격이 덜 X보다 경우 등을 표시하고 그 마커는 점을 연결하는 데 사용할 수 있음을 말할 수있다

누군가 또는 당신이 내 못생긴 for 루프를 고칠 수 있기를 바랍니다. 행운을 빕니다.

@InNoam : 사실,이 '데이터 프레임 조작'이 어떻게 작동 할 수 있는지에 대한 힌트가 열려 있습니다.
maj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.