그래프 그리는 방법 1. matplotlib.pyplot에 있는 함수를 사용하는 pyplot 방식, 2. 명시적으로 피겨 객체와 서브플롯 객체를 만들고 이 객체의 메서드를 사용하는 객체지향 API 방식
plt.plot([1,4,9,16])
plt.title('simple line graph')
plt.show()
fig, ax= plt.subplots()
ax.plot([1,4,9,16])
ax.set_title('simple line graph')
plt.show()
복잡한 그래프를 그리는 경우엔는 객체지향 방식을 사용하는 것이 좋다
scatter() 함수는 마커의 크기를 지정할 수 있는 s 매개변수를 제공
선 그래프와 산점도의 마커 크기는 rcParams['line.marksize']로 지정하며 기본값은 6이다
s 매개변수의 기본값은 rcParams['lines.markersize']의 제곱을 사용
s 매개변수의 값을 하나의 실수로 바꾸면 산점도의 모든 마커 크기가 동일하게 바뀐다
하지만 입력 데이터와 동일한 길이의 배열을 지정하면 각 데이터마다 마커의 크기가 다른 산점도를 그릴 수 있다
fig, ax=plt.subplots(figsize=(10,8))
ax.scatter(ns_book8['발행년도'], ns_book8['출판사'], s=ns_book8['대출건수'])
ax.set_title('출판사별 발행 도서')
fig.show()
ax.scatter(ns_book8['발행년도'], ns_book8['출판사'], s=ns_book8['대출건수']*2, alpha=0.3, edgecolor='k', linewidth=0.5, c=ns_book8['대출건수'])
맷플롯립은 컬러맵을 사용하여 값에 따른 색상을 다르게 표현
컬러맵은 cmap 매개변수로 지정
ax.scatter(ns_book8['발행년도'], ns_book8['출판사'], s=ns_book8['대출건수']**1.3, alpha=0.3, edgecolor='k', linewidth=0.5, c=ns_book8['대출건수'], cmap='jet')
범례를 추가하면 그래프를 이해하는데 도움을 준다
plot() 함수를 호출할 때 각 선 그래프에 레이블을 추가하고, 마지막에 legend()메서드를 호출하면 범례가 추가
line1=ns_book9[ns_book9['출판사']=='황금가지']
line2=ns_book9[ns_book9['출판사']=='비룡소']
fig, ax= plt.subplots(figsize=(8,6))
ax.plot(line1['발행년도'], line1['대출건수'], label='황금가지')
ax.plot(line2['발행년도'], line2['대출건수'], label='비룡소')
ax.legend()
ax.set_title('연도별 대출건수')
fig.show()
fig, ax= plt.subplots(figsize=(8,6))
for pub in top30_pubs.index[:5]:
line=ns_book9[ns_book9['출판사']==pub]
ax.plot(line['발행년도'], line['대출건수'], label=pub)
ax.legend()
ax.set_title('연도별 대출건수')
ax.set_xlim(1985,2025)
fig.show()
# set_xlim() 메서드를 사용하여 그래프로 출력할 x축의 좌표 범위를 지정
# set_ylim() 메서드를 사용하여 그래프로 출력할 y축의 좌표 범위를 지정
판다스의 pivot_table() 메서드로 하나의 열을 2차원 배열로 바꾸는 것처럼 데이터 구조를 바꿀 수 있다
index 매개변수와 columns 매개변수에 원본 데이터프레임의 열을 지정하면 각 열의 고유한 값이 피벗 테이블로 변환된 데이터프레임의 인덱스와 열이 된다
ns_book10=ns_book9.pivot_table(index='출판사', columns='발행년도')
판다스의 인덱스 객체에서 호출할 수 있는 get_level_values() 메서드는 다단으로 구성된 열 이름에서 선택한 항목만 가져올 수 있다
top10_pubs=top30_pubs.index[:10]
year_cols=ns_book10.columns.get_level_values(1)
스택 영역 그래프는 맷플롯립의 stackplot() 메서드로 그릴 수 있다
첫 번째 매개변수에 x축의 값, 두 번째 매개변수에 y축의 값
fig, ax=plt.subplots(figsize=(8,6))
ax.stackplot(year_cols, ns_book10.loc[top10_pubs].fillna(0), labels=top10_pubs)
ax.set_title('연도별 대출건수')
ax.legend(loc='upper left')
ax.set_xlim(1985,2025)
fig.show()
# legend() 메서드는 loc 매개변수로 범례의 위치를 지정할 수 있다
bar() 함수를 여러 번 호출하면 된다
막대 그래프는 그냥 bar() 메서드를 연이어 호출하면 먼저 그린 막대를 덮어쓰게 된다
두 막대를 나란히 옆으로 그리려면 막대의 기본 너비인 0.8을 줄여야 한다
fig, ax= plt.subplots(figsize=(8,6))
ax.bar(line1['발행년도']-0.2, line1['대출건수'],width=0.4, label='황금가지')
ax.bar(line2['발행년도']+0.2, line2['대출건수'],width=0.4, label='비룡소')
ax.set_title('연도별 대출건수')
ax.legend()
fig.show()
# +-0.2는 막대 위치를 이동시킨다. width=0.4는 막대 너비를 지정한다
막대 그래프를 옆으로 나란히 놓지 않고 스택 영역 그래프처럼 위로 쌓을 수 있다
맷플롯립에는 stackplot() 처럼 막대 프래프를 쌓을 수 있는 함수가 없다
대신 bar() 메서드의 bottom 매개변수를 사용하면 수동으로 막대를 쌓을 수 있다. 이 매개변수는 막대가 시작할 y 좌표를 결정
height1=[5,4,7,9,8]
height2=[3,2,4,1,2]
plt.bar(range(5), height1, width=0.5)
plt.bar(range(5), height2, bottom=height1, width=0.5)
plt.show()
판다스 데이터프레임의 cumsum() 메서드를 사용하면 누적할 수 있다
ns_book10.loc[top10_pubs[:5], ('대출건수',2013):('대출건수',2020)].cumsum()
fig,ax=plt.subplots(figsize=(8,6))
for i in reversed(range(len(ns_book12))):
bar=ns_book12.iloc[i]
label=ns_book12.index[i]
ax.bar(year_cols, bar, label=label)
ax.set_title('연도별 대출건수')
ax.legend(loc='upper left')
ax.set_xlim(1985, 2025)
fig.show()
pie() 메서드로 그린다
data=top30_pubs[:10]
labels=top30_pubs.index[:10]
fig,ax=plt.subplots(figsize=(8,6))
ax.pie(data, labels=labels)
ax.set_title('출판사 도서 비율')
fig.show()
stratangle 매개변수를 90으로 지정하여 12시 방향부터 원 그래프를 그릴 수 있다
ax.pie(data, labels=labels, startangle=90)
pie() 메서드의 autopct 매개변수에는 파이썬의 %연산자에 적용할 포맷팅 문자열을 전달할 수 있다 ex) %d를 전달하면 각 부채꼴의 비율이 정수로 표시
중요한 항목의 경우 해당 부채꼴 조각을 원 그래프에서 조금 떨어뜨려 시각적으로 부각시킬 수 있다
explode 매개변수에 떨어뜨리길 원하는 조각의 간격을 반지름의 비율로 지정한다
ax.pie(data, labels=labels, startangle=90, autopct='%.1f%%',explode=[0.1]+[0]*9)
subplots() 함수의 첫 번째 매개변수와 두 번째 매개변수에는 서브플롯의 행 개수와 열 개수를 지정한다 ex) subplots(2,2)는 행이 2개, 열이 2개인 4개의 서브플롯이 만들어진다
subplots() 함수에서 반환 받은 Axes 객체를 사용할 때는 2차원 배열처럼 각 격자의 위치를 지정해야 한다
fig, axes=plt.subplots(2,2, figsize=(20,16))
ns_book8=ns_book7[top30_pubs_idx].sample(1000, random_state=42)
sc=axes[0,0].scatter(ns_book8['발행년도'], ns_book8['출판사'], linewidths=0.5, edgecolors='k',alpha=0.3,s=ns_book8['대출건수'],c=ns_book8['대출건수'],cmap='jet')
axes[0,0].set_title('출판사별 발행 도서')
fig.colorbar(sc, ax=axes[0,0])
axes[0,1].stackplot(year_cols, ns_book10.loc[top10_pubs].fillna(0),labels=top10_pubs)
axes[0,1].set_title('연도별 대출 건수')
axes[0,1].legend(loc='upper left')
axes[0,1].set_xlim(1985, 2025)
for i in reversed(range(len(ns_book12))):
bar=ns_book12.iloc[i]
label=ns_book12.index[i]
axes[1,0].bar(year_cols,bar, label=label)
axes[1,0].set_title('연도별 대출건수')
axes[1,0].legend(loc='upper left')
axes[1,0].set_xlim(1985, 2025)
axes[1,1].pie(data, labels=labels, startangle=90, autopct='%.1f%%', explode=[0.1]+[0]*9)
axes[1,1].set_title('출판사 도서 비율')
fig.savefig('all_in_one.png')
fig.show()
