
import warnings
warnings.filterwarnings('ignore')
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
Matplotlib
- Python 에서 가장 많이 쓰는 라이브러리
- pandas의 DataFrame을 바로 시각화할 때 사용
- 산점도 (scatter)
- np.where : 조건 만족하는 위치 인덱스 찾기
- np.where(tips['day'] == 'Sat', 'green', 'blue') : day가 Sat이면 green, 아니면 blue
x = np.where(tips['day'] == 'Thur','red',
np.where(tips['day'] == 'Fri' ,'orange',
np.where(tips['day'] == 'Sat','green','blue')))
tips.plot.scatter(x='total_bill',y='tip',c=x)
- 그래프에 대한 설명을 덧붙이는 주석을 넣을 때
plt.figure(figsize=(10,6))
plt.plot(sr_one.index, sr_one.values, marker='o', markersize=10)
plt.title('서울 >> 경기 인구 이동') # 제목
plt.xlabel('기간')
plt.ylabel('이동 인구수')
plt.legend(labels=['서울>>경기'], loc='best', fontsize=15)
plt.xticks(rotation=90)
# y축 범위 지정 (최소값, 최대값)
plt.ylim(50000, 800000)
# 주석 표시 - 화살표
plt.annotate('',
xy=(20, 620000), #화살표의 머리 부분(끝점)
xytext=(2, 290000), #화살표의 꼬리 부분(시작점)
xycoords='data', #좌표체계
arrowprops=dict(arrowstyle='->', color='skyblue', lw=5), #화살표 서식
)
plt.annotate('',
xy=(47, 450000), #화살표의 머리 부분(끝점)
xytext=(30, 580000), #화살표의 꼬리 부분(시작점)
xycoords='data', #좌표체계
arrowprops=dict(arrowstyle='->', color='olive', lw=5), #화살표 서식
)
# 주석 표시 - 텍스트
plt.annotate('인구이동 증가(1970-1995)', #텍스트 입력
xy=(10, 550000), #텍스트 위치 기준점
rotation=25, #텍스트 회전각도
va='baseline', #텍스트 상하 정렬
ha='center', #텍스트 좌우 정렬
fontsize=15, #텍스트 크기
)
plt.annotate('인구이동 감소(1995-2017)', #텍스트 입력
xy=(40, 560000), #텍스트 위치 기준점
rotation=-11, #텍스트 회전각도
va='baseline', #텍스트 상하 정렬
ha='center', #텍스트 좌우 정렬
fontsize=15, #텍스트 크기
)
plt.show()
- 화면 분할하여 그래프 여러 개 그리기 - axe 객체 활용
- subplot을 이용해 화면을 분할에 각 부분에 그래프를 그릴 수 있다.
Ex) subplot(2,1,1) : 2행 1열의 첫번째, subplot(2,1,2) : 2행 1열이 두번째
# 스타일 서식
plt.style.use('ggplot')
# 그래프 객체 생성(2개의 sub plot 생성)
fig = plt.figure(figsize=(10,10))
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)
# 2행 1열에 그림 1, 2
# axe 객체에 plot함수로 그래프 출력
ax1.plot(sr_one, 'o', markersize=10)
ax2.plot(sr_one, marker='o', markerfacecolor='green', markersize=10,
color='olive', linewidth=2, label='서울>>경기')
ax2.legend(loc='best')
# y축 범위 지정
ax1.set_ylim(50000, 800000)
ax2.set_ylim(50000, 800000)
# 축 눈금 라벨 지정 및 75도 회전
ax1.set_xticklabels(sr_one.index, rotation=75)
ax2.set_xticklabels(sr_one.index, rotation=75)
plt.show()
# 전출지별에서 누락값(NaN)을 앞 데이터로 채움 (엑셀 양식 병합 부분)
df = df.fillna(method='ffill')
# 서울에서 다른 지역으로 이동한 데이터만 추출하여 정리
condition= (df['전출지별'] == '서울특별시') & (df['전입지별'] != '서울특별시')
df_seoul = df[condition]
df_seoul = df_seoul.drop(['전출지별'], axis=1)
df_seoul.rename({'전입지별':'전입지'}, axis=1, inplace=True)
df_seoul.set_index('전입지', inplace=True)
# 서울에서 '충청남도','경상북도', '강원도'로 이동한 인구 데이터 값만 선택
col_years = list(map(str, range(1970, 2018)))
df_3 = df_seoul.loc[['충청남도','경상북도', '강원도'], col_years]
# 스타일 서식 지정
plt.style.use('ggplot')
# 그래프 객체 생성 (figure에 1개의 서브 플롯을 생성)
fig = plt.figure(figsize=(20, 5))
ax = fig.add_subplot(1, 1, 1)
# axe 객체에 plot 함수로 그래프 출력
ax.plot(col_years, df_3.loc['충청남도',:], marker='o', markerfacecolor='green',
markersize=10, color='olive', linewidth=2, label='서울 -> 충남')
ax.plot(col_years, df_3.loc['경상북도',:], marker='o', markerfacecolor='blue',
markersize=10, color='skyblue', linewidth=2, label='서울 -> 경북')
ax.plot(col_years, df_3.loc['강원도',:], marker='o', markerfacecolor='red',
markersize=10, color='magenta', linewidth=2, label='서울 -> 강원')
# 범례 표시
ax.legend(loc='best')
# 차트 제목 추가
ax.set_title('서울 -> 충남, 경북, 강원 인구 이동', size=20)
# 축이름 추가
ax.set_xlabel('기간', size=12)
ax.set_ylabel('이동 인구수', size = 12)
# 축 눈금 라벨 지정 및 90도 회전
ax.set_xticklabels(col_years, rotation=90)
# 축 눈금 라벨 크기
ax.tick_params(axis="x", labelsize=10)
ax.tick_params(axis="y", labelsize=10)
plt.show() # 변경사항 저장하고 그래프 출력
- 선 그래프의 꾸미기 옵션
꾸미기 옵션 | 설명 |
'o' | 선 그래프가 아니라 점 그래프로 표현 |
marker = 'o' | 마커 모양 (예 : 'o', '+', '*', '.') |
markerfacecolor = 'green' | 마커 배경색 |
markersize = 10 | 마커 크기 |
color = 'olive' | 선의 섹 |
linewidth = 2 | 선의 두께 |
label = '서울 >> 경기' | 라벨 지정 |