제로베이스 데이터스쿨 강사님은 카르토그램 지도를 어떻게 그리느냐에 대해 많은 고민을 하셨다고 한다. 결과적으로 액셀로 먼저 서울시 그림을 그린 다음 stack기능으로 데이터의 위치를 데이터프레임화하여 코드에 녹여낼 수 있다고 하셨다. 데이터 분석 초짜인 내가 그 모든 과정을 체화하기란 너무 어렵다는 생각이 들었다. 이번 프로젝트에서는 강의에서 설명해준 내용을 그대로 따라가본다.
1. 먼저 데이터스쿨 강사님께서 만드신 액셀파일을 불러왔다.
draw_korea_raw = pd.read_excel('../data/07_draw_korea_raw.xlsx')


2. .stack()함수로 테이블을 해체한다. stack()함수는 데이터프레임의 열을 행 인덱스 레벨로 스택하여 표현하는 함수로, 피벗 테이블의 반대 개념이다.

3. stack()기능을 거친 데이터를 다시 한 번 pd.DataFrame으로 바꿔 주고, 이를 draw_korea_raw.stacked 변수에 담아 준다. .reset_index()로 리인덱싱해준다.


4. 3번의 과정으로 새로 생긴 컬럼명을 바꿔 준다. 다시 이걸 draw_korea라는 변수로 저장해준다.

5. 이제 1번의 두번째 그림처럼 지역별로 구분해주기 위해 직접 라인을 그리는 코드를 작성해야 한다. 엄청난 노가다 과정이지만, 최대한 해보자...!
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)]
]
6. 테스트함수도 만들고, 이것저것 시도해보며 그림을 그리고 간격을 조절해 간다. 결과는 다음과 같다.
def plot_text_simple(draw_korea):
for idx, row in draw_korea.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 = 9.5, 1.2
else:
fontsize, linespacing = 11, 1.0
plt.annotate( # matplotlib의 주석 기능
dispname,
(row['x'] + 0.5, row['y'] + 0.5),
weight = 'bold',
fontsize=fontsize,
linespacing = linespacing,
ha = 'center', # 수직 정렬
va = 'center', # 수평 정렬
)
def simple_draw(draw_korea):
plt.figure(figsize=(8,11))
plot_text_simple(draw_korea)
for path in BORDER_LINES:
ys, xs = zip(*path)
plt.plot(xs, ys, c='black', lw=1.5)
plt.gca().invert_yaxis()
plt.axis('off')
plt.tight_layout()
plt.show()
simple_draw(draw_korea)

'데이터분석 > 미니프로젝트 06. 인구 분석' 카테고리의 다른 글
| 06-03-02. 카르토그램으로 인구현황 시각화하기(2) (0) | 2024.04.27 |
|---|---|
| 06-02. 인구현황데이터에 지도 ID 만들기 (2) | 2024.04.22 |
| 06-01. 인구소멸위기지역 파악하기 프로젝트 개요, 데이터 수집 및 정리 (2) | 2024.04.21 |