황해

황해를 접한 대한민국 도시를 알아보자.

저자
소속

1 해안선

1.1 전세계 해안선

코드
library(tidyverse)
library(sf)
# library(rgdal)

# 세계 해안선 shapefile을 불러옵니다.
world_coastline <- st_read("data/ne_10m_coastline/ne_10m_coastline.shp")
#> Reading layer `ne_10m_coastline' from data source 
#>   `D:\tcs\map_challenge\data\ne_10m_coastline\ne_10m_coastline.shp' 
#>   using driver `ESRI Shapefile'
#> Simple feature collection with 4133 features and 3 fields
#> Geometry type: LINESTRING
#> Dimension:     XY
#> Bounding box:  xmin: -180 ymin: -85.22194 xmax: 180 ymax: 83.6341
#> Geodetic CRS:  WGS 84

plot(st_geometry(world_coastline))

1.2 대한민국

코드
# korea_geo_sgg <- gadm("KOR", level=2, path="data/", version="latest", resolution=1) %>% 
#   st_as_sf()

korea_sgg_geo <- terra::readRDS("data/gadm/gadm41_KOR_2_pk.rds") %>% st_as_sf()
 
korea_sgg_geo |> 
  ggplot() +
    geom_sf()

1.3 대한민국 해안선

코드
korea_coastline <- st_join(korea_sgg_geo, world_coastline, join = st_intersects)

# st_join(korea_sgg_geo, world_coastline, join = st_difference)

plot(st_geometry(korea_coastline))

2 경기도

2.1 시군구

  • 총 5 시군구: 김포시, 안산시 단원구, 화성시, 평택시, 시흥시
코드
sf_use_s2(FALSE)

admin_sf <- st_read("data/HangJeongDong_ver20230401.geojson")
#> Reading layer `HangJeongDong_ver20230401' from data source 
#>   `D:\tcs\map_challenge\data\HangJeongDong_ver20230401.geojson' 
#>   using driver `GeoJSON'
#> Simple feature collection with 3520 features and 10 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: 124.6097 ymin: 33.11187 xmax: 131.8713 ymax: 38.61695
#> Geodetic CRS:  WGS 84

gg_incheon_sf <- admin_sf %>% 
  filter(sidonm %in% c("경기도")) %>% 
  group_by(sidonm, sggnm) %>% 
  summarize(geometry = st_union(geometry)) %>% 
  mutate(바다인접 = ifelse(str_detect(sggnm, "김포|안산|화성|평택|시흥"), "바다인접", "비인접")) %>% 
  ungroup()

gg_incheon_sf %>% 
  ggplot() +
    geom_sf(aes(fill=바다인접), linewidth = 0.1) +
    ggrepel::geom_text_repel(
      aes(label = sggnm, geometry = geometry), stat = "sf_coordinates", 
      min.segment.length = 1, size = 3
    ) +
    theme_void() +
    scale_fill_manual(values = c("gray95", "skyblue")) +
    labs(title = "경기도 바다인접 시군구",
         fill = "바다인접 여부")

2.2 항구

코드
ports <- read_csv("data/해양수산부_항만정보_20210105.csv",locale=locale('ko',encoding='euc-kr'))

ports %>% 
  filter(str_detect(항만위치, "^경기"))
#> # A tibble: 1 × 23
#>   국가관리구분 항구분 항만명     관리청    항만위치 항구역 `수(물)면적` 부지면적
#>   <chr>        <chr>  <chr>      <chr>     <chr>    <chr>         <dbl>    <dbl>
#> 1 국가관리     신항만 평택당진항 해양수산… 경기도 … 현면…         90992     6440
#> # ℹ 15 more variables: 설계파고 <dbl>, 설계파향 <chr>, 최고조위 <dbl>,
#> #   평균해면 <dbl>, 해저지질 <chr>, 방파제길이 <dbl>, 안벽길이 <dbl>,
#> #   `물양장(소형선부두)길이` <dbl>, `잔교수(기)` <dbl>, `상옥수(동)` <dbl>,
#> #   야적장면적 <dbl>, `접안능력수(선석)` <dbl>, 하역능력수 <dbl>,
#> #   기타시설물현황 <chr>, 주요취급화물 <chr>
코드
fishing_sf <- st_read("data/해양경찰청_낚시어선 출입항 항포구 위치정보_20221129/D159-6.낚시어선 출입항 항포구 위치정보_v1.0.shp")
#> Reading layer `D159-6.낚시어선 출입항 항포구 위치정보_v1.0' from data source `D:\tcs\map_challenge\data\해양경찰청_낚시어선 출입항 항포구 위치정보_20221129\D159-6.낚시어선 출입항 항포구 위치정보_v1.0.shp' 
#>   using driver `ESRI Shapefile'
#> Simple feature collection with 135 features and 9 fields
#> Geometry type: POINT
#> Dimension:     XY
#> Bounding box:  xmin: 856626.6 ymin: 1469293 xmax: 1301571 ymax: 2050009
#> Projected CRS: Korea 2000 / Unified CS

fishing_sf <- st_transform(fishing_sf, crs = st_crs(gg_incheon_sf))

fishing_sf %>% 
  ggplot() +
    geom_sf() +
    ggrepel::geom_text_repel(
      aes(label = DEPART_NM, geometry = geometry), stat = "sf_coordinates", 
      min.segment.length = 1, size = 3
    ) +
    theme_void() +
    labs(title = "해양경찰청 낚시어선 출입항")  

2.3 경기도 X 낚시항포구

코드
# gg_incheon_sf %>% 
#   st_touches(fishing_sf %>% select(DEPART_NM, geometry), left=FALSE) 

gg_fishing_sf <- st_crop(fishing_sf, xmin = 126.3797, xmax = 127.8495,
                                     ymin = 36.893530, ymax = 38.29204)

ggplot() +
  geom_sf(data = gg_incheon_sf) +
  geom_sf(data = gg_fishing_sf, color = "red") +
  ggrepel::geom_text_repel(
    data = gg_fishing_sf,
      aes(label = DEPART_NM, geometry = geometry), stat = "sf_coordinates", 
      min.segment.length = 1, size = 3
    ) +
    theme_void() +
    labs(title = "해양경찰청 낚시어선 출입항")    

2.4 경기도 X 어촌어항

코드
library(readxl)
library(tidyverse)
library(httr)
library(jsonlite)

## 국가어항
nport_raw <- read_excel("data/어촌어항.xlsx", sheet = "국가어항", skip = 2)

ggport_tbl <- nport_raw %>% 
  janitor::clean_names(ascii = FALSE) %>% 
  filter(str_detect(주소, "^경기")) %>% 
  mutate(주소 = ifelse(어항_명 == "제부항", "경기도 화성시 서신면 제부리 289-20", 주소))
코드
get_lonlat <- function(address) {
  address_resp <- GET(url = 'https://dapi.kakao.com/v2/local/search/address.json',
           query = list(query = address),
           add_headers(Authorization = paste0("KakaoAK ", Sys.getenv("DAUM_MAP_API_KEY"))))

  address_list <- address_resp %>% 
    content(as = 'text') %>% 
    fromJSON()
  
  address_tbl <- address_list$documents$road_address %>% 
    dplyr::select(x,y) %>% 
    mutate(x = as.numeric(x),
           y = as.numeric(y))
  
  return(address_tbl)
}

# get_lonlat(kpmg_addr)

safely_get_lonlat <- safely(get_lonlat, otherwise = "error")

ggport_geo <- ggport_tbl %>% 
  mutate(data = map(주소, safely_get_lonlat))

# get_lonlat(ggport_tbl$주소[5])

# get_lonlat("경기도 화성시 서신면 제부리 289-20")

ggport_geo <- ggport_geo %>% 
  mutate(lonlat = map(data, "result")) %>% 
  mutate(lonlat = ifelse(어항_명 == "제부항", list(data.frame(x = 126.6228811, y=37.1795305)), lonlat)) %>% 
  mutate(lon = map(lonlat, select, x) %>% unlist,
         lat = map(lonlat, select, y) %>% unlist)

ggport_geo %>% 
  write_rds("data/ggport_geo.rds")
코드
ggport_geo <- read_rds("data/ggport_geo.rds")

ggport_geo_sf <- ggport_geo %>% 
  sf::st_as_sf(coords = c("lon", "lat"), crs = 4326, agr = "constant")

ggplot() +
  geom_sf(data = gg_incheon_sf, aes(fill = 바다인접), linewidth = 0.1, show.legend = FALSE) +
  geom_sf(data = ggport_geo_sf, aes(color = 어항_종류)) +
  ggrepel::geom_text_repel(
    data = ggport_geo_sf,
      aes(label = 어항_명, geometry = geometry), stat = "sf_coordinates", 
      min.segment.length = 1, size = 3
    ) +
    theme_void() +
    labs(title = "경기도 국가/지방어항 현황",
         color = "어항 종류") +
    ggrepel::geom_text_repel(
      data = gg_incheon_sf,
      aes(label = sggnm, geometry = geometry), stat = "sf_coordinates", 
      min.segment.length = 1, size = 3, show.legend = FALSE
    )   +
    scale_fill_manual(values = c("skyblue", "gray95")) +  
    scale_color_manual(values = c("지방어항" = "blue", "국가어항" = "red",
                                  "바다인접" = "black", "비인접" = "orange")) 

3 5 구시군 투개표

3.1 대선 (2022년)

코드
library(krvote)
library(janitor)
library(gt)
library(gtExtras)

ggport_sgg <- krvote::election_20220309$득표율 %>% 
  filter( str_detect(시도명, "^경기"),
          str_detect(구시군명, "^화성|^평택|^김포|^안산시단원구|^시흥")) 
  
ggport_sgg_table <- ggport_sgg %>% 
  pivot_longer(이재명:, names_to = "후보", values_to = "득표") %>% 
  group_by(구시군명, 후보) %>% 
  summarise(득표 = sum(득표)) %>% 
  filter(후보 != "계") %>% 
  ungroup() %>% 
  mutate(후보 = case_when( 후보 == "윤석열" ~ "국민의힘",
                           후보 == "이재명" ~ "민주당",
                           TRUE ~ "기타")) %>% 
  group_by(구시군명, 후보) %>% 
  summarise( 득표 = sum(득표)) %>% 
  ungroup() %>% 
  pivot_wider(names_from = 후보, values_from = 득표) %>% 
  janitor::adorn_totals(where = "col", name = "합계") 


ggport_sgg_table %>% 
  relocate(기타, .before = 합계) %>% 
  gt() %>% 
    fmt_integer(columns = 국민의힘:합계) %>% 
    cols_align(columns = 구시군명, align = "center") %>% 
    tab_spanner(
      label = "대선 후보 정당",
      columns = c(국민의힘, 민주당, 기타)
  ) %>% 
    gt_theme_538() %>% 
    tab_header(
      title = md("경기도 서해 인접 5개 구시군 정당별 득표"),
      subtitle = md("`제20대 대통령선거`")
  ) %>% 
  tab_style(
    style = list(cell_fill(color = "blue"),
                 cell_text(color = "white")),
    locations = cells_body(columns = 민주당,
                           rows = 민주당 > 국민의힘)
  ) %>% 
  tab_style(
    style = list(cell_fill(color = "red"),
                 cell_text(color = "white")),
    locations = cells_body(columns = 국민의힘,
                           rows = 민주당 < 국민의힘)
  )
경기도 서해 인접 5개 구시군 정당별 득표
제20대 대통령선거
구시군명 대선 후보 정당 합계
국민의힘 민주당 기타
김포시 136,814 153,206 9,933 299,953
시흥시 125,544 178,462 10,759 314,765
안산시단원구 80,605 103,595 6,975 191,175
평택시 156,630 166,032 13,143 335,805
화성시 236,055 283,324 18,320 537,699
코드
ggport_sgg_table %>% 
  adorn_percentages() %>% 
  gt::gt() %>% 
    fmt_percent(columns = 국민의힘:합계, decimals = 1) %>% 
    cols_align(columns = 구시군명, align = "center") %>% 
    tab_spanner(
      label = "대선 후보 정당",
      columns = c(국민의힘, 민주당, 기타)
  ) %>% 
    gt_theme_538() %>% 
    tab_header(
      title = md("경기도 서해 인접 5개 구시군 정당별 득표율(%)"),
      subtitle = md("`제20대 대통령선거`")
  )   %>% 
  tab_style(
    style = list(cell_fill(color = "blue"),
                 cell_text(color = "white")),
    locations = cells_body(columns = 민주당,
                           rows = 민주당 > 국민의힘)
  ) %>% 
  tab_style(
    style = list(cell_fill(color = "red"),
                 cell_text(color = "white")),
    locations = cells_body(columns = 국민의힘,
                           rows = 민주당 < 국민의힘)
  )
경기도 서해 인접 5개 구시군 정당별 득표율(%)
제20대 대통령선거
구시군명 대선 후보 정당 합계
국민의힘 민주당 기타
김포시 45.6% 51.1% 3.3% 100.0%
시흥시 39.9% 56.7% 3.4% 100.0%
안산시단원구 42.2% 54.2% 3.6% 100.0%
평택시 46.6% 49.4% 3.9% 100.0%
화성시 43.9% 52.7% 3.4% 100.0%

3.2 총선 (2020년)

코드
library(stringi)

general_sgg <- krvote::general_2020 %>% 
  filter( str_detect(시도, "^경기"),
          str_detect(선거구, "^화성|^평택|^김포|^안산시단원구|^시흥")) 

general_sgg_table <- general_sgg %>% 
  unnest(data) %>% 
  ## CP949 인코딩 처리
  mutate(구분_cp949  = iconv(구분, "euc-kr", "utf-8")) %>% 
  mutate(구분 = ifelse(is.na(구분_cp949), 구분, 구분_cp949)) %>% 
  group_by(선거구, 구분) %>% 
  summarise( 득표 = sum(사람수)) %>% 
  filter(구분 != "무표투표수",
         구분 != "기권수",
         구분 != "선거인수",
         구분 != "투표수",
         구분 != "계") %>% 
  ungroup() %>% 
  mutate(구분 = case_when( str_detect(구분, "민주당") ~ "민주당",
                           str_detect(구분, "미래통합") ~ "국민의힘",
                           TRUE ~ "기타")) %>% 
  group_by(선거구, 구분) %>% 
  summarise(득표 = sum(득표)) %>% 
  ungroup() %>% 
  pivot_wider(names_from = 구분, values_from = 득표) %>% 
  janitor::adorn_totals(where = "col", name = "합계") 

general_sgg_table %>% 
  relocate(기타, .before = 합계) %>% 
  gt() %>% 
    fmt_integer(columns = 국민의힘:합계) %>% 
    cols_align(columns = 선거구, align = "center") %>% 
    tab_spanner(
      label = "대선 후보 정당",
      columns = c(국민의힘, 민주당, 기타)
  ) %>% 
    gt_theme_538() %>% 
    tab_header(
      title = md("경기도 서해 인접 5개 구시군 정당별 득표"),
      subtitle = md("`제21대 국회의원선거`")
  )  %>% 
  tab_style(
    style = list(cell_fill(color = "blue"),
                 cell_text(color = "white")),
    locations = cells_body(columns = 민주당,
                           rows = 민주당 > 국민의힘)
  ) %>% 
  tab_style(
    style = list(cell_fill(color = "red"),
                 cell_text(color = "white")),
    locations = cells_body(columns = 국민의힘,
                           rows = 민주당 < 국민의힘)
  )
경기도 서해 인접 5개 구시군 정당별 득표
제21대 국회의원선거
선거구 대선 후보 정당 합계
국민의힘 민주당 기타
김포시갑 42,660 58,613 9,556 110,829
김포시을 52,200 63,193 1,996 117,389
시흥시갑 59,595 68,653 4,497 132,745
시흥시을 32,700 69,270 1,381 103,351
안산시단원구갑 31,086 42,009 2,264 75,359
안산시단원구을 38,497 42,150 1,476 82,123
평택시갑 59,063 62,564 2,946 124,573
평택시을 59,491 57,540 7,755 124,786
화성시갑 52,291 58,689 7,218 118,198
화성시병 47,377 88,793 1,599 137,769
화성시을 52,802 98,612 1,391 152,805
코드
general_sgg_table %>% 
  adorn_percentages() %>% 
  gt::gt() %>% 
    fmt_percent(columns = 국민의힘:합계, decimals = 1) %>% 
    cols_align(columns = 선거구, align = "center") %>% 
    tab_spanner(
      label = "대선 후보 정당",
      columns = c(국민의힘, 민주당, 기타)
  ) %>% 
    gt_theme_538() %>% 
    tab_header(
      title = md("경기도 서해 인접 5개 구시군 정당별 득표율(%)"),
      subtitle = md("`제21대 국회의원선거`")
  )  %>% 
  tab_style(
    style = list(cell_fill(color = "blue"),
                 cell_text(color = "white")),
    locations = cells_body(columns = 민주당,
                           rows = 민주당 > 국민의힘)
  ) %>% 
  tab_style(
    style = list(cell_fill(color = "red"),
                 cell_text(color = "white")),
    locations = cells_body(columns = 국민의힘,
                           rows = 민주당 < 국민의힘)
  )
경기도 서해 인접 5개 구시군 정당별 득표율(%)
제21대 국회의원선거
선거구 대선 후보 정당 합계
국민의힘 민주당 기타
김포시갑 38.5% 52.9% 8.6% 100.0%
김포시을 44.5% 53.8% 1.7% 100.0%
시흥시갑 44.9% 51.7% 3.4% 100.0%
시흥시을 31.6% 67.0% 1.3% 100.0%
안산시단원구갑 41.3% 55.7% 3.0% 100.0%
안산시단원구을 46.9% 51.3% 1.8% 100.0%
평택시갑 47.4% 50.2% 2.4% 100.0%
평택시을 47.7% 46.1% 6.2% 100.0%
화성시갑 44.2% 49.7% 6.1% 100.0%
화성시병 34.4% 64.5% 1.2% 100.0%
화성시을 34.6% 64.5% 0.9% 100.0%

3.3 지선 - 도지사 (2022년)

코드
local_sido_raw <- krvote::local_sido_20220601 %>% 
  filter(str_detect(선거구명, "^경기")) %>% 
  unnest(data) %>% 
  filter(str_detect(구시군명, "^화성|^평택|^김포|^안산시단원구|^시흥")) %>% 
  pivot_longer(더불어민주당_김동연:기권수) %>% 
  separate(name, into = c("정당", "후보"), sep = "_") %>% 
  filter(!is.na(후보)) %>% 
  group_by(구시군명, 정당) %>% 
  summarise(득표 = sum(value)) %>% 
  ungroup()

local_sido_table <- local_sido_raw %>% 
  mutate(정당 = case_when( str_detect(정당, "민주당") ~ "민주당",
                           str_detect(정당, "국민의힘") ~ "국민의힘",
                           TRUE ~ "기타")) %>% 
  group_by(구시군명, 정당) %>% 
  summarise(득표 = sum(득표)) %>% 
  ungroup() %>% 
  pivot_wider(names_from = 정당, values_from = 득표) %>% 
  janitor::adorn_totals(where = "col", name = "합계") 

local_sido_table %>% 
  relocate(기타, .before = 합계) %>% 
  gt() %>% 
    fmt_integer(columns = 국민의힘:합계) %>% 
    cols_align(columns = 구시군명, align = "center") %>% 
    tab_spanner(
      label = "지방선거 도지사 후보 정당",
      columns = c(국민의힘, 민주당, 기타)
  ) %>% 
    gt_theme_538() %>% 
    tab_header(
      title = md("경기도 서해 인접 5개 구시군 정당별 득표"),
      subtitle = md("`제8대 지방선거`")
  )  %>% 
  tab_style(
    style = list(cell_fill(color = "blue"),
                 cell_text(color = "white")),
    locations = cells_body(columns = 민주당,
                           rows = 민주당 > 국민의힘)
  ) %>% 
  tab_style(
    style = list(cell_fill(color = "red"),
                 cell_text(color = "white")),
    locations = cells_body(columns = 국민의힘,
                           rows = 민주당 < 국민의힘)
  )
경기도 서해 인접 5개 구시군 정당별 득표
제8대 지방선거
구시군명 지방선거 도지사 후보 정당 합계
국민의힘 민주당 기타
김포시 98,054 92,596 3,586 194,236
시흥시 84,897 104,762 3,661 193,320
안산시단원구 55,679 61,954 2,650 120,283
평택시 104,256 96,908 4,669 205,833
화성시 153,636 173,747 6,527 333,910
코드
local_sido_table %>% 
  adorn_percentages() %>% 
  gt::gt() %>% 
    fmt_percent(columns = 국민의힘:합계, decimals = 1) %>% 
    cols_align(columns = 구시군명, align = "center") %>% 
    tab_spanner(
      label = "지방선거 도지사 후보 정당",
      columns = c(국민의힘, 민주당, 기타)
  ) %>% 
    gt_theme_538() %>% 
    tab_header(
      title = md("경기도 서해 인접 5개 구시군 정당별 득표"),
      subtitle = md("`제8대 지방선거`")
  )  %>% 
  tab_style(
    style = list(cell_fill(color = "blue"),
                 cell_text(color = "white")),
    locations = cells_body(columns = 민주당,
                           rows = 민주당 > 국민의힘)
  ) %>% 
  tab_style(
    style = list(cell_fill(color = "red"),
                 cell_text(color = "white")),
    locations = cells_body(columns = 국민의힘,
                           rows = 민주당 < 국민의힘)
  )
경기도 서해 인접 5개 구시군 정당별 득표
제8대 지방선거
구시군명 지방선거 도지사 후보 정당 합계
국민의힘 민주당 기타
김포시 50.5% 47.7% 1.8% 100.0%
시흥시 43.9% 54.2% 1.9% 100.0%
안산시단원구 46.3% 51.5% 2.2% 100.0%
평택시 50.7% 47.1% 2.3% 100.0%
화성시 46.0% 52.0% 2.0% 100.0%

3.4 지선 - 구시군장 (2022년)

코드
local_sgg_raw <- krvote::local_sgg_20220601 %>% 
  filter(str_detect(시도명, "^경기")) %>% 
  filter(str_detect(구시군명, "^화성|^평택|^김포|^안산|^시흥")) %>% 
  mutate(득표 = parse_number(득표)) %>% 
  group_by(구시군명, 정당) %>% 
  summarise(득표 = sum(득표)) %>% 
  ungroup()

local_sgg_table <- local_sgg_raw %>% 
  mutate(정당 = case_when( str_detect(정당, "민주당") ~ "민주당",
                           str_detect(정당, "국민의힘") ~ "국민의힘",
                           TRUE ~ "기타")) %>% 
  group_by(구시군명, 정당) %>% 
  summarise(득표 = sum(득표, na.rm = TRUE)) %>% 
  ungroup() %>% 
  pivot_wider(names_from = 정당, values_from = 득표, values_fill = 0) %>% 
  janitor::adorn_totals(where = "col", name = "합계") 

local_sgg_table %>% 
  relocate(기타, .before = 합계) %>% 
  gt() %>% 
    fmt_integer(columns = 국민의힘:합계) %>% 
    cols_align(columns = 구시군명, align = "center") %>% 
    tab_spanner(
      label = "지방선거 구시군의 장 후보 정당",
      columns = c(국민의힘, 민주당, 기타)
  ) %>% 
    gt_theme_538() %>% 
    tab_header(
      title = md("경기도 서해 인접 5개 구시군 정당별 득표"),
      subtitle = md("`제8대 지방선거`")
  )  %>% 
  tab_style(
    style = list(cell_fill(color = "blue"),
                 cell_text(color = "white")),
    locations = cells_body(columns = 민주당,
                           rows = 민주당 > 국민의힘)
  ) %>% 
  tab_style(
    style = list(cell_fill(color = "red"),
                 cell_text(color = "white")),
    locations = cells_body(columns = 국민의힘,
                           rows = 민주당 < 국민의힘)
  )
경기도 서해 인접 5개 구시군 정당별 득표
제8대 지방선거
구시군명 지방선거 구시군의 장 후보 정당 합계
국민의힘 민주당 기타
김포시 101,566 86,798 5,386 193,750
시흥시 85,217 106,468 0 191,685
안산시 119,776 119,595 18,092 257,463
평택시 98,566 107,159 0 205,725
화성시 156,386 176,631 0 333,017
코드
local_sgg_table %>% 
  adorn_percentages() %>% 
  gt::gt() %>% 
    fmt_percent(columns = 국민의힘:합계, decimals = 1) %>% 
    cols_align(columns = 구시군명, align = "center") %>% 
    tab_spanner(
      label = "지방선거 구시군의 장 후보 정당",
      columns = c(국민의힘, 민주당, 기타)
  ) %>% 
    gt_theme_538() %>% 
    tab_header(
      title = md("경기도 서해 인접 5개 구시군 정당별 득표"),
      subtitle = md("`제8대 지방선거`")
  )  %>% 
  tab_style(
    style = list(cell_fill(color = "blue"),
                 cell_text(color = "white")),
    locations = cells_body(columns = 민주당,
                           rows = 민주당 > 국민의힘)
  ) %>% 
  tab_style(
    style = list(cell_fill(color = "red"),
                 cell_text(color = "white")),
    locations = cells_body(columns = 국민의힘,
                           rows = 민주당 < 국민의힘)
  )
경기도 서해 인접 5개 구시군 정당별 득표
제8대 지방선거
구시군명 지방선거 구시군의 장 후보 정당 합계
국민의힘 민주당 기타
김포시 52.4% 44.8% 2.8% 100.0%
시흥시 44.5% 55.5% 0.0% 100.0%
안산시 46.5% 46.5% 7.0% 100.0%
평택시 47.9% 52.1% 0.0% 100.0%
화성시 47.0% 53.0% 0.0% 100.0%