DA 5

Tae Yoon·2024년 1월 11일
0

객체지향 API로 그래프 꾸미기

pyplot 방식과 객체지향 API 방식

그래프 그리는 방법 1. matplotlib.pyplot에 있는 함수를 사용하는 pyplot 방식, 2. 명시적으로 피겨 객체와 서브플롯 객체를 만들고 이 객체의 메서드를 사용하는 객체지향 API 방식

pyplot 방식으로 그래프 그리기

plt.plot([1,4,9,16])
plt.title('simple line graph')
plt.show()

객체지향 API 방식으로 그래프 그리기

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()

마커 꾸미기

  1. 투명도 조절하기 alpha 매개변수
  2. 마커 테두리 색 바꾸기
    edgecolor 매개변수는 마커 테두리의 색을 결정. 기본값은 'face'
  3. 마커 테두리 선 두께 바꾸기
    linewidths 매개변수는 마커 테투리 선의 두께를 결정하며 기본값은 1.5
  4. 산점도 색 바꾸기
    c 매개변수는 산점도의 색을 지정한다
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')

맷플롯립의 고급 기능 배우기

하나의 피겨에 여러 개의 선 그래프 그리기

선 그래프 2개 그리기

범례를 추가하면 그래프를 이해하는데 도움을 준다
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()

선 그래프 5개 그리기

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()
![](https://velog.velcdn.com/images/taeyoon__/post/4922e955-239f-4d87-a57c-c97c5590162e/image.png)

0개의 댓글

관련 채용 정보