2021.08.15 - [코딩/Python] - [Python/파이썬] 필요한 부분만 정리하는 matplotlib 1편
아래 이미지의 csv 파일(doctor_data.csv)에 접근하여 지역별 의사들의 숫자를 꺾은선 그래프로 나타내주는 시각화를 진행해보았다. 다만, 시각화를 할 때 y축 숫자가 뒤죽박죽 섞여서 나오는 문제가 있어 한참을 해멨다. 이번 포스팅에서는 그 과정과 해결방법을 기록한다.
단계별 코드는 아래와 같다.
1. import
<코드>
import matplotlib.pyplot as plt
from matplotlib import rc #한글 폰트 깨짐 방지를 위한 모듈
import csv
- rc 모듈의 경우 matplotlib 사용시 내부 그래프에 한글을 사용하면 깨지는 문제가 있는데 이 문제를 해결해준다.
2. csv 읽어 각 데이터를 리스트로 만들기
<코드>
f = open(path+'/doctor_proc.csv', 'r')
lines = csv.reader(f)
header = next(lines) #헤더라인 저장
rc('font', family='Malgun Gothic')
font1 = {'size':18, 'color':'black'}
ydata1=[] #일반의 데이터 저장을 위한 빈 리스트 생성
ydata2=[] #인턴 데이터 저장을 위한 빈 리스트 생성
ydata3=[] #레지던트 데이터 저장을 위한 빈 리스트 생성
ydata4=[] #전문의 데이터 저장을 위한 빈 리스트 생성
xdata = ['부산', '대구', '인천','대전'] #x축 출력을 위한 리스트
for line in lines: #csv파일을 한줄씩 반복
ydata1.append(line[1]) #일반의
ydata2.append(line[2]) #인턴
ydata3.append(line[3]) #레지던트
ydata4.append(line[4]) #전문의
- 시각화를 위해서 각 필요한 데이터를 xdata, ydata로 나누어 리스트로 저장하였다.
- 코드 내용과 같이 csv 파일을 각 한줄한줄 읽으면서 의사별 데이터를 ydata1~4에 각각 추가한다.
3. 그래프 설정 및 plot
<코드>
#각 의사 데이터를 plot
plt.plot(xdata, ydata1, label='일반의',
color='red', linestyle='-', marker='o')
plt.plot(xdata, ydata2, label='인턴',
color='#00ffff', linestyle='--', marker='x')
plt.plot(xdata, ydata3, label='레지던트',
color='magenta', linestyle='-.', marker='s')
plt.plot(xdata, ydata4, label='전문의',
color='#444444', linestyle=':', marker='d')
plt.title('서울 및 주요 광역시 종합병원 의사수', fontdict=font1) #그래프 제목
plt.xlabel('지역명') #그래프 x축명
plt.ylabel('의사수[단위:명]') #그래프 y축명
plt.legend(loc='best') #가장 적합한 위치를 자동으로 찾음
plt.show()
- 각 의사별 그래프를 구분하기 위해 색과 선 종류, 마커로 구분하였다.
- 결과는 아래와 같다.
이미지에서 보면 y축 숫자가 통합이 되지 않고 각 선마다 따로 노는걸 확인할 수 있다. 처음에는 plot 메서드에 옵션이 있는지 알고 관련해서 구글링을 해봤지만 자료를 찾을 수가 없었다.
문제는 ydata에 입력되는 데이터 자료형에 있었다. ydata1~4를 아래 코드를 통해 한번 출력해보자.
<코드>
print(ydata1)
print(ydata2)
print(ydata3)
print(ydata4)
<결과>
['58', '27', '47', '25']
['197', '215', '138', '142']
['785', '712', '444', '425']
['2211', '1436', '1518', '1006'
처음에는 숫자가 제대로 들어가서 뭐가 문제인지 확인을 못했었는데 잘 보면 숫자에 ' '(따옴표)표시가 되어있다. 즉, 리스트에 들어간 숫자들은 int형이 아닌 str형태여서 문자로 인식했던 것이다.
그래프 상에서는 문자를 별도 항목으로 인식하기 때문에 위와 같은 문제가 발생한다. 이를 해결하려면 ydata 에 입력되는 데이터를 int형으로 바꿔준다.
<변경 전>
for line in lines: #csv파일을 한줄씩 반복
ydata1.append(line[1]) #일반의
ydata2.append(line[2]) #인턴
ydata3.append(line[3]) #레지던트
ydata4.append(line[4]) #전문의
<변경 후>
for line in lines: #csv파일을 한줄씩 반복
ydata1.append(int(line[1])) #일반의
ydata2.append(int(line[2])) #인턴
ydata3.append(int(line[3])) #레지던트
ydata4.append(int(line[4])) #전문의
변경 후, 코드처럼 데이터에 int( )를 통해 integer(정수)타입으로 데이터를 변경하였다.
<결과>
데이터를 정수형으로 변경 후, 정상적으로 그래프가 출력된 것을 확인할 수 있었다. 추가로, y축의 눈금을 좀더 세부조정하기 위해 그래프를 출력하기 전에 (코드상 plt.show() 전)에 아래 코드를 추가했다
plt.yticks(list(range(0,2450,200)))
위 코드는 y축의 눈금을 조정하는 코드이다. y축의 눈금을 0~2400까지 200단위로 출력하겠다는 의미이다. 결과 그래프는 아래와 같다. range에서 끝을 2400으로 하면 2400은 포함하지 않으므로 2200까지 나온다. 따라서 50이든 1이든 증가시켜서 끝을 설정해주어야 한다.
'코딩 > 데이터분석' 카테고리의 다른 글
[Python/데이터분석]iris 데이터셋 K-means 알고리즘 적용 및 결과 해석 (1) | 2023.10.29 |
---|---|
[Python/데이터분석] 인구 통계 자료 활용하여 원하는 데이터만 시각화해보기 (2) | 2022.12.14 |
[Python/파이썬] 필요한 부분만 정리하는 matplotlib 1편 (0) | 2021.08.15 |
[Python/파이썬] Numpy 기초 2편 : numpy의 여러가지 연산 (1) | 2021.06.30 |
[Python/파이썬] Numpy 기초 1편 : Array 생성 및 인덱싱,슬라이싱 (0) | 2021.06.29 |