Matplotlib
기본 그래프 도구
- 연속하는 데이터 값들을 직선 또는 곡선으로 연결하여 데이터 값 사이의 관계 표현
- 시계열 데이터와 같이 연속적인 값의 변화와 패턴을 파악하는 데 적합(시도별 전출입 인구수.xlsx)
▶ 라이브러리를 불러옵니다.
import matplotlib.pyplot as plt
▶ 주소를 불러옵니다.
df_move = pd.read_excel("./시도별 전출입 인구수.xlsx")
▶ 누락 값을 앞 데이터로 채웁니다.
데이터 프레임 객체 .fillna(method='fill'))
df_move.fillna(method='ffill', inplace=True)
▶ 서울에서 다른 지역으로 이동한 데이터만 추출합니다.
is_seoul = df_move['전출지별'] == "서울특별시"
not_seoul = df_move['전입지별'] != "서울특별시"
df_seoul = df_move[is_seoul & not_seoul]
▶ 전출지 별의 컬럼을 삭제하고 전입지별의 컬럼명을 전입지로 변경합니다.
df_seoul.drop(columns=['전출지별'], inplace=True)
df_seoul.rename(columns={"전입지별":"전입지"}, inplace=True)
▶ 컬럼 전입지를 인덱스로 설정합니다.
df_seoul.set_index("전입지", inplace=True)
▶ 서울에서 경기도로 이동한 인구 데이터 값만 선택하여 저장합니다.
sr_one = df_seoul.loc[["경기도"]]
▶ 그래프를 생성합니다.
- plot()으로 생성
sr_one.T.plot()
- plt.plot()으로 생성
plt.plot(sr_one.columns, sr_one.loc['경기도'])
plt.plot() 그래프 생성
▶ 차트 제목, 축 이름 추가합니다.
▷ 타이틀 설정 구문
plt.title("title name")
▷ x축, y축명 설정 구문
plt.xlabel("x axis name")
plt.ylabel("y axis name")
▷ 한글 설정
# 한글 설정
from matplotlib import font_manager, rc
font_path = "./malgun.ttf" # 폰트파일의 위치
mg = font_manager.FontProperties(fname=font_path)
font_name = mg.get_name()
rc('font', family=font_name)
# 한글이 추가되는 함수 옵션에 추가합니다. fontproperties=mg
# 맥 한글 설정
plt.rc('font', family='AppleGothic')
plt.rcParams['axes.unicode_minus'] = False
▷ 예문
from matplotlib import font_manager, rc
font_path = "./malgun.ttf" # 폰트파일의 위치
mg = font_manager.FontProperties(fname=font_path)
font_name = mg.get_name()
rc('font', family=font_name)
plt.plot(sr_one.columns, sr_one.loc['경기도'])
plt.title("Seoul -> Gyeonggi-do 서울 -> 경기", fontproperties=mg)
plt.xlabel("Year 기간", fontproperties=mg)
plt.ylabel("Movement 이동 인구수", fontproperties=mg)
▶ 그래프 figure 설정
# 제일 윗 단에 입력합니다.
plt.figure(x length, y length)
▷ 예문
plt.figure(figsize=(14, 5))
plt.plot(sr_one.columns, sr_one.loc['경기도'])
plt.title("Seoul -> Gyeonggi-do 서울 -> 경기", fontproperties=mg)
plt.xlabel("Year 기간", fontproperties=mg)
plt.ylabel("Movement 이동 인구수", fontproperties=mg)
plt.show()
▶ 그래프 rotation 설정
▷ 구문
plt.xticks(rotation=각도)
▶ 예문
plt.figure(figsize=(14, 5))
plt.plot(sr_one.columns, sr_one.loc['경기도'])
plt.title("Seoul -> Gyeonggi-do 서울 -> 경기", fontproperties=mg)
plt.xlabel("Year 기간", fontproperties=mg)
plt.ylabel("Movement 이동 인구수", fontproperties=mg)
# plt.xticks(rotation='vertical') 90도로 설정합니다.
plt.xticks(rotation=70)
plt.show()
▶ 스타일 서식 지정
색, 폰트 등 디자인적 요소를 사전에 지정된 스타일로 빠르게 일괄 변경합니다.
스타일 서식을 지정하는 것은 Matpolib 환경 설정을 변경하는 것이므로 다른 파일에도 계속 적용합니다.
▷ 스타일 서식 종류
print(plt.style.available)
# ['Solarize_Light2', '_classic_test_patch', '_mpl-gallery',
# '_mpl-gallery-nogrid', 'bmh', 'classic', 'dark_background',
# 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn',
# 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark',
# 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep',
# 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel',
# 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white',
# 'seaborn-whitegrid', 'tableau-colorblind10']
▷ 스타일 서식을 미리 확인합니다.
반복문으로 모든 서식을 확인할 수 있습니다.
for i in plt.style.available :
print(i)
plt.style.use(i)
plt.figure(figsize=(14, 5))
plt.plot(sr_one.columns, sr_one.loc['경기도'])
plt.title("Seoul -> Gyeonggi-do 서울 -> 경기", fontproperties=mg)
plt.xlabel("Year 기간", fontproperties=mg)
plt.ylabel("Movement 이동 인구수", fontproperties=mg)
# plt.xticks(rotation='vertical')
plt.xticks(rotation=70)
plt.show()
▷ 예문 (ggplot)
plt.style.use('ggplot')
plt.figure(figsize=(14, 5))
plt.plot(sr_one.columns, sr_one.loc['경기도'])
plt.title("Seoul -> Gyeonggi-do 서울 -> 경기", fontproperties=mg)
plt.xlabel("Year 기간", fontproperties=mg)
plt.ylabel("Movement 이동 인구수", fontproperties=mg)
# plt.xticks(rotation='vertical')
plt.xticks(rotation=70)
plt.show()
▷ 예문 (seaborn-whitegrid)
plt.style.use('seaborn-whitegrid')
plt.figure(figsize=(14, 5))
plt.plot(sr_one.columns, sr_one.loc['경기도'])
plt.title("Seoul -> Gyeonggi-do 서울 -> 경기", fontproperties=mg)
plt.xlabel("Year 기간", fontproperties=mg)
plt.ylabel("Movement 이동 인구수", fontproperties=mg)
# plt.xticks(rotation='vertical')
plt.xticks(rotation=70)
plt.show()
▶ Marker
▶ 구문
plt.plot(x axis, y axis, marker='o', markersize=마커의 크기)
# marker의 인자값은 *도 가능합니다.
▷ 예문
plt.style.use('seaborn-whitegrid')
plt.figure(figsize=(14, 5))
plt.plot(sr_one.columns, sr_one.loc['경기도'], marker='o', markersize=7)
plt.title("Seoul -> Gyeonggi-do 서울 -> 경기", fontproperties=mg)
plt.xlabel("Year 기간", fontproperties=mg)
plt.ylabel("Movement 이동 인구수", fontproperties=mg)
# plt.xticks(rotation='vertical')
plt.xticks(rotation=70)
plt.show()
▶ 범례 설정
▶ 구문
plt.plot(x axis, y axis, label="라벨 이름")
plt.legend()
▶ 범례 디자인 설정
plt.legend(loc='best', fontsize=14, frameon=True, shadow=True, prop=mg)
* loc : 위치, best를 하게 되면 파이썬 내에서 최적의 위치 값으로 설정합니다.
* frameon : 테투리를 생성합니다.
* shadow : 테두리의 그림자 값을 생성합니다.
* prop : 한글 사용 여부 값입니다.
▷ 예문
plt.plot(sr_one.columns, sr_one.loc['경기도'], marker='o', markersize=7, label="moving population")
▶ FontSize 설정
타이틀, x축, y축, 범례의 텍스트 크기를 설정합니다.
▷ 예문
plt.title("Seoul -> Gyeonggi-do 서울 -> 경기", fontproperties=mg, fontsize=27)
plt.xlabel("Year 기간", fontproperties=mg, fontsize=20)
plt.ylabel("Movement 이동 인구수", fontproperties=mg, fontsize=20)
plt.legend(loc='best', fontsize=14, frameon=True, shadow=True)
▷ 범례와 폰트사이즈 설정의 예문
plt.style.use('seaborn-whitegrid')
plt.figure(figsize=(14, 5))
plt.plot(sr_one.columns, sr_one.loc['경기도'], marker='o', markersize=7, label="moving population")
plt.title("Seoul -> Gyeonggi-do 서울 -> 경기", fontproperties=mg, fontsize=27)
plt.xlabel("Year 기간", fontproperties=mg, fontsize=20)
plt.ylabel("moving population", fontproperties=mg, fontsize=20)
plt.xticks(rotation=70)
plt.legend(loc='best', fontsize=14, frameon=True, shadow=True)
plt.show()
▶ y축의 범위 설정
▶ 구문
plt.ylim(최소값, 최대값)
▷ 예문
plt.style.use('seaborn-whitegrid')
plt.figure(figsize=(14, 5))
plt.ylim(50000, 800000)
plt.plot(sr_one.columns, sr_one.loc['경기도'],
marker='o', markersize=7,
label="moving population")
plt.title("Seoul -> Gyeonggi-do 서울 -> 경기", fontproperties=mg, fontsize=27)
plt.xlabel("Year 기간", fontproperties=mg, fontsize=20)
plt.ylabel("moving population", fontproperties=mg, fontsize=20)
plt.xticks(rotation=70)
plt.legend(loc='best', fontsize=14, frameon=True, shadow=True)
plt.show()
▶ 화살표 입력
- 처음 인자 값 : 텍스트
- xy : 화살표의 머리 위치(x index, y value)
- xytext : 화살표의 꼬리 위치(x index, y value)
- arrowprops
- arrowstyle : 화살표의 스타일
- color : 화살표의 색
- lw : line width
plt.annotate("",
xy=(25, 650000),
xytext=(2, 250000),
arrowprops = dict(arrowstyle = "->", color = "skyblue", lw = 5))
plt.annotate("",
xy=(47, 420000),
xytext=(32, 580000),
arrowprops = dict(arrowstyle = "->", color = "brown", lw = 5))
▶ 화살표 주석 입력
- 처음 인자값 : 텍스트
- xy : 텍스트 머리 위치(x index, y value)
- xytext : 텍스트의 꼬리 위치(x index, y value)
- ha : horizontal alignment
- va : vertival alignment
- fontsize : 폰트 사이즈
plt.annotate("increase in population mobility (1970-1995)",
xy=(40, 650000),
xytext=(13, 400000),
rotation=20,
ha = 'center',
va = 'baseline', fontsize=15)
plt.annotate("decrease in population movement (2002-2017)",
xy=(47, 300000),
xytext=(40, 480000),
rotation= -13,
ha = 'center',
va = 'baseline', fontsize=12)
plt.figure()
화면을 분할하여 그래프를 여러 개 생성합니다.
- 화면을 여러개로 분활하여 분활된 각 화면에 서로 다른 그래프를 생성합니다.
- 여러개의 axe객체를 생성하여 분활된 화면마다 axe객체를 입력합니다.
- axe 객체는 각각 서로 다른 그래프로 표현합니다.
- 한 화면에서 여러 개의 그래프를 비교하거나 다양한 정보를 동시에 보여줄 때 사용합니다.
- axe객체를 1개만 생성하는 경우에는 하나의 그래프만 표시합니다.
fig = plt.figure(figsize=(10, 10))
ax1 = fig.add_subplot(2, 1, 1)
ax2 = fig.add_subplot(2, 1, 2)
plt.show()
▶ 두개의 그래프를 생성합니다
fig = plt.figure(figsize=(10, 10))
ax1 = fig.add_subplot(2, 1, 1)
ax2 = fig.add_subplot(2, 1, 2)
#ax2
ax2.plot(sr_one.columns, sr_one.loc['경기도'],
marker='o', markersize=7,
label="moving population")
ax2.legend(["Seoul -> Gyeonggi-do"], loc='best', frameon=True, shadow=True)
ax2.set_ylim(50000, 800000)
#ax1
ax1.scatter(sr_one.columns, sr_one.loc['경기도'], color='red')
ax1.set_ylim(50000, 800000)
plt.show()
▶ 두개의 그래프의 디테일을 설정합니다.
fig = plt.figure(figsize=(10, 10))
ax1 = fig.add_subplot(2, 1, 1)
ax2 = fig.add_subplot(2, 1, 2)
#ax2
ax2.plot(sr_one.columns, sr_one.loc['경기도'],
marker='o', markersize=7,
label="moving population")
ax2.legend(["Seoul -> Gyeonggi-do"], loc='best', frameon=True, shadow=True)
ax2.set_ylim(50000, 800000)
ax2.set_xticklabels(labels=sr_one.columns, rotation=75, fontdict=dict(fontsize=10))
ax2.set_xlabel("Year 기간", fontproperties=mg, fontsize=20)
ax2.set_ylabel("moving population", fontproperties=mg, fontsize=20)
#ax1
ax1.set_title("Seoul -> Gyeonggi-do 서울 -> 경기", fontproperties=mg, fontsize=25)
ax1.scatter(sr_one.columns, sr_one.loc['경기도'], color='red')
ax1.legend(["Seoul -> Gyeonggi-do"], loc='best', frameon=True, shadow=True)
ax1.set_ylim(50000, 800000)
ax1.set_xticklabels(labels=sr_one.columns, rotation=75, fontdict=dict(fontsize=10))
ax1.set_xlabel("Year 기간", fontproperties=mg, fontsize=20)
ax1.set_ylabel("moving population", fontproperties=mg, fontsize=20)
# plt.show()
▷ plt.plot()의 옵션
꾸미기 옵션 | 설명 |
'o' | 선 그래프가 아니라 점 그래프로 표현 |
marker = 'o' | 마커 모양 ('o', '+', '*' 등) |
markerfacecolor='green' | 마커 배경색 |
markersize=10 | 마커 크기 |
color='olive' | 선의 색 |
linewidth=2 | 선의 두깨 |
label='서울 -> 경기' | 라벨 지정 |
▶ 3개의 그래프를 한 그래프로 표현합니다.
#서울-> 충남, 경북, 강원도 3개 그래프 한화면에 생성
df_3 = df_seoul.loc[['충청남도', '경상북도', '강원도']].T
df_3 = df_3.astype(int)
# astype 메서드는 열의 요소의 dtype을 변경하는함수 입니다.
# 그래프 설정
plt.style.use('seaborn-whitegrid')
fig = plt.figure(figsize=(20, 5))
ax = fig.add_subplot(1, 1, 1)
ax.plot(df_3, marker='o', markersize=7, label='set', linewidth=7)
# 각각의 그래프의 색을 변경하기 위해서는 개별로 생성해야합니다.
# ax.plot(df_3.충청남도, marker='o',label = '서울->충남', mfc='orange',color='green')
# ax.plot(df_3.경상북도, marker='o', label = '서울->경북', mfc='pink',color='skyblue')
# ax.plot(df_3.강원도, marker='o', label = '서울->강원', mfc='red',color='purple')
ax.set_xticklabels(df_3.index, rotation=75)
ax.legend(["Seoul to Chungcheongnam-do", "Seoul to Gyeongsangbuk-do", "Seoul to Gangwon-do"])
ax.set_title('The movement of population from Seoul to Chungcheongnam-do, Gyeongsangbuk-do, Gangwon-do',
fontsize = 25)
ax.set_xlabel("Year", fontsize=20)
ax.set_ylabel("Movement Value", fontsize=20)
plt.show()
▶ 4개의 그래프를 개별 생성합니다.
df_4 = df_seoul.loc[['충청남도', '경상북도', '강원도', '전라남도']].T
df_4 = df_4.astype(int)
df_4
plt.style.use('seaborn-whitegrid')
fig = plt.figure(figsize=(20, 10))
# 여백설정
plt.subplots_adjust(wspace = 0.5, hspace = 0.5)
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
ax4 = fig.add_subplot(2, 2, 4)
ax1.plot(df_4["충청남도"], color="HotPink", linewidth=7)
ax2.plot(df_4["경상북도"], color="RebeccaPurple", linewidth=7)
ax3.plot(df_4["강원도"], color="Salmon", linewidth=7)
ax4.plot(df_4["전라남도"], color="DarkGreen", linewidth=7)
ax1.set_title("Seoul to Chungcheongnam-do", fontsize=20)
ax2.set_title("Seoul to Gyeongsangbuk-do", fontsize=20)
ax3.set_title("Seoul to Gangwon-do", fontsize=20)
ax4.set_title("Seoul to Jeollanam-do", fontsize=20)
for i in [ax1, ax2, ax3, ax4] :
i.set_xticklabels(df_3.index, rotation=75, fontsize=10)
i.set_xlabel("Year", fontsize=20)
i.set_ylabel("Movement Value", fontsize=20)
i.set_ylim(5000, 60000)
색 정보 확인
# 색을 확인합니다.
import matplotlib
colors = {}
for name, hex in matplotlib.colors.cnames.items() :
colors[name] = hex
print(colors)
면적 그래프
- Area plot은 각 열의 데이터를 선 그래프로 구현 후 선 그래프와 x축 사이 공간에 색을 입힙니다.
- 색의 alpha는 기본값 0.5로 투과되어 보입니다. (투명도 : 0 ~ 1)
▶ 기본 구문
plot(kind='area', stacked=True, alpha=0.2)
▶ 면적 그래프
- stack=False
# 0930 코드 시작
df_4.plot(kind='area', stacked=False, alpha=0.2, figsize=(20, 10))
plt.title('Seoul ->Other regions Population Movement', size=30) # fontproperties=mg_30
plt.ylabel('Number of moving populations', size=20) # fontproperties=mg_20
plt.xlabel('Period', size=20) # fontproperties=mg_20
plt.legend(loc='best', fontsize=15) # prop=mg_15
plt.legend(["Seoul to Chungcheongnam-do", "Seoul to Gyeongsangbuk-do", "Seoul to Gangwon-do", "Seoul to Jeollanam-do"])
plt.show()
▶ 면적 그래프
- stack=True
막대 그래프
- 데이터 값의 크기의 비례하여 높이를 갖는 직사각형 막대로 표현합니다.
- 막대 높이의 상대적 길이 차이를 통해 값의 크고 작음을 설명합니다.
- 세로형과 가로형이 있습니다.
▶ 세로형 막대 그래프
- 세로형의 경우 정보 제공 측면에서 선 그래프와 큰 차이가 없습니다.
- 세로형 막대 그래프는 시간적으로 차이가 나는 두 점에서 데이터 값의 차이를 잘 설명합니다.
- 시계열 데이터를 표현하는데 적합합니다.
plot(kind='bar')
▷ 예문
col_years = list(map(str, range(2010, 2018)))
df_4 = df_seoul.loc[['충청남도','경상북도', '강원도', '전라남도'], col_years]
df_4 = df_4.transpose()
df_4.plot(kind='bar', figsize=(20, 10), width=0.7, color=['orange', 'green', 'skyblue', 'blue'])
plt.ylim(0, 30000)
plt.title('Seoul -> Other regions Population Movement', size=30) # fontproperties=mg_30
plt.ylabel('Number of moving populations', size=20) # fontproperties=mg_20
plt.xlabel('Period', size=20) # fontproperties=mg_20
plt.legend(["Seoul to Chungcheongnam-do", "Seoul to Gyeongsangbuk-do", "Seoul to Gangwon-do", "Seoul to Jeollanam-do"], loc='best', fontsize=15)
plt.show()
▶ 가로형 막대 그래프
▷ 데이터 프레임을 확인합니다.
df_4
▷ 데이터 프레임을 전치 시킵니다.
df_4.T = df_4.T
▷ 각 지역의 인덱스를 합계 인덱스를 생성하여 입력합니다.
df_4['합계'] = df_4.sum(axis=1)
▷ 각 인덱스의 가장 큰값부터 정렬 합니다.
df_total = df_4[['합계']].sort_values(by='합계', ascending=True)
▷ 그래프를 생성합니다.
df_total.plot(kind='barh', color='DodgerBlue', width=0.5, figsize=(10, 5))
▷ 인덱스명을 변경합니다.
df_total.rename(index={"전라남도":"Jeollanam-do", "경상북도" : "Gyeongsangbuk-do", "강원도" :"Gangwon-do", "충청남도" :"Chungcheongnam-do"}, inplace=True)
▷ 그래프의 x label, y label, title, legend 값을 설정하여 그래프를 생성합니다.
df_total.plot(kind='barh', color='DodgerBlue', width=0.5, figsize=(10, 5), label="Amount of movement")
plt.title('Seoul -> Other regions Population Movement', size=30) # fontproperties=mg_30
plt.ylabel('Number of moving populations', size=20) # fontproperties=mg_20
plt.xlabel('Period', size=20) # fontproperties=mg_20
plt.legend(["Amount of movement"], loc='best', fontsize=13, frameon=True, shadow=True)
plt.show()
종합 그래프 생성
▶ 엑셀 데이터를 가져옵니다,
df_elec = pd.read_excel('./남북한발전전력량.xlsx', header=None)
▶ 북한의 데이터만 가져옵니다.
df_elec_nk = df_elec[6:]
# df_elec_nk = df_elec.iloc[6:]
▶ 전력량 컬럼을 삭제합니다.
df_elec_nk.drop([0],axis=1,inplace=True)
▶ 발전전력별 컬럼을 인덱스로 지정합니다.
df_elec_nk.set_index(df_elec_nk.columns[0], inplace=True)
▶ 데이터 프레임을 전치합니다.
df_elec_nk = df_elec_nk.T
▶ 합계의 컬럼명을 총발전량으로 변경합니다.
df_elec_nk.rename(columns={"합계":"총발전량"}, inplace=True)
▶ '총 발전량' 컬럼을 생성해 총 발전량의 데이터를 1칸 밀어서 입력합니다.
- shift()
- 기준 컬럼의 데이터를 입력한 정수의 칸 만큼 밀어서 반환합니다.
df_elec_nk['총 발전량 -1년'] = df_elec_nk['총발전량'].shift(1)
▶ 증감률과 총발전량을 계산하여 증감률 컬럼에 입력합니다.
df_elec_nk['증감률'] = (df_elec_nk['총발전량'] / df_elec_nk['총 발전량 -1년'] - 1) * 100
▶ 수력, 화력의 컬럼명을 변경합니다.
df_elec_nk.rename(columns={"화력":"Firepower", "수력":"Water power"}, inplace=True)
▶ 수력, 화력의 누적 막대 그래프를 ax1에 저장합니다.
ax1 = df_elec_nk[["Water power", "Firepower"]].plot(kind='bar', stacked=True, width=0.5, figsize=(20, 10))
▶ 증감률 그래프를 ax2에 저장한뒤 twinx() 합니다.
# 수력 화력 그래프 ax1에 저장
ax1 = df_elec_nk[["Water power", "Firepower"]].plot(kind='bar', stacked=True, width=0.5, figsize=(20, 10))
# ax2를 ax1에 twinx()
ax2 = ax1.twinx()
# ax2에 증감률 그래프 생성
ax2.plot(df_elec_nk.index, df_elec_nk['증감률'], marker='o', color="ForestGreen", ls='--')
# y축 설정
ax1.set_ylim(0, 500)
ax2.set_ylim(-50, 50)
# 타이틀, x label, y label 설정
ax1.set_title('North Koreas electricity generation (1999 ~ 2016)', size=30) # fontproperties=mg_30
ax1.set_ylabel('Amount of electricity generated(KWh)', size=20)
ax2.set_ylabel('year-on-year rate of increase and decrease(%)', size=20)
ax1.set_xlabel('Year', size=20)
# 범례설정
ax2.legend(["Percentage change"], loc='best')
plt.show()
'Python' 카테고리의 다른 글
[Python] Scatterplot (0) | 2022.09.30 |
---|---|
[Python] Histogram (1) | 2022.09.30 |
[Python] pandas 내장 그래프 도구 (0) | 2022.09.27 |
[Python] 데이터 확인 (0) | 2022.09.27 |
[Python] Web scrapping (0) | 2022.09.27 |