본문 바로가기
수업(국비지원)/Python

[Python] matplot 시각화 모듈 - 연합 막대그래프

by byeolsub 2023. 4. 25.
'''
2022-12-02 복습
 DataFrame.plot(kind="그래프 종류") 함수를 이용하여 그래프 작성.
   기본 : 선그래프
   kind="bar" : 막대그래프
   kind="bath" : 수평막대그래프
   kind="hist" : 히스토그램   
   kind="scatter" : 산점도
   kind="box" : 박스그래프
   
 matplot 시각화 모듈
  rc("font", family="Malgun Gothic") : 한글폰트 설정  
'''

📌

###### matplot 모듈을 이용한 그래프
import matplotlib.pyplot as plt
# x축 데이터 내용
subject = ["Oracel", "Python", "Sklearn", "Tensorflow"]
# y축 데이터 값
score = [65,90,85,95]
# 그래프가 그려지는 영역
fig = plt.figure()
# 그래프 영역을 분할
# ax1 : 그래프 작성 영역
#subplot(row, column, index)
ax1 = fig.add_subplot(1,1,1) # 1행 1열 1번째 영역 (하나의 그래프영역을 전부 사용하겠다.)
# bar(x축의 값, y축의 값, 가운데영역에 막대,막대그래프의 색상) : 막대그래프
# x축의 값 : range(len(subject)) : 0 ~ 3까지
# y축의 값 : score : [65,90,85,95]
# align="edge"/"center"
ax1.bar(range(len(subject)), score, align="center", color="darkblue")
# x축의 값을 숫자에서 Subject의 내용으로 변경
# rotation : 표시되는 x축의 값의 출력각도
plt.xticks(range(len(subject)), subject, rotation=0, fontsize="small")
plt.xlabel("Subject") # x축 값 설명
plt.ylabel("Score") # y축 값 설명
plt.title("Class Score")


❓ # 남북한발전전력량.xlsx 데이터를 이용하여 연합 막대 그래프 그리기

import pandas as pd
import matplotlib.pyplot as plt
plt.style.use("ggplot")
df = pd.read_excel("data/남북한발전전력량.xlsx")
df.info()
df

# 북한지역에 있는 발전량만 조회.
df = df.loc[5:]
df

df.info()

# 전력량 (억㎾h) 컬럼 제거하기
#1
df = df.drop("전력량 (억㎾h)",axis=1)
df
#2
del df["전력량 (억㎾h)"]
df

# 발전 전력별 컬럼을 index로 설정하기
df.set_index("발전 전력별",inplace=True)
df.info

# 전치행렬 : 행과 열을 변경
df = df.T
df.info

# 합계 컬럼을 총발전량 컬럼으로 변경하기
df.rename(columns={"합계":"총발전량"},inplace=True)
df

# 총발전량 - 1년 추가 : 전년도 발전량
df.head()

# shift(1) : 총발전량의 앞의 인덱스 데이터
df["전년도 발전량"] = df["총발전량"].shift(1)
df.head()

# 증감률 컬럼 추가하기
# 증감률 : (현재 - 전년도)/전년도 * 100
#          (현재/전년도 -1) * 100
df["증감률"] = ((df["총발전량"] / df["전년도 발전량"]) -1) * 100

### 연합 그래프 작성
import matplotlib.pyplot as plt
plt.style.available # 사용이 가능한 style 목록
plt.style.use("ggplot") # 그래프의 style 설정
plt.rc('font', family="Malgun Gothic") # 한글폰트 설정
plt.rcParams['axes.unicode_minus'] = False # 음수표시 - 설정
df[['수력','화력']] # (단순 확인용)
# DataFrame.plot 함수 사용
# figsize : 그래프 영역의 크기 지정.
# width : 그래프의 간격.
# stacked=False : 막대그래프을 수력, 화력 따로 표시
# ax1 : 막대그래프 영역
# x축의 값 : df.index
# y축의 값 : df[['수력','화력']]. 막대그래프 2개
ax1 = df[['수력','화력']].plot(kind='bar', figsize=(20,10),
                           width=0.7, stacked=False)
# ax1 영역을 복사하여 ax2와 같은 영역으로 설정
# ax1의 영역과 ax2의 영역은 같은 영역.
ax2 = ax1.twinx()
# ax2 : 증감율 선그래프 작성
# df.index : 년도 데이터를 x축의 값.
# df.증감율 : df 데이터에 있는 증감율 컬럼을 y축의 값.
# ls='--' : 선의 종류(-- : 댓쉬선, - : 실선)
# marker='o' : 선의 마커 표시
# markersize=10 : 마커 크기
# label='전년대비 증감울(%)' : 범례표시
ax2.plot(df.index, df.증감률,ls='--',marker='o', markersize=10,
         color='green',label='전년대비 증감울(%)')
ax1.set_ylim(0,300) # 막대 그래프 y축의 값의 범위
ax2.set_ylim(-50,50) # 선그래프 y축의 값의 범위
ax1.set_xlabel('연도',size=20) # x축 값의 설명
ax1.set_ylabel('발전량(억 kwh)') # 막대그래프 y축 값의 설명
ax2.set_ylabel('전년 대비 증감율(%)') # 선그래프 y축 값의 설명
plt.title('북한 전력 발전량 (1990 ~ 2016)',size=30) # 전체 그래프의 제목
ax1.legend(loc='upper left') # 범례 : 왼쪽 위 위치
ax2.legend(loc='upper right') # 범례 : 오른쪽 위 위치
# 그래프를 이미지 파일로 저장.
# savefig(저장파일명, 해상도, 이미지크기설정)
plt.savefig("북한전력량.png",dpi=400,bbox_inches="tight")
plt.show() # 화면에 표시