데이터 분석/Python - pandas

[이론] 시각화 : 여러 그래프

toraa 2025. 1. 13. 16:44

1. 하나의 표안에 여러개의 그래프 생성

: 중첩이 되어 그려진다고 생각

import pandas as pd

df_gp=pd.read_csv('data/건강보험심사평가원_진료비.csv')
pivot = pd.pivot_table(df, index='진료년도', columns='시도', 
                       values='환자수', aggfunc='mean')
pivot = pivot.astype('int64')
pivot

pivot의 값을 정수 형태로 설정 ('int64')

 

1) 하나의 표안에 여러개의 선그래프

x = pivot.index.astype('str')
y1 = pivot['세종']
y2 = pivot['경기']
y3 = pivot['제주']

plt.figure(figsize=(20,10))
ax = plt.subplot()
ax.plot(x, y1, label = '세종', color = 'blue')
ax.plot(x, y2, label = '경기', color = 'green')
ax.plot(x, y3, label = '제주', color = 'orange')
plt.legend()
plt.show()

▷ 여러개의 그래프를 하나에 그릴때, label 인자와 legend() 함수로 범례를 구분

▷ x축이나 y축이 동일한 값으로 설정해야 여러개를 중첩해서 그릴 수 있음

▷ y값을 3개 생성 : 그래프를 3개 형성한다는 뜻

▶ 같은 ax에 여러번 반복해서 그래프 그리는 함수를 호출해주면 됨

label은 id같은 고유값, color로 그래프 색 설정 (색상표값 넣어주기도 가능)

legend() : 표가 가지고 있는 라벨의 범례를 표기하는 함수

 

2) seaborn으로 간단하게 여러개의 선그래프 작성

pivot_sub = pivot[['세종','경기','제주','대구','대전','부산']]
plt.figure(figsize=(20,10))
ax = plt.subplot()
sns.lineplot(data = pivot_sub, ax = ax) # ax인자로 원하는 Axes 그리기 가능
plt.show()

lineplot()으로 여러 그래프를 그릴땐 데이터프레임 구조를 먼저 구축

▷ x축, y축 설정하지 않으면 기본적으로 인덱스가 x축, 각 컬럼이 y축으로 설정됨

▷ groupby할 때, as index를 true로 줘서 한번에 그래프 그리기 가능

 

3) 칼럼 목록으로 반복문 활용

pivot_sub = pivot[['세종','경기','제주','대구','대전','부산']]

plt.figure(figsize=(20,10))
ax = plt.subplot()

for col in pivot_sub.columns:
    ax.plot(pivot_sub.index, pivot_sub[col], label = col)
ax.legend()
plt.show()

▷ x축은 index로 공통적으로 설정 (pivot_sub.index)

▷ y값만 반복문으로 column해당 값을 인덱싱을 통해 시리즈로 넣어줌

▷ 라벨엔 컬럼이름 그대로 넣어줌

 

4) 막대그래프에 평균선 그리기

axhline() 함수 : 수평선 그래프 생성

axvline() 함수 : 수직선 그래프 생성

pivot_2022 = pivot.loc[2022]
mean = pivot_2022.mean() # 평균 산출

plt.figure(figsize=(20,10))
ax = plt.subplot()

ax.bar(x=pivot_2022.index, height=pivot_2022, color = '#B7B7B7', label='값')
ax.axhline(mean, color='red', linestyle='--', label=f'평균: {mean:.2f}')
plt.legend()
plt.show()

linestyle 인자를 활용하여 선의 스타일을 지정 가능

▷ ax.bar : height은 시리즈들이 들어감, color는 색상 팔레트에서 원하는 색 설정

▷ ax.axhline : 위에서 정의한 평균값인 mean 변수를 넣어줌

 

5) 중첩 막대그래프 그리기

bar() 함수의 bottom 인자

pivot_2022 = pivot.loc[2022]
pivot_2023 = pivot.loc[2023]

plt.figure(figsize=(20,10))
ax = plt.subplot()

# 2022 데이터를 먼저 막대 시각화
ax.bar(pivot_2022.index, pivot_2022, label='2022년')
# 2022 데이터 위에 중첩하여 시각화
ax.bar(pivot_2023.index, pivot_2023, bottom=pivot_2022, label='2023년')

plt.legend()
plt.show()

▷ ax.bar 두개가 서로 중첩되서 가려지지 않게 표현해야 함

→ bottom 인자를 추가하기 (데이터를 깔고 그위에 그림)

 

6) 그룹 수직 막대그래프

막대 그래프의 너비를 반으로 줄이고, 중앙 위치(오프셋)를 변경

→ 막대를 얇게 해서 이동시켜서 두개의 그래프를 그림

pivot_2022 = pivot.loc[2022]
pivot_2023 = pivot.loc[2023]

plt.figure(figsize=(20,10))
ax = plt.subplot()

# 막대 너비 설정
bar_width = 0.4
# 막대 위치 조정
x1 = [i - bar_width/2 for i in range(len(pivot_2022))]
x2 = [i + bar_width/2 for i in range(len(pivot_2023))]

# 첫 번째 막대 
ax.bar(x1, pivot_2022, bar_width, label='2022년')
# 두 번째 막대 
ax.bar(x2, pivot_2023, bar_width, label='2023년')
ax.set_xticks(range(len(x1))) 
ax.set_xticklabels(pivot_2022.index, fontsize=12)

plt.legend()
plt.show()

막대 위치 조정시 i는 중심을 의미

set_xticks : 눈금을 조정

set_xticklabels : 눈금에 표현된 라벨값을 임의로 설정

 

2. 하나의 그림판에 여러개의 표 생성

row, col, index 컬럼을 지정하여 그림판안의 표 배치를 구성하고 원하는 표를 반환

row: 행의 개수를 지정

col: 열의 개수를 지정

index: row,col이 정해지면 순서를 통해 원하는 배치의 표를 반환

 

Axes 배치하기

plt.figure(figsize = (20,10))
ax1 = plt.subplot(2, 3, 1)
ax2 = plt.subplot(2, 3, 2)
ax3 = plt.subplot(2, 3, 3)
ax4 = plt.subplot(2, 3, 4)
ax5 = plt.subplot(2, 2, 4)
plt.show()

그림판을 그리드로 나눈 후, 인덱스에 해당하는 판에 표를 그려줌

그리드 구성을 중간에 변경할 수 있음 (2,3,n) → (2,2,m)

(순서)

1 2 3

4 5 6

df_gp=pd.read_csv('data/건강보험심사평가원_진료비.csv')
df_sl = df_gp[df_gp['시도'] == '서울']
df_gg = df_gp[df_gp['시도'] == '경기']


plt.figure(figsize = (20,8))

ax1 = plt.subplot(1,2,1)
ax2 = plt.subplot(1,2,2)

ax1.hist(x=df_sl['환자수'], bins=30)
ax1.set_title('서울 히스토그램',fontsize = 16)

sns.boxplot(data=df_gg,
            y='환자수', ax = ax2)
ax2.set_title('경기 상자그림', fontsize = 16)

plt.show()

▷ 첫번째 axis에선 히스토그램, 두번째 axis에는 boxplot을 넣어줌

▷ set_title : 제목 작성