본문 바로가기

코딩/데이터분석

[Python/파이썬] matplotlib 2편 : 그래프 시각화 y축 숫자가 섞여서 나오는 문제 해결

반응형

2021.08.15 - [코딩/Python] - [Python/파이썬] 필요한 부분만 정리하는 matplotlib 1편


아래 이미지의 csv 파일(doctor_data.csv)에 접근하여 지역별 의사들의 숫자를 꺾은선 그래프로 나타내주는 시각화를 진행해보았다. 다만, 시각화를 할 때 y축 숫자가 뒤죽박죽 섞여서 나오는 문제가 있어 한참을 해멨다. 이번 포스팅에서는 그 과정과 해결방법을 기록한다.

doctor_data.csv

단계별 코드는 아래와 같다.

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축 숫자 오류)



이미지에서 보면  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이든 증가시켜서 끝을 설정해주어야 한다.

728x90