호쌤
호쌤 Just For Fun

[Python 데이터 시각화] 코로나19 국내현황 집계하기

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Python 데이터 시각화] 코로나19 국내현황 집계하기≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

[Python 데이터 시각화] 코로나19 국내현황 집계하기

http://itpaper.co.kr/demo/covid19/all.php 페이지를 통해 JSON 데이터를 수집하여 그 결과를 지역별 딕셔너리로 구성하고 집계 결과를 생성한 후 각종 시각화 지표를 만드는 과정을 소개합니다. 이 포스팅에서 제시하는 시각화 결과물은 질병관리본부의 웹 페이지 결과물을 참고하였습니다.

#01. 필요한 패키지 가져오기

1
2
3
4
5
6
7
8
import requests
import json
import datetime as dt
import pandas as pd
from pandas import DataFrame
from matplotlib import pyplot
from IPython.display import SVG   # jupyter 상에서 SVG 이미지를 표시하기 위한 패키지
from bs4 import BeautifulSoup     # TAG로부터 원하는 내용을 추출하는 클래스 -> SVG 이미지의 핸 들링을 위함 

#02. 데이터 수집하기

1) HTTP 세션 준비

1
2
3
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
session = requests.Session()
session.headers.update( {'User-agent': user_agent, 'referer': None} )

2) 접근 URL 정의

1
api_url = "http://itpaper.co.kr/demo/covid19/all.php"

3) JSON 데이터 가져오기

1
2
3
4
5
6
7
8
9
10
11
r = session.get(api_url)

if r.status_code != 200:
    print("[%d Error] %s" % (r.status_code, r.reason))
    quit()

r.encoding = "utf-8"
covid19_dict = json.loads(r.text)

# 출력 결과가 매우 길기 때문에 내용 확인 후 주석처리해 두자.
#covid19_dict

#03. 데이터 전처리

지역별로 데이터프레임을 생성해야 하지만 전국에 대한 데이터 프레임을 일일이 만드는 것은 비효율 적이므로 각 지역별 데이터프레임에 지역이라는 컬럼을 추가하고 하나의 통합 데이터프레임에 병합하여 최종적으로는 단 하나의 데이터프레임으로 분석을 수행할 수 있도록 전처리를 수행한다.

1) 수집한 데이터에서 지역명(key) 가져오기

1
2
지역명 = list(covid19_dict['data'].keys())
지역명
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
['서울',
 '부산',
 '대구',
 '인천',
 '광주',
 '대전',
 '울산',
 '세종',
 '경기',
 '강원',
 '충북',
 '충남',
 '전북',
 '전남',
 '경북',
 '경남',
 '제주']

2) DataFrame 재구성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
데이터누적 = DataFrame()

for v in 지역명:
    # 하나의 지역을 임시 데이터 프레임으로 변환
    tmp_df = DataFrame(covid19_dict['data'][v])
    
    # 임시 데이터 프레임에 지역명 컬럼 추가
    tmp_df['지역'] = v
    
    # 임시 데이터 프레임을 누적해서 병합
    데이터누적 = 데이터누적.append(tmp_df)

# 컬럼이름 변경을 위한 딕셔너리 정의
column_name = {'date': '날짜', 'active': '치료중', 'confirmed_acc': '누적확진자', 'death_acc': '누적사망자', 'released_acc': '누적격리해제', 'confirmed': '확진자', 'death': '사망자', 'released': '격리해제'}

데이터누적.rename(columns=column_name, inplace=True)

# 데이터 병합과정에서 중복되는 index가 발생하므로 index번호를 리셋한다.
# -> drop=True는 기존의 인덱스는 삭제하는 옵션
데이터누적.reset_index(drop=True, inplace=True)

데이터누적
▶ 출력결과
날짜 치료중 누적확진자 누적사망자 누적격리해제 확진자 사망자 격리해제 지역
0 2.17 11 14 0 3 14 0 3 서울
1 2.18 11 14 0 3 0 0 0 서울
2 2.19 10 15 0 5 1 0 2 서울
3 2.20 17 22 0 5 7 0 0 서울
4 2.21 21 27 0 6 5 0 1 서울
... ... ... ... ... ... ... ... ... ...
2120 6.16 0 15 0 15 0 0 0 제주
2121 6.17 1 16 0 15 1 0 0 제주
2122 6.18 1 16 0 15 0 0 0 제주
2123 6.19 4 19 0 15 3 0 0 제주
2124 6.20 4 19 0 15 0 0 0 제주

2125 rows × 9 columns

3) 날짜 타입 처리

수집한 데이터는 날짜 형식이 문자열로 지정되어 있다. 이를 datetime 형식으로 변경하기 위해서는 yyyy/mm/dd 형식의 문자열로 치환해야 한다.

Python의 datatime 객체는 m.d 형식과 같이 한자리 숫자의 월,일 데이터를 datetime으로 변환하지 못하기 때문에 자리수를 맞춰주는 처리가 필요하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
covid19_df = 데이터누적.copy()

for i in list(covid19_df.index):
    날짜 = covid19_df.loc[i, '날짜']
    p = 날짜.find(".")
     = int(날짜[:p])
     = int(날짜[p+1:])
    변환날짜 = "%04d/%02d/%02d" % (2020, , )
    #print(변환날짜)
    
    # 변환 결과를 다시 Dataframe에 넣는다.
    covid19_df.loc[i, '날짜'] = 변환날짜
    
# 데이터프레임의 날짜 컬럼을 datetime 형식으로 일괄 변환
# -> infer_datetime_format=True 는 파이썬이 문자열의 날짜형식을 지능적으로 판단하여 format을 추측
covid19_df['날짜'] = pd.to_datetime(covid19_df['날짜'], infer_datetime_format=True)
covid19_df['날짜']
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
12
0      2020-02-17
1      2020-02-18
2      2020-02-19
3      2020-02-20
4      2020-02-21
          ...    
2120   2020-06-16
2121   2020-06-17
2122   2020-06-18
2123   2020-06-19
2124   2020-06-20
Name: 날짜, Length: 2125, dtype: datetime64[ns]

#04. 전국 누적 확진자 현황

1) 데이터프레임에서 가장 큰 날짜 값 추출

원 데이터에 누적 확진자 정보가 포함되어 있기 때문에 가장 마지막 날짜에 대한 누적 확진자 값을 구하면 된다.

1
2
last_date = covid19_df['날짜'].max()
last_date
▶ 출력결과
1
Timestamp('2020-06-20 00:00:00')

2) 마지막 날짜에 해당하는 데이터만 추출

1
2
last_df = covid19_df[(covid19_df['날짜'] == last_date)]
last_df
▶ 출력결과
날짜 치료중 누적확진자 누적사망자 누적격리해제 확진자 사망자 격리해제 지역
124 2020-06-20 466 1202 6 730 14 0 6 서울
249 2020-06-20 5 150 3 142 2 0 0 부산
374 2020-06-20 30 6898 189 6679 2 0 3 대구
499 2020-06-20 162 328 1 165 5 0 4 인천
624 2020-06-20 0 32 0 32 0 0 0 광주
749 2020-06-20 27 72 1 44 5 0 0 대전
874 2020-06-20 4 53 1 48 0 0 0 울산
999 2020-06-20 1 48 0 47 0 0 0 세종
1124 2020-06-20 344 1107 22 741 17 0 4 경기
1249 2020-06-20 5 60 3 52 0 0 0 강원
1374 2020-06-20 6 61 0 55 0 0 0 충북
1499 2020-06-20 14 158 0 144 2 0 0 충남
1624 2020-06-20 3 23 0 20 1 0 0 전북
1749 2020-06-20 2 20 0 18 0 0 0 전남
1874 2020-06-20 11 1384 54 1319 1 0 2 경북
1999 2020-06-20 8 132 0 124 0 0 0 경남
2124 2020-06-20 4 19 0 15 0 0 0 제주

3) 데이터프레임의 각 컬럼별 합계 산정

1
2
전국합계 = last_df.filter(['치료중','누적확진자','누적사망자','누적격리해제','확진자','사망자','격리해제']).sum()
전국합계
▶ 출력결과
1
2
3
4
5
6
7
8
치료중                                     1092
누적확진자                                  11747
누적사망자                                    280
누적격리해제                                 10375
확진자                                       49
사망자                                        0
격리해제                                      19
dtype: object

4) 데이터프레임으로 병합

1
2
전국합계df = DataFrame(전국합계, columns=[last_date.strftime('%m/%d')])
전국합계df
▶ 출력결과
06/20
치료중 1092
누적확진자 11747
누적사망자 280
누적격리해제 10375
확진자 49
사망자 0
격리해제 19

#05. 날짜별 추세

1) 날짜별로 전국 합산 산출

1
2
날짜별df = covid19_df.filter(['날짜','치료중','누적확진자','누적사망자','누적격리해제','확진자','사망자','격리해제']).groupby('날짜').sum()
날짜별df
▶ 출력결과
치료중 누적확진자 누적사망자 누적격리해제 확진자 사망자 격리해제
날짜
2020-02-17 20 30 0 10 30 0 10
2020-02-18 19 31 0 12 1 0 2
2020-02-19 35 51 0 16 20 0 4
2020-02-20 91 108 1 16 57 1 0
2020-02-21 187 205 1 17 97 0 1
... ... ... ... ... ... ... ...
2020-06-16 997 11569 278 10294 25 1 30
2020-06-17 1020 11605 279 10306 36 1 12
2020-06-18 1049 11660 280 10331 55 1 25
2020-06-19 1062 11698 280 10356 38 0 25
2020-06-20 1092 11747 280 10375 49 0 19

125 rows × 7 columns

2) 최근 일주일 데이터 조회

검색 범위를 지정하기 위해 일주일 전의 날짜 얻기

1
2
3
delta = dt.timedelta(days=-7)
day7 = dt.datetime.now() + delta
day7
▶ 출력결과
1
datetime.datetime(2020, 6, 13, 17, 33, 52, 61219)

일주일 전 날짜 이후의 데이터 조회

1
2
일주일검색df = 날짜별df[(날짜별df.index >= day7)]
일주일검색df
▶ 출력결과
치료중 누적확진자 누적사망자 누적격리해제 확진자 사망자 격리해제
날짜
2020-06-14 986 11515 277 10252 33 0 25
2020-06-15 1003 11544 277 10264 29 0 12
2020-06-16 997 11569 278 10294 25 1 30
2020-06-17 1020 11605 279 10306 36 1 12
2020-06-18 1049 11660 280 10331 55 1 25
2020-06-19 1062 11698 280 10356 38 0 25
2020-06-20 1092 11747 280 10375 49 0 19

3) 일일 및 누적 확진환자 추세

그래프 기본 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
fig = pyplot.figure()           # 영역을 나눌 수 있는 객체 생성
ax1 = fig.add_subplot(1,1,1)    # 1칸으로 구성된 서브 플롯 추가
ax2 = ax1.twinx()               # 두 번째 서브 플롯은 ax1을 복제

pyplot.title("일일 및 누적 확진환자 추세") 

#---------------------------------------------------
# 누적 확진 (막대 그래프)
#---------------------------------------------------
일주일검색df['누적확진자'].plot.bar(ax=ax1, color='#3571cc', rot=0)

ax1.set_xlabel('날짜')
ax1.set_ylabel('누적확진자 수', color='#1779d4')
ax1.grid() 
ax1.set_ylim([일주일검색df['누적확진자'].min()-1000, 일주일검색df['누적확진자'].max()+100])

# 그래프 위에 텍스트 표시
for i, v in enumerate(일주일검색df['누적확진자']):
    # 세자리마다 콤마를 표시하는 형식 지정
    msg = '{n:,}'.format(n=v)
    ax1.text(i, v+10, msg, fontsize = 14, color = "#3571cc", 
             horizontalalignment="center", verticalalignment="bottom") 

# x축 표시 라벨 설정
ax1.set_xticks(list(range(0, len(일주일검색df))))

# x축 라벨에 표시할 텍스트
x_labels = []

for date in 일주일검색df.index:
    x_labels.append(date.strftime("%m/%d"))

ax1.set_xticklabels(x_labels, fontsize=14, color='#000000')

#---------------------------------------------------
# 일별 확진 (시계열 그래프 )
#---------------------------------------------------
x = list(range(0, len(일주일검색df)))
y = 일주일검색df['확진자']
ax2.plot(x, y, color='#FF8400', marker="o", linewidth=4, markersize=15)
ax2.set_ylim(일주일검색df['확진자'].min()-10, 일주일검색df['확진자'].max()+20) 

# 시계열 그래프 위에 텍스트 표시
for i, v in enumerate(일주일검색df['확진자']):
    # 세자리마다 콤마를 표시하는 형식 지정
    msg = '{n:,}'.format(n=v)
    ax2.text(i, v+2, msg, fontsize = 15, color = "#FFFFFF", 
             horizontalalignment="center", verticalalignment="bottom", fontweight='bold') 
    
pyplot.show()
▶ 출력결과

png

3) 확진환자 내 일일 및 누적 격리해제 추세

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
fig = pyplot.figure()           # 영역을 나눌 수 있는 객체 생성
ax1 = fig.add_subplot(1,1,1)    # 1칸으로 구성된 서브 플롯 추가
ax2 = ax1.twinx()               # 두 번째 서브 플롯은 ax1을 복제

pyplot.title("확진환자 내 일일 및 누적 격리해제 추세") 

#---------------------------------------------------
# 누적 격리해제 (막대 그래프)
#---------------------------------------------------
일주일검색df['누적격리해제'].plot.bar(ax=ax1, color='#E0217B', rot=0)

ax1.set_xlabel('날짜')
ax1.set_ylabel('격리해제', color='#E0217B')
ax1.grid() 
ax1.set_ylim([일주일검색df['누적격리해제'].min()-1000, 일주일검색df['누적격리해제'].max()+100])

# 그래프 위에 텍스트 표시
for i, v in enumerate(일주일검색df['누적격리해제']):
    # 세자리마다 콤마를 표시하는 형식 지정
    msg = '{n:,}'.format(n=v)
    ax1.text(i, v+10, msg, fontsize = 14, color = "#E0217B", 
             horizontalalignment="center", verticalalignment="bottom") 

# x축 표시 라벨 설정
ax1.set_xticks(list(range(0, len(일주일검색df))))

# x축 라벨에 표시할 텍스트
x_labels = []

for date in 일주일검색df.index:
    x_labels.append(date.strftime("%m/%d"))

ax1.set_xticklabels(x_labels, fontsize=14, color='#000000')

#---------------------------------------------------
# 일별 격리해제 (시계열 그래프 )
#---------------------------------------------------
x = list(range(0, len(일주일검색df)))
y = 일주일검색df['격리해제']
ax2.plot(x, y, color='#1F7CCB', marker="o", linewidth=4, markersize=15)
ax2.set_ylim(일주일검색df['격리해제'].min()-10, 일주일검색df['격리해제'].max()+20) 

# 시계열 그래프 위에 텍스트 표시
for i, v in enumerate(일주일검색df['격리해제']):
    # 세자리마다 콤마를 표시하는 형식 지정
    msg = '{n:,}'.format(n=v)
    ax2.text(i, v+2, msg, fontsize = 15, color = "#FFFFFF", 
             horizontalalignment="center", verticalalignment="bottom", fontweight='bold') 
    
pyplot.show()
▶ 출력결과

png

#06. 시도별 발생동향

1) 시도별 누적 확진자

마지막 날짜에 해당하는 row만 추출하여 누적확진자 컬럼을 filter() 함수로 처리한다.

1
2
3
last_date = covid19_df['날짜'].max()
지역별누적확진자df = covid19_df[(covid19_df['날짜'] == last_date)]
지역별누적확진자df
▶ 출력결과
날짜 치료중 누적확진자 누적사망자 누적격리해제 확진자 사망자 격리해제 지역
124 2020-06-20 466 1202 6 730 14 0 6 서울
249 2020-06-20 5 150 3 142 2 0 0 부산
374 2020-06-20 30 6898 189 6679 2 0 3 대구
499 2020-06-20 162 328 1 165 5 0 4 인천
624 2020-06-20 0 32 0 32 0 0 0 광주
749 2020-06-20 27 72 1 44 5 0 0 대전
874 2020-06-20 4 53 1 48 0 0 0 울산
999 2020-06-20 1 48 0 47 0 0 0 세종
1124 2020-06-20 344 1107 22 741 17 0 4 경기
1249 2020-06-20 5 60 3 52 0 0 0 강원
1374 2020-06-20 6 61 0 55 0 0 0 충북
1499 2020-06-20 14 158 0 144 2 0 0 충남
1624 2020-06-20 3 23 0 20 1 0 0 전북
1749 2020-06-20 2 20 0 18 0 0 0 전남
1874 2020-06-20 11 1384 54 1319 1 0 2 경북
1999 2020-06-20 8 132 0 124 0 0 0 경남
2124 2020-06-20 4 19 0 15 0 0 0 제주

2) 지역별 확진 환자 빈도 그래프(막대그래프)

누적 확진 환자 기준으로 정렬

1
2
정렬df = 지역별누적확진자df.sort_values('누적확진자')
정렬df
▶ 출력결과
날짜 치료중 누적확진자 누적사망자 누적격리해제 확진자 사망자 격리해제 지역
2124 2020-06-20 4 19 0 15 0 0 0 제주
1749 2020-06-20 2 20 0 18 0 0 0 전남
1624 2020-06-20 3 23 0 20 1 0 0 전북
624 2020-06-20 0 32 0 32 0 0 0 광주
999 2020-06-20 1 48 0 47 0 0 0 세종
874 2020-06-20 4 53 1 48 0 0 0 울산
1249 2020-06-20 5 60 3 52 0 0 0 강원
1374 2020-06-20 6 61 0 55 0 0 0 충북
749 2020-06-20 27 72 1 44 5 0 0 대전
1999 2020-06-20 8 132 0 124 0 0 0 경남
249 2020-06-20 5 150 3 142 2 0 0 부산
1499 2020-06-20 14 158 0 144 2 0 0 충남
499 2020-06-20 162 328 1 165 5 0 4 인천
1124 2020-06-20 344 1107 22 741 17 0 4 경기
124 2020-06-20 466 1202 6 730 14 0 6 서울
1874 2020-06-20 11 1384 54 1319 1 0 2 경북
374 2020-06-20 30 6898 189 6679 2 0 3 대구

시각화에 적합한 형태로 전처리를 위한 컬럼 추출

가로 막대 그래프의 경우 데이터프레임의 인덱스가 y축, 각각의 값이 x축을 담당하기 때문에 지역명을 인덱스로 하고 누적 확진자를 컬럼으로 하는 형태로 전처리가 필요하다.

1
2
지역별누적확진자df = 정렬df.filter(['지역', '누적확진자'])
지역별누적확진자df
▶ 출력결과
지역 누적확진자
2124 제주 19
1749 전남 20
1624 전북 23
624 광주 32
999 세종 48
874 울산 53
1249 강원 60
1374 충북 61
749 대전 72
1999 경남 132
249 부산 150
1499 충남 158
499 인천 328
1124 경기 1107
124 서울 1202
1874 경북 1384
374 대구 6898

인덱스 컬럼 설정하기

1
2
결과df = 지역별누적확진자df.set_index('지역')
결과df
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{2124: '제주',
 1749: '전남',
 1624: '전북',
 624: '광주',
 999: '세종',
 874: '울산',
 1249: '강원',
 1374: '충북',
 749: '대전',
 1999: '경남',
 249: '부산',
 1499: '충남',
 499: '인천',
 1124: '경기',
 124: '서울',
 1874: '경북',
 374: '대구'}

시각화

1
2
3
4
5
6
7
8
9
10
결과df.plot.barh(color="#15A8DE", legend=None)
pyplot.grid()

# 그래프 위에 텍스트 표시
for i, v in enumerate(결과df['누적확진자']):
    # 세자리마다 콤마를 표시하는 형식 지정
    msg = '{n:,}'.format(n=v)
    pyplot.text(v+20, i, msg, fontsize = 14, color = "#15A8DE", horizontalalignment="left", verticalalignment="center")

pyplot.show()
▶ 출력결과

png

3) 지역별 누적 확진자 지도 시각화

svg 맵 가져오기

1
2
3
4
map_svg = None
with open('res/map_korea.svg', 'r', encoding='utf-8') as f:
    map_svg = f.read()
SVG(map_svg)
▶ 출력결과

svg

지도에 적용할 단계별 색상

단위 색상
30명 미만 #eaeceb
30명 이상, 100명 미만 #bfbfbf
100명 이상, 1000명 미만 #b2e1ff
1000명 이상, 5000명 미만 #15a8de
5000명 이상 #118ac9
1
2
colors = ['#eaeceb', '#bfbfbf', '#b2e1ff', '#15a8de', '#118ac9']
colors
▶ 출력결과
1
['#eaeceb', '#bfbfbf', '#b2e1ff', '#15a8de', '#118ac9']

데이터프레임의 인덱스 이름 변경하기

앞서 만든 결과df는 지역명이 약자로 표기되어 있지만 SVG 지도 상에서는 완전한 형태로 지정되어 있기 때문에 상호 호환을 위해 지역명을 통일해야 한다.

상대적으로 수정이 용이한 DataFrame의 인덱스 이름을 지도에 맞춰 변경한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
index_dict = {
    '강원': '강원도',
    '경기': '경기도',
    '경남': '경상남도',
    '경북': '경상북도',
    '광주': '광주광역시',
    '대구': '대구광역시',
    '대전': '대전광역시',
    '부산': '부산광역시',
    '서울': '서울특별시',
    '세종': '세종특별자치시',
    '울산': '울산광역시',
    '인천': '인천광역시',
    '전남': '전라남도',
    '전북': '전라북도',
    '제주': '제주특별자치도',
    '충남': '충청남도',
    '충북': '충청북도'}

최종df = 결과df.rename(index=index_dict)
최종df
▶ 출력결과
누적확진자
제주특별자치도 19
전라남도 20
전라북도 23
광주광역시 32
세종특별자치시 48
울산광역시 53
강원도 60
충청북도 61
대전광역시 72
경상남도 132
부산광역시 150
충청남도 158
인천광역시 328
경기도 1107
서울특별시 1202
경상북도 1384
대구광역시 6898

SVG 지도 파싱을 위한 bs4 객체 생성

SVG의 xml을 bs4 객체로 변환한 후 시,도 단위 추출을 위해 id속성을 갖는 g, path 태그를 파싱한다.

1
2
soup = BeautifulSoup(map_svg, "lxml")
glist = soup.select("svg > g[id], svg > path[id]")

지역별 확진자 수를 색상으로 표현

svg파일에서 추출한 glist 항목 수 만큼 반복하면서 id값이 DataFrame의 인덱스와 일치할 경우 해당 지역의 확진자 수에 따라 색상을 적용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
for item in glist:
    # svg 파일에서 추출한 id값이 데이터프레임의 index에 속하지 않았다면 다음으로 넘어감
    if item['id'] not in 최종df.index:
        continue

    # item['id'] --> 지도에서 뽑아낸 id
    # 최종df에서 인덱스 이름이 지도에서 뽑아낸 id와 일치하는 행의 의료기관수를 추출
    count = 최종df.loc[ item['id'], '누적확진자' ]

    # 누적확진자수에 따라 단계값 설정 (단계는 색상값의 수에 따름)
    if count < 30: color_index = 0
    elif count < 100: color_index = 1
    elif count < 1000: color_index = 2
    elif count < 5000: color_index = 3
    else: color_index = 4
        
    #print("%s: 확진자수: %d, 색상인덱스: %d" % (item['id'], count, color_index))

    # item에 fill 속성이 있는 경우 -> 세종특별자치시
    if 'fill' in item.attrs:
        item['fill'] = colors[color_index]
    # 그렇지 않은 경우 -> 나머지 지역
    else:
        # 현재 요소(item)의 하위 항목들에게 색상을 적용해야 한다.
        for p in item.select('g, path'):
            if 'fill' in p.attrs:
                p['fill'] = colors[color_index]

지역별확진자svg = soup.prettify()

SVG(지역별확진자svg)

png

Rating:

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Python 데이터 시각화] 코로나19 국내현황 집계하기≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

comments powered by Disqus