본문 바로가기
  • 紹睿: 자유롭고 더불어 사는 가치있는 삶
Study/파이썬으로 데이터 주무르기

[19대 선거] 후보 간의 득표 수 시각화 하기

by 징여 2018. 7. 16.
반응형
 

19대 선거결과 시각화¶

In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
In [22]:
election_result = pd.read_csv('./data/05. election_result.csv', index_col=0)
election_result.head(3)
Out[22]:
  광역시도 시군 pop moon ahn hong
0 서울특별시 종로구 102566.0 42512.0 22313.0 22325.0
1 서울특별시 중구 82852.0 34062.0 19372.0 17901.0
2 서울특별시 용산구 148157.0 58081.0 32109.0 35230.0
 

1. 광역시도 이름을 2글자로 정리하기¶

In [23]:
sido_candi = election_result['광역시도']
sido_candi = [name[:2] if name[:2] in ['서울', '부산', '대구', '광주', '인천', '대전', '울산'] else '' for name in sido_candi]
In [24]:
def cut_char_sigu(name):
    return name if len(name)==2 else name[:-1]
 

같은 시군이 이름이 존재하는 곳은 뒤에 시 까지 붙여줌¶

  • ex: 성남 중원 /성남 분당 / 성남 수정
In [25]:
import re
sigun_candi = ['']*len(election_result)
for n in election_result.index:
    each = election_result['시군'][n]
    if each[:2] in ['수원', '성남', '안양', '안산', '고양', '용인', '청주', '천안', '전주', '포항', '창원']:
        sigun_candi[n] = re.split('시', each)[0] + ' '+ cut_char_sigu(re.split('시', each)[1])
    else:
        sigun_candi[n] = cut_char_sigu(each)
print(sigun_candi)
 
['종로', '중구', '용산', '성동', '광진', '동대문', '중랑', '성북', '강북', '도봉', '노원', '은평', '서대문', '마포', '양천', '강서', '구로', '금천', '영등포', '동작', '관악', '서초', '강남', '송파', '강동', '중구', '서구', '동구', '영도', '부산진', '동래', '남구', '북구', '해운대', '기장', '사하', '금정', '강서', '연제', '수영', '사상', '중구', '동구', '서구', '남구', '북구', '수성', '달서', '달성', '중구', '동구', '남구', '연수', '남동', '부평', '계양', '서구', '강화', '옹진', '동구', '서구', '남구', '북구', '광산', '동구', '중구', '서구', '유성', '대덕', '중구', '남구', '동구', '북구', '울주', '세종특별자치', '수원 장안', '수원 권선', '수원 팔달', '수원 영통', '성남 수정', '성남 중원', '성남 분당', '의정부', '안양 만안', '안양 동안', '부천', '광명', '평택', '양주', '동두천', '안산 상록', '안산 단원', '고양 덕양', '고양 일산동', '고양 일산서', '과천', '의왕', '구리', '남양주', '오산', '화성', '시흥', '군포', '하남', '파주', '여주', '이천', '용인 처인', '용인 수지', '용인 기흥', '안성', '김포', '광주', '포천', '연천', '양평', '가평', '춘천', '원주', '강릉', '동해', '삼척', '태백', '정선', '속초', '고성', '양양', '인제', '홍천', '횡성', '영월', '평창', '화천', '양구', '철원', '청주 상당', '청주 서원', '청주 흥덕', '청주 청원', '충주', '제천', '단양', '영동', '보은', '옥천', '음성', '진천', '괴산', '증평', '천안 서북', '천안 동남', '공주', '보령', '아산', '서산', '태안', '금산', '논산', '계룡', '당진', '부여', '서천', '홍성', '청양', '예산', '전주 완산', '전주 덕진', '군산', '익산', '정읍', '남원', '김제', '완주', '진안', '무주', '장수', '임실', '순창', '고창', '부안', '목포', '여수', '순천', '나주', '광양', '담양', '장성', '곡성', '구례', '고흥', '보성', '화순', '장흥', '강진', '완도', '해남', '진도', '영암', '무안', '영광', '함평', '신안', '포항 북구', '포항 남구', '울릉', '경주', '김천', '안동', '구미', '영주', '영천', '상주', '문경', '예천', '경산', '청도', '고령', '성주', '칠곡', '군위', '의성', '청송', '영양', '영덕', '봉화', '울진', '창원 의창', '창원 성산', '창원 마산합포', '창원 마산회원', '창원 진해', '진주', '통영', '고성', '사천', '김해', '밀양', '거제', '의령', '함안', '창녕', '양산', '하동', '남해', '함양', '산청', '거창', '합천', '제주', '서귀포']
In [26]:
ID_candi = [sido_candi[n]+' '+sigun_candi[n] for n in range(len(sigun_candi))]
ID_candi = [name[1:] if name[0] == ' ' else name for name in ID_candi]
ID_candi = [name[:2] if name[:2] == '세종' else name for name in ID_candi]
print(ID_candi)
 
['서울 종로', '서울 중구', '서울 용산', '서울 성동', '서울 광진', '서울 동대문', '서울 중랑', '서울 성북', '서울 강북', '서울 도봉', '서울 노원', '서울 은평', '서울 서대문', '서울 마포', '서울 양천', '서울 강서', '서울 구로', '서울 금천', '서울 영등포', '서울 동작', '서울 관악', '서울 서초', '서울 강남', '서울 송파', '서울 강동', '부산 중구', '부산 서구', '부산 동구', '부산 영도', '부산 부산진', '부산 동래', '부산 남구', '부산 북구', '부산 해운대', '부산 기장', '부산 사하', '부산 금정', '부산 강서', '부산 연제', '부산 수영', '부산 사상', '대구 중구', '대구 동구', '대구 서구', '대구 남구', '대구 북구', '대구 수성', '대구 달서', '대구 달성', '인천 중구', '인천 동구', '인천 남구', '인천 연수', '인천 남동', '인천 부평', '인천 계양', '인천 서구', '인천 강화', '인천 옹진', '광주 동구', '광주 서구', '광주 남구', '광주 북구', '광주 광산', '대전 동구', '대전 중구', '대전 서구', '대전 유성', '대전 대덕', '울산 중구', '울산 남구', '울산 동구', '울산 북구', '울산 울주', '세종', '수원 장안', '수원 권선', '수원 팔달', '수원 영통', '성남 수정', '성남 중원', '성남 분당', '의정부', '안양 만안', '안양 동안', '부천', '광명', '평택', '양주', '동두천', '안산 상록', '안산 단원', '고양 덕양', '고양 일산동', '고양 일산서', '과천', '의왕', '구리', '남양주', '오산', '화성', '시흥', '군포', '하남', '파주', '여주', '이천', '용인 처인', '용인 수지', '용인 기흥', '안성', '김포', '광주', '포천', '연천', '양평', '가평', '춘천', '원주', '강릉', '동해', '삼척', '태백', '정선', '속초', '고성', '양양', '인제', '홍천', '횡성', '영월', '평창', '화천', '양구', '철원', '청주 상당', '청주 서원', '청주 흥덕', '청주 청원', '충주', '제천', '단양', '영동', '보은', '옥천', '음성', '진천', '괴산', '증평', '천안 서북', '천안 동남', '공주', '보령', '아산', '서산', '태안', '금산', '논산', '계룡', '당진', '부여', '서천', '홍성', '청양', '예산', '전주 완산', '전주 덕진', '군산', '익산', '정읍', '남원', '김제', '완주', '진안', '무주', '장수', '임실', '순창', '고창', '부안', '목포', '여수', '순천', '나주', '광양', '담양', '장성', '곡성', '구례', '고흥', '보성', '화순', '장흥', '강진', '완도', '해남', '진도', '영암', '무안', '영광', '함평', '신안', '포항 북구', '포항 남구', '울릉', '경주', '김천', '안동', '구미', '영주', '영천', '상주', '문경', '예천', '경산', '청도', '고령', '성주', '칠곡', '군위', '의성', '청송', '영양', '영덕', '봉화', '울진', '창원 의창', '창원 성산', '창원 마산합포', '창원 마산회원', '창원 진해', '진주', '통영', '고성', '사천', '김해', '밀양', '거제', '의령', '함안', '창녕', '양산', '하동', '남해', '함양', '산청', '거창', '합천', '제주', '서귀포']
In [27]:
election_result['ID'] = ID_candi
election_result.head(10)
Out[27]:
  광역시도 시군 pop moon ahn hong ID
0 서울특별시 종로구 102566.0 42512.0 22313.0 22325.0 서울 종로
1 서울특별시 중구 82852.0 34062.0 19372.0 17901.0 서울 중구
2 서울특별시 용산구 148157.0 58081.0 32109.0 35230.0 서울 용산
3 서울특별시 성동구 203175.0 86686.0 45674.0 40566.0 서울 성동
4 서울특별시 광진구 240030.0 105512.0 52824.0 46368.0 서울 광진
5 서울특별시 동대문구 236092.0 98958.0 53359.0 51631.0 서울 동대문
6 서울특별시 중랑구 265706.0 111450.0 62778.0 56545.0 서울 중랑
7 서울특별시 성북구 295866.0 129263.0 66518.0 57584.0 서울 성북
8 서울특별시 강북구 210614.0 89645.0 51669.0 42268.0 서울 강북
9 서울특별시 도봉구 229233.0 94898.0 55600.0 47461.0 서울 도봉
In [28]:
election_result[['rate_moon', 'rate_hong', 'rate_ahn']] = election_result[['moon', 'hong', 'ahn']].div(election_result['pop'], axis=0)
election_result[['rate_moon', 'rate_hong', 'rate_ahn']] *= 100
election_result.head(3)
Out[28]:
  광역시도 시군 pop moon ahn hong ID rate_moon rate_hong rate_ahn
0 서울특별시 종로구 102566.0 42512.0 22313.0 22325.0 서울 종로 41.448433 21.766472 21.754773
1 서울특별시 중구 82852.0 34062.0 19372.0 17901.0 서울 중구 41.111862 21.605996 23.381451
2 서울특별시 용산구 148157.0 58081.0 32109.0 35230.0 서울 용산 39.202333 23.778829 21.672280
 

문 후보가 높은 비율로 득표한 지역¶

In [32]:
election_result.sort_values(['rate_moon'], ascending=[False]).head(10)
Out[32]:
  광역시도 시군 pop moon ahn hong ID rate_moon rate_hong rate_ahn
182 전라남도 순천시 181451.0 122595.0 40429.0 4525.0 순천 67.563695 2.493786 22.280946
166 전라북도 전주시덕진구 187921.0 125375.0 40188.0 5183.0 전주 덕진 66.716865 2.758074 21.385582
165 전라북도 전주시완산구 236383.0 157637.0 50506.0 7003.0 전주 완산 66.687114 2.962565 21.366173
175 전라북도 장수군 16079.0 10714.0 3353.0 717.0 장수 66.633497 4.459233 20.853287
184 전라남도 광양시 96384.0 63544.0 20080.0 4100.0 광양 65.927955 4.253818 20.833333
173 전라북도 진안군 18107.0 11918.0 3904.0 819.0 진안 65.819849 4.523113 21.560722
172 전라북도 완주군 62470.0 41057.0 13897.0 2107.0 완주 65.722747 3.372819 22.245878
168 전라북도 익산시 192208.0 123422.0 45737.0 6470.0 익산 64.212728 3.366145 23.795576
170 전라북도 남원시 55371.0 35539.0 13854.0 1939.0 남원 64.183417 3.501833 25.020317
63 광주광역시 광산구 248209.0 159119.0 65402.0 3630.0 광주 광산 64.106862 1.462477 26.349568
 

홍 후보¶

In [33]:
election_result.sort_values(['rate_hong'], ascending=[False]).head(10)
Out[33]:
  광역시도 시군 pop moon ahn hong ID rate_moon rate_hong rate_ahn
219 경상북도 군위군 17627.0 2251.0 1939.0 11651.0 군위 12.770182 66.097464 11.000170
220 경상북도 의성군 37855.0 5365.0 4767.0 23790.0 의성 14.172500 62.845067 12.592788
223 경상북도 영덕군 26125.0 3786.0 3231.0 16314.0 영덕 14.491866 62.445933 12.367464
247 경상남도 합천군 33021.0 7143.0 3077.0 19699.0 합천 21.631689 59.655976 9.318313
216 경상북도 고령군 22396.0 3754.0 2600.0 13248.0 고령 16.761922 59.153420 11.609216
213 경상북도 예천군 32124.0 5261.0 4427.0 18863.0 예천 16.377163 58.719338 13.780974
215 경상북도 청도군 30398.0 5323.0 3654.0 17678.0 청도 17.511020 58.155142 12.020528
221 경상북도 청송군 18418.0 3218.0 2387.0 10669.0 청송 17.472038 57.927028 12.960148
240 경상남도 창녕군 42878.0 10310.0 3877.0 24464.0 창녕 24.044965 57.054900 9.041933
212 경상북도 문경시 49113.0 8616.0 6905.0 27832.0 문경 17.543217 56.669314 14.059414
 

안 후보¶

In [34]:
election_result.sort_values(['rate_ahn'], ascending=[False]).head(10)
Out[34]:
  광역시도 시군 pop moon ahn hong ID rate_moon rate_hong rate_ahn
196 전라남도 진도군 21189.0 10392.0 8855.0 511.0 진도 49.044315 2.411629 41.790552
201 전라남도 신안군 28950.0 14370.0 12000.0 713.0 신안 49.637306 2.462867 41.450777
193 전라남도 강진군 25175.0 12476.0 10152.0 753.0 강진 49.557100 2.991063 40.325720
195 전라남도 해남군 48351.0 25901.0 18157.0 1158.0 해남 53.568696 2.394987 37.552481
197 전라남도 영암군 36402.0 18999.0 13610.0 825.0 영암 52.192187 2.266359 37.388056
180 전라남도 목포시 145476.0 77896.0 53303.0 2584.0 목포 53.545602 1.776238 36.640408
59 광주광역시 동구 66287.0 37053.0 23438.0 1308.0 광주 동구 55.897838 1.973238 35.358366
192 전라남도 장흥군 27149.0 14821.0 9593.0 636.0 장흥 54.591329 2.342628 35.334635
190 전라남도 보성군 29967.0 16666.0 10514.0 732.0 보성 55.614509 2.442687 35.085260
198 전라남도 무안군 52516.0 29516.0 18052.0 983.0 무안 56.203824 1.871810 34.374286
 

2. 지도로 나타내기¶

In [36]:
draw_korea = pd.read_csv('./data/05. draw_korea.csv', encoding='utf-8', index_col=0)
draw_korea.head()
Out[36]:
  y x ID
0 0 7 철원
1 0 8 화천
2 0 9 양구
3 0 10 고성(강원)
4 1 3 양주
In [37]:
set(draw_korea['ID'].unique( )) - set(election_result['ID'].unique())
Out[37]:
{'고성(강원)', '고성(경남)', '부천 소사', '부천 오정', '부천 원미', '창원 합포', '창원 회원'}
In [38]:
set(election_result['ID'].unique()) - set(draw_korea['ID'].unique( )) 
Out[38]:
{'고성', '부천', '창원 마산합포', '창원 마산회원'}
 

2-1. 고성, 부천, 창원에 대한 ID값이 달라 이를 수정해주어야한다.¶

In [39]:
election_result[election_result['ID']=='고성']
Out[39]:
  광역시도 시군 pop moon ahn hong ID rate_moon rate_hong rate_ahn
125 강원도 고성군 18692.0 5664.0 3964.0 6511.0 고성 30.301733 34.833084 21.206933
233 경상남도 고성군 34603.0 9848.0 4104.0 16797.0 고성 28.459960 48.542034 11.860243
In [41]:
election_result.loc[125, 'ID'] = '고성(강원)'
election_result.loc[233, 'ID'] = '고성(경남)'

election_result[election_result['시군']=='고성군']
Out[41]:
  광역시도 시군 pop moon ahn hong ID rate_moon rate_hong rate_ahn
125 강원도 고성군 18692.0 5664.0 3964.0 6511.0 고성(강원) 30.301733 34.833084 21.206933
233 경상남도 고성군 34603.0 9848.0 4104.0 16797.0 고성(경남) 28.459960 48.542034 11.860243
In [45]:
election_result[election_result['ID']=='창원 마산합포']
Out[45]:
  광역시도 시군 pop moon ahn hong ID rate_moon rate_hong rate_ahn
228 경상남도 창원시마산합포구 119281.0 35592.0 14686.0 54488.0 창원 마산합포 29.838784 45.680368 12.312103
In [46]:
election_result[election_result['광역시도']=='경상남도']
Out[46]:
  광역시도 시군 pop moon ahn hong ID rate_moon rate_hong rate_ahn
226 경상남도 창원시의창구 164047.0 60757.0 22830.0 56887.0 창원 의창 37.036337 34.677257 13.916743
227 경상남도 창원시성산구 153327.0 63717.0 22923.0 42052.0 창원 성산 41.556282 27.426350 14.950400
228 경상남도 창원시마산합포구 119281.0 35592.0 14686.0 54488.0 창원 마산합포 29.838784 45.680368 12.312103
229 경상남도 창원시마산회원구 136757.0 45014.0 17744.0 56340.0 창원 마산회원 32.915317 41.197160 12.974839
230 경상남도 창원시진해구 114779.0 41249.0 17435.0 40049.0 창원 진해 35.937759 34.892271 15.190061
231 경상남도 진주시 222813.0 73929.0 26687.0 93751.0 진주 33.179841 42.076091 11.977308
232 경상남도 통영시 82855.0 25477.0 10738.0 36128.0 통영 30.748899 43.603886 12.959990
233 경상남도 고성군 34603.0 9848.0 4104.0 16797.0 고성(경남) 28.459960 48.542034 11.860243
234 경상남도 사천시 71555.0 22370.0 8350.0 32475.0 사천 31.262665 45.384669 11.669345
235 경상남도 김해시 318253.0 147972.0 45126.0 82880.0 김해 46.495084 26.042174 14.179285
236 경상남도 밀양시 70687.0 20842.0 9073.0 32394.0 밀양 29.484912 45.827380 12.835458
237 경상남도 거제시 150230.0 68291.0 20359.0 38775.0 거제 45.457632 25.810424 13.551887
238 경상남도 의령군 19258.0 5115.0 1984.0 10134.0 의령 26.560390 52.622287 10.302212
239 경상남도 함안군 43866.0 13597.0 5399.0 19809.0 함안 30.996672 45.157981 12.307938
240 경상남도 창녕군 42878.0 10310.0 3877.0 24464.0 창녕 24.044965 57.054900 9.041933
241 경상남도 양산시 199835.0 83412.0 30945.0 58811.0 양산 41.740436 29.429780 15.485275
242 경상남도 하동군 34324.0 11211.0 4150.0 14864.0 하동 32.662277 43.304976 12.090665
243 경상남도 남해군 30208.0 8680.0 3906.0 14166.0 남해 28.734110 46.894862 12.930350
244 경상남도 함양군 26640.0 7388.0 3203.0 13008.0 함양 27.732733 48.828829 12.023273
245 경상남도 산청군 24513.0 6561.0 2753.0 12544.0 산청 26.765390 51.172847 11.230776
246 경상남도 거창군 41325.0 11256.0 4923.0 19976.0 거창 27.237750 48.338778 11.912886
247 경상남도 합천군 33021.0 7143.0 3077.0 19699.0 합천 21.631689 59.655976 9.318313
In [47]:
election_result.loc[228, 'ID'] = '창원 합포'
election_result.loc[229, 'ID'] = '창원 회원'
 

2-2. 부천¶

2016년부터 소사,오정,원미구를 폐지했기 때문에, 그냥 단순히 부천을 3개로 나누어 각각 넣어주자

In [48]:
election_result[election_result['시군'] =='부천시']
Out[48]:
  광역시도 시군 pop moon ahn hong ID rate_moon rate_hong rate_ahn
85 경기도 부천시 543777.0 239697.0 128297.0 100544.0 부천 44.080018 18.489932 23.593679
In [86]:
tmp = election_result[election_result['시군'] =='부천시'][['pop', 'moon', 'ahn', 'hong', 'rate_moon', 'rate_hong', 'rate_ahn']]
tmp['광역시도'] = '경기도'
tmp['시군'] = '부천시'
tmp['ID'] = '부천 소사'

for i in [ '부천 오정', '부천 원미']:
    t = election_result[election_result['시군'] =='부천시'][['pop', 'moon', 'ahn', 'hong', 'rate_moon', 'rate_hong', 'rate_ahn']]
    t['광역시도'] = '경기도'
    t['시군'] = '부천시'
    t['ID'] = i
    tmp = tmp.append(t)
tmp
Out[86]:
  pop moon ahn hong rate_moon rate_hong rate_ahn 광역시도 시군 ID
85 543777.0 239697.0 128297.0 100544.0 44.080018 18.489932 23.593679 경기도 부천시 부천 소사
85 543777.0 239697.0 128297.0 100544.0 44.080018 18.489932 23.593679 경기도 부천시 부천 오정
85 543777.0 239697.0 128297.0 100544.0 44.080018 18.489932 23.593679 경기도 부천시 부천 원미
In [88]:
election_result2 = pd.concat([tmp, election_result])
election_result2[election_result2['시군']=='부천시']
Out[88]:
  ID ahn hong moon pop rate_ahn rate_hong rate_moon 광역시도 시군
85 부천 소사 128297.0 100544.0 239697.0 543777.0 23.593679 18.489932 44.080018 경기도 부천시
85 부천 오정 128297.0 100544.0 239697.0 543777.0 23.593679 18.489932 44.080018 경기도 부천시
85 부천 원미 128297.0 100544.0 239697.0 543777.0 23.593679 18.489932 44.080018 경기도 부천시
85 부천 128297.0 100544.0 239697.0 543777.0 23.593679 18.489932 44.080018 경기도 부천시
In [89]:
election_result2.reset_index(inplace=True)
In [92]:
del election_result2['index']
In [98]:
election_result2.drop([88], inplace=True)
election_result2[election_result2['시군']=='부천시']
Out[98]:
  ID ahn hong moon pop rate_ahn rate_hong rate_moon 광역시도 시군
0 부천 소사 128297.0 100544.0 239697.0 543777.0 23.593679 18.489932 44.080018 경기도 부천시
1 부천 오정 128297.0 100544.0 239697.0 543777.0 23.593679 18.489932 44.080018 경기도 부천시
2 부천 원미 128297.0 100544.0 239697.0 543777.0 23.593679 18.489932 44.080018 경기도 부천시
In [99]:
final_elect_data = pd.merge(election_result2, draw_korea, how='left', on=['ID'])
final_elect_data.head(3)
Out[99]:
  ID ahn hong moon pop rate_ahn rate_hong rate_moon 광역시도 시군 y x
0 부천 소사 128297.0 100544.0 239697.0 543777.0 23.593679 18.489932 44.080018 경기도 부천시 4 2
1 부천 오정 128297.0 100544.0 239697.0 543777.0 23.593679 18.489932 44.080018 경기도 부천시 6 2
2 부천 원미 128297.0 100544.0 239697.0 543777.0 23.593679 18.489932 44.080018 경기도 부천시 5 2
In [100]:
final_elect_data['moon vs hong'] = final_elect_data['rate_moon'] - final_elect_data['rate_hong']
final_elect_data['moon vs ahn'] = final_elect_data['rate_moon'] - final_elect_data['rate_ahn']
final_elect_data['ahn vs hong'] = final_elect_data['rate_ahn'] - final_elect_data['rate_hong']
final_elect_data.head(3)
Out[100]:
  ID ahn hong moon pop rate_ahn rate_hong rate_moon 광역시도 시군 y x moon vs hong moon vs ahn ahn vs hong
0 부천 소사 128297.0 100544.0 239697.0 543777.0 23.593679 18.489932 44.080018 경기도 부천시 4 2 25.590086 20.486339 5.103747
1 부천 오정 128297.0 100544.0 239697.0 543777.0 23.593679 18.489932 44.080018 경기도 부천시 6 2 25.590086 20.486339 5.103747
2 부천 원미 128297.0 100544.0 239697.0 543777.0 23.593679 18.489932 44.080018 경기도 부천시 5 2 25.590086 20.486339 5.103747
 

데이터 준비 끝¶

지도에 그려보자!

In [101]:
BORDER_LINES = [[(5, 1), (5, 2), (7, 2), (7, 3), (11,3), (11, 0)],
    [(5, 4), (5, 5), (2, 5), (2, 7), (4, 7), (4, 9), (7, 9), (7, 7), (9, 7), (9, 5), (10, 5), (10, 4), (5, 4)], 
    [(1, 7), (1, 8), (3, 8), (3, 10), (10, 10), (10, 7), (12, 7), (12, 6), (11, 6), (11, 5), (12, 5), (12, 4), (11, 4),(11, 3)], 
    [(8, 10), (8, 11), (6, 11), (6, 12)], 
    [(12, 5), (13, 5), (13, 4), (14, 4), (14, 5), (15, 5), (15, 4), (16, 4), (16, 2)], 
    [(16, 4), (17, 4), (17, 5), (16, 5), (16, 6), (19, 6), (19, 5), (20, 5), (20, 4), (21, 4), (21, 3), (19, 3), (19, 1)],
    [(13, 5), (13, 6), (16, 6)],
    [(13, 5), (14, 5)],
    [(21, 2), (21, 3), (22, 3), (22, 4), (24, 4),(24,2), (21, 2)],
    [(20, 5), (21, 5), (21, 6), (23, 6)],
    [(10, 8), (12, 8), (12, 9), (14, 9), (14, 8), (16, 8), (16, 6)],
    [(14, 9), (14, 11), (14, 12), (13, 12), (13, 13)],
    [(15, 8), (17, 8), (17, 10), (16, 10), (16, 11), (14, 11)],
    [(17, 9), (18, 9), (18, 8), (19, 8), (19, 9), (20, 9), (20, 10), (21, 10)],
    [(16, 11), (16, 13)],
    [(27, 5), (27, 6), (25, 6)],
]
In [103]:
def drawKorea(targetData, blockedMap, cmapname):
    gamma = .75
    whitelabelmin = (max(blockedMap[targetData]) - min(blockedMap[targetData]))*0.25 + min(blockedMap[targetData])
    datalabel = targetData
    
    vmin = min(blockedMap[targetData])
    vmax = max(blockedMap[targetData])
    
    mapdata = blockedMap.pivot_table(index='y', columns = 'x', values = targetData)
    masked_mapdata = np.ma.masked_where(np.isnan(mapdata), mapdata)
    
    plt.figure(figsize = (6, 8))
    plt.pcolor(masked_mapdata, vmin=vmin, vmax=vmax, cmap=cmapname, edgecolor='#aaaaaa', linewidth=0.5)
    
    for idx, row in blockedMap.iterrows():
        if len(row['ID'].split())==2:
            dispname = '{}\n{}'.format(row['ID'].split()[0], row['ID'].split()[1])
        elif row['ID'][:2] =='고성':
            dispname = '고성'
        else:
            dispname = row['ID']

        if len(dispname.splitlines()[-1]) >= 3:
            fontsize, linespacing = 8, 1.1
        else:
            fontsize, linespacing = 9, 0.9
            
        annocolor = 'white' if row[targetData] > whitelabelmin else 'black'
        plt.annotate(dispname, (row['x']+0.5, row['y']+0.5), weight='bold', fontsize= fontsize, ha='center', va='center', linespacing=linespacing)
        
    for path in BORDER_LINES:
        ys, xs = zip(*path)
        plt.plot(xs, ys, c='black', lw=2)
    
    plt.gca().invert_yaxis()
    plt.axis('off')
    cb =plt.colorbar(shrink=.1, aspect=10)
    cb.set_label(datalabel)
    
    plt.tight_layout()
    plt.show()
In [105]:
from matplotlib import font_manager, rc

rc('font', family='AppleGothic')
plt.rcParams['axes.unicode_minus'] = False
 

문 후보 vs 홍 후보¶

In [106]:
drawKorea('moon vs hong', final_elect_data, 'RdBu')
 
 

안 후보 vs 홍 후보¶

In [107]:
drawKorea('ahn vs hong', final_elect_data, 'RdBu')
 
 

문 후보 vs 안 후보¶

In [108]:
drawKorea('moon vs ahn', final_elect_data, 'RdBu')
 

 

 

반응형

댓글