이제는 곧 잘 그리기 시작하고 있는데, 단원 끝 부분을 보니 둘 이상의 자료를 같이 그려서 비교하는 문제가 나와 있다. 이것을 그리기 위해서는 몇 가지 새로운 것이 필요하다. 다음 예를 보자.


import numpy as np
import matplotlib.pyplot as plt

N = 5
menMeans = (20, 35, 30, 35, 27)
womenMeans = (25, 32, 34, 20, 25)
ind = np.arange(N)
width = 0.35

p1 = plt.bar(ind-0.2, menMeans, width)
p2 = plt.bar(ind+0.2, womenMeans, width)

plt.ylabel('Scores')
plt.title('Scores by group and gender')
plt.xticks(ind, ('G1', 'G2', 'G3', 'G4', 'G5'))
plt.legend((p1[0], p2[0]), ('Men', 'Women'))

plt.show()

소스코드상 새로운 것은 네 번째 줄의 N=5일 것이다. 이것은 비교하려는 두 자료의 개수를 미리 설정한 것이다. 바로 따라오는 자료를 보면 둘 다 5개씩의 자료로 이루어져 있음을 알 수 있다. 


여태까지 plt.bar를 하기 위해서는 $x$좌표와 $y$좌표로 사용할 자료의 쌍이 필요했는데, 두 자료는 $x$좌표를 ind라는 것으로 공유한다. ind = np.arange(5)를 통과하면 ind = (0, 1, 2, 3, 4)가 된다. 이것을 $x$좌표로 사용한다. 


width = 0.35는 막대그래프의 두께를 정한 것이다. 나중에 그림 조정을 하기 위해서라도 이렇게 밖에서 정의해 두는 편이 좋다.


p1 = ... p2 = ... 막대그래프인데, $x$좌표가 하나는 ind-0.2, 다른 하나는 ind+0.2로 해서 아까 설정한 width보다 살짝 크다. ind의 자리에는 $x$좌표 라벨이 들어갈 것이다. 이것은 plt.xticks ... 부분에 있다.


마지막으로, 범례를 지정하는 부분이 plt.legend다. 이렇게 하면 그냥 자동으로 생성되는 것을 가져다 쓰는 셈이다. 어디에 만들어지는지는 실행해봐야 알 수 있다. 여태까지의 설정을 모두 모아 plt.show()를 하면 그래프가 그려진다. 위 코드의 실행 결과는 다음과 같다.



지금까지 배운 것을 모두 모아서 하나만 더 그려보면, 다음과 같은 그림이 가능할 것이다.



import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

N = 7
men = (71.3, 63.0, 63.3, 48.4, 55.1, 55.7, 74.8)
women = (70.3, 59.2, 63.1, 44.3, 54.7, 53.1, 76.4)
ind = np.arange(N)
width = 0.3

plt.rcParams['font.family'] = 'NanumMyeongjo'

ax = plt.axes()
ax.yaxis.set_major_locator(ticker.MultipleLocator(10))
ax.yaxis.set_minor_locator(ticker.MultipleLocator(5))
plt.grid(which='major', linewidth = '0.8', axis = 'y')
plt.grid(which='minor', linewidth = '0.3', axis = 'y')


plt.ylabel("투표율", fontsize=12)
plt.title("최근 선거의 성별 투표율 변화", fontsize = 20, color='k')

p1 = plt.bar(ind-0.2, men, width)
p2 = plt.bar(ind+0.2, women, width)
plt.legend((p1[0], p2[0]), ('남성', '여성'))
plt.xticks(ind, ('16대 대선', '17대 국선', '17대 대선', '18대 국선', '5회 지선', '19대 국선', '18대 대선'))

plt.show()


실행 결과는 다음과 같다.



다음 시간은 마지막이 될 텐데, 지금까지처럼 plt.plot을 하면 자료가 가나다순이나 알파벳순으로 자동정렬이 돼서 그려졌다. 막내가 그래프를 그리다보니 은근히 이게 신경쓰였나보다. 마침 이번시간에 필요한 내용이 추가돼 있어서 (사실은 이미 있다.) 다음 시간에 정리해 주기로 했다.



+ Recent posts