R에서 선거 맵을 만드는 방법

예를 들어 주별 미국 대통령 선거의 선거 결과를 매핑하는 경우 공화당이이긴 주에는 빨간색을, 민주당이이긴 주에는 파란색을 한 가지만 표시하는 것이 좋습니다. 왜냐하면 후보자가 3 천 표로이기는지 3 백만표로이기는지는 중요하지 않기 때문입니다. "승자가 모두 가져가는 것"입니다.

그러나 결과 분석 할 때 상태 선거 에 의해 카운티 , 또는 도시 차원의 선거 에 의해 구역 , 여백 문제. 승자를 결정하는 것은 전체 합계입니다. 예를 들어, 주지사에 대한 조지아 주 전체 결과를 볼 때 "애틀랜타"우승 자체가 알아야 할 전부는 아닙니다. 민주당 원 득표 한 득표 수를 알고 다른 영역과 비교 하고 싶을 것 입니다. 

나는 색으로 구분 승자가 있습니다지도를 만들려면 이유 승리의 마진을 보여주는 색상의 강도를. 이는 어떤 영역이 전체 결과에 더 많이 기여하고 어느 영역이 덜 기여했는지 알려줍니다.

이 데모에서는 펜실베니아 2016 대통령 결과를 사용하겠습니다. 따라하려면 데이터 및 지리 공간 셰이프 파일을 다운로드하십시오.

카운티 및 카운티 별 펜실베니아 2016 선거 결과 다운로드 shapefiles 선거 데이터 파일 및 shapefile. 샤론 마클리스

먼저 dplyr, glue, scales, htmltools, sf 및 전단지와 같은 패키지를로드합니다. rio를 사용하여 데이터 CSV 파일을 가져올 것이므로 시스템에서도이를 원할 것입니다.

도서관 (dplyr); 라이브러리 (접착제); 도서관 (저울);

라이브러리 (htmltools); 도서관 (sf); 도서관 (리플릿)

pa_data <-rio :: import ( "pa_2016_presidential.csv")

데이터 가져 오기 및 준비

다음으로 sf의 st_read()함수를 사용 하여 펜실베니아 카운티의 shapefile을 가져옵니다.

pa_geo <-sf :: st_read ( "PaCounty2020_08 / PaCounty2020_08.shp",

stringsAsFactors = FALSE)

pa_geo에서 카운티 열 이름 COUNTY_NAM이 마음에 들지 않으므로 다음 코드를 사용하여 "County"로 변경하겠습니다.

names (pa_geo) [2] <- "카운티"

데이터를 지리와 병합하기 전에 두 파일에서 카운티 이름이 동일한 지 확인하고 싶습니다. dplyr의 anti_join()함수는 두 데이터 세트를 병합 하고 일치 하지 않는 행을 보여줍니다 . 결과를 문제라는 데이터 프레임에 저장하고 head ()가있는 처음 6 개 행과 처음 3 개 열을 살펴 보겠습니다.

문제 <-anti_join (pa_geo, pa_data, by = "County")

head (문제 [, 1 : 3])

MSLINK 카운티 COUNTY_NUM 기하학 1 42 MCKEAN 42 MULTIPOLYGON (((-78.20638 4 ...

문제 행이 하나 있습니다. 이 데이터에서는 McKean County가 MCKEAN이지만 다른 데이터 프레임에서는 McKEAN이기 때문입니다. McKean을 pa_data의 모든 대문자로 변경하고 anti_join()확인을 다시 실행 합니다.

pa_data $ County [pa_data $ County == "McKEAN"] <- "MCKEAN"

anti_join (pa_geo, pa_data, by = "County")

이제 문제 행이 없어야합니다.

다음 코드 줄은 데이터를 지리와 병합합니다.

pa_map_data <-merge (pa_geo, pa_data, by = "County")

마지막으로 새 지리 및 데이터 개체가 전단지 타일 과 동일한 투영 을 사용하는지 확인합니다 . 투영은 매우 복잡한 GIS 주제입니다. 지금은 전단지와 일치시키기 위해 WGS84가 필요하다는 것을 알고 있습니다. 이 코드는 내 투영을 설정합니다.

pa_map_data <-st_transform (pa_map_data, "+ proj = longlat + datum = WGS84")

이제 데이터가 필요한 모양이되었으므로 세 가지 작업이 더 있습니다. 각 후보에 대한 색상 팔레트를 만들고지도에 대한 팝업을 만든 다음지도 자체를 코딩하는 것입니다.

컬러 팔레트

팔레트부터 시작하겠습니다.

이 데모에서 원시 투표 차이 를 매핑 할 것이지만 대신 백분율 차이를 사용할 수도 있습니다. 아래 코드의 첫 번째 줄은 기본 R의 range()함수를 사용 하여 Margin 열의 최소 및 최대 투표 차이를 가져옵니다. 가장 밝은 색상은 가장 작은 숫자에, 가장 어두운 색상은 가장 큰 숫자에 할당했습니다. 

다음으로 공화당 원은 빨간색, 민주당 원은 파란색을 사용하여 두 개의 팔레트를 만듭니다. 두 팔레트 모두에 동일한 강도 척도를 사용합니다. 후보에 관계없이 가장 낮은 여백에 대해 가장 밝게, 후보에 관계없이 가장 높은 여백에 대해 가장 높습니다. 이것은 단일 강도 척도에서 각 후보자가 어디에서 가장 강했는지에 대한 아이디어를 제공합니다. colorNumeric()팔레트 색상이 Reds 또는 Blues 인 전단지 기능을 사용하여 팔레트를 만듭니다. ( domain인수는 색상 스케일의 최소값과 최대 값을 설정합니다.)

min_max_values ​​<-범위 (pa_map_data $ Margin, na.rm = TRUE)

trump_palette <-colorNumeric (palette = "Reds",

도메인 = c (최소 _ 최대 _ 값 [1], 최소 _ 최대 _ 값 [2]))

clinton_palette <-colorNumeric (palette = "Blues",

도메인 = c (최소 _ 최대 _ 값 [1], 최소 _ 최대 _ 값 [[2]]))

다음 코드 그룹은 두 개의 서로 다른 데이터 프레임을 만듭니다  . 각 후보에 대해 하나씩, 후보가이긴 장소 만 포함합니다. 두 개의 데이터 프레임이 있으면 팝업과 색상을 세밀하게 제어 할 수 있습니다. 각각 다른 팝업 텍스트를 사용할 수도 있습니다. 

trump_df <-pa_map_data [pa_map_data $ Winner == "트럼프",]

clinton_df <-pa_map_data [pa_map_data $ Winner == "Clinton",]

팝 업

다음 작업은 팝업입니다. 아래에서는 굵은 텍스트를위한 강력한 태그와 줄 바꿈을위한 br 태그를 포함하는 일부 HTML을 생성  합니다. 접착제에 익숙하지 않은 경우 {} 중괄호 안의 코드는 평가되는 변수입니다. 팝업에서 우승 후보의 이름과 총 투표 수, 다른 후보의 이름과 총 투표 수, 해당 카운티의 승리 마진을 표시합니다. 이  scales::comma() 함수는 천개 이상의 총 투표 수에 쉼표를 추가하고  accuracy = 1소수점이없는 둥근 정수인지 확인합니다.

그런 다음 코드는 해당 glue()텍스트 문자열을 htmltools의 HTML()기능 으로  파이프 하여 팝업 텍스트를 올바르게 표시해야하는 전단지에 필요합니다. 

trump_popup <-glue ( " {trump_df $ County} COUNTY

수상자 : 트럼프

트럼프 : {scales :: comma (trump_df $ Trump, 정확도 = 1)}

클린턴 : {scales :: comma (trump_df $ Clinton, 정확도 = 1)}

여백 : {scales :: comma (trump_df $ Margin, 정확도 = 1)} ") %> %

lapply (htmltools :: HTML)

clinton_popup <-glue ( " {clinton_df $ County} COUNTY

수상자 : Clinton

클린턴 : {scales :: comma (clinton_df $ Clinton, 정확도 = 1)}

트럼프 : {scales :: comma (clinton_df $ Trump, 정확도 = 1)}

여백 : {scales :: comma (clinton_df $ Margin, 정확도 = 1)} ") %> %

lapply (htmltools :: HTML)

맵 코드

드디어지도. 지도 코드는 기본 개체 에 데이터를 인수로 추가 leaflet() 하지 않고 사용하여 기본 전단지 개체를 만드는 것으로 시작됩니다 . 두 개의 다른 데이터 세트를 사용할 것이기 때문입니다. 아래 코드의 다음 줄은 배경 타일을 CartoDB Positron으로 설정합니다. (선택 사항입니다. 기본값을 사용할 수 있지만 그 스타일이 마음에 듭니다.)

전단지 () %> %

addProviderTiles ( "CartoDB.Positron")

다음으로 전단지의 addPolygons()기능을 동일한지도 레이어에 오버레이 된 각 후보의 데이터 프레임에 대해 하나씩 두 번 사용할 것 입니다.

전단지 () %> %

addProviderTiles ( "CartoDB.Positron") %> %

addPolygons (

데이터 = trump_df,

fillColor = ~ trump_palette (trump_df $ Margin),

레이블 = trump_popup,

스트로크 = TRUE,

smoothFactor = 0.2,

fillOpacity = 0.8,

색상 = "# 666",

무게 = 1

) %> %

addPolygons (

데이터 = clinton_df,

fillColor = ~ clinton_palette (clinton_df $ Margin),

레이블 = clinton_popup,

스트로크 = TRUE,

smoothFactor = 0.2,

fillOpacity = 0.8,

색상 = "# 666",

무게 = 1

)

위의 코드 블록에서는 addPolygons() 각 후보의 데이터 프레임 에 각 기능 의 데이터를 설정했습니다 . 이 fillColor주장은 각 후보의 팔레트를 가져와 승리의 여백에 적용합니다. 팝업 (실제로 롤오버 label)은 위에서 만든 후보의 HTML이됩니다.

나머지는 표준 디자인입니다. stroke각 다각형 주위에 경계선을 설정합니다. smoothFactor 다각형 윤곽선 표시를 단순화합니다. 내가 좋아하는 RStudio 데모 맵에서 값을 복사했습니다. 그리고 fillOpacity당신이 기대하는 것입니다.

color다각형 자체가 아닌 다각형 경계선 의 색상입니다 (다각형 색상 은로 설정 됨 fillColor). weight다각형 경계선의 두께 (픽셀 단위)입니다. 

이 코드는 아래와 같은 맵을 생성하지만 마우스를 롤오버 (또는 모바일에서 탭)하고 기본 데이터를 볼 수있는 기능이 추가되었습니다. 

Sharon Machlis,

필라델피아는 오른쪽 하단에 있습니다. 지도에는 크지 만 유권자가 훨씬 적은 펜실베이니아의 다른 모든 지역과 비교하여 인구 측면에서 얼마나 중요한지 알 수 있습니다. 

Sharon Machlis,

2016 년과 2020 년의 펜실베니아와 같이 한 선거와 다른 선거 간의 원시 투표 마진 차이 를 매핑하는 것은 흥미로울 수 있습니다 .이지도는 패턴이 가장 많이 이동 한 위치를 보여주고 주 전체 결과의 변화를 설명하는 데 도움이 될 수 있습니다.

더 많은 선거 데이터 시각화에 관심이 있으시면 GitHub에서 제공되는 lections2 R 패키지를 만들었습니다. 그대로 설치하거나 GitHub에서 내 R 코드를 확인하여 자신의 용도에 맞게 조정할 수 있습니다.

더 많은 R 팁을 보려면의 Do More With R 페이지로 이동하세요.