DA Study/TIL

[TIL] subplot으로 두 개의 그래프 한 figure에 그리기 # python # 부트캠프

harrym8n 2025. 1. 23. 17:31

부트캠프 프로젝트 - 구독 서비스 플랫폼 데이터 분석 프로젝트

  • 문제 코드
# 그래프 스타일 지정
sns.set_theme(style='darkgrid',rc={'figure.figsize':(18,6)},font='Nanum Gothic')

# 꺾은선 그래프 그리기

sns.lineplot(data=df, x='event', y='y', marker='o', color='#A94A4A')

# 막대그래프 그리기

sns.barplot(datadf, x='event', y='y', color='#F4D793')  
plt.grid(axis='x')

# 타이틀 축 라벨 작성 및 설정

plt.title('그래프 타이틀', fontsize=18)  
plt.xlabel('x축', fontsize=10)  
plt.ylabel('y축', fontsize=10)  
plt.xticks(fontsize=6, rotation=40)

plt.grid(axis='x')

plt.tight\_layout()  
plt.show()

  • 개선 코드
# Figure와 Axis 객체 생성

fig, ax = plt.subplots(figsize=(18,6))

# 막대 그래프 그리기

bars = sns.barplot(data=df, x='event', y='y', color='#F4D793', ax=ax)

# 선 그래프를 위한 평균값 계산

line = ax.plot(df['y'], marker='o', color='#A94A4A')  
plt.grid(axis='x')

# 타이틀 축 라벨 작성 및 설정

plt.title('그래프 타이틀', fontsize=18)  
plt.xlabel('x축', fontsize=10)  
plt.ylabel('y축', fontsize=10)  
plt.xticks(fontsize=6, rotation=40)

plt.grid(axis='x')

plt.tight_layout()  
plt.show()
  • 위 코드의 핵심 변수명, 데이터 등은 마스킹 처리하여 기재하였습니다.

[ 문제 상황 ]

  • 동일한 데이터로 막대그래프와 꺾은선 그래프를 하나의 figure에 그렸는데, 막대그래프와 꺾은선 그래프의 y축 데이터가 특정 시점부터 일치하지 않았다.

[ 해결 ]

  • matplotlib 라이브러리의 객체 지향 인터페이스로 그래프를 그리는 코드로 해결했다.

  • 처음에는 sns.lineplot()sns.barplot()독립적으로 호출하여 각각 그래프를 그렸다. 그렇기 때문에 sns.lineplot()sns.barplot()은 각각의 축 범위를 독립적으로 계산하여 꺾은선 그래프와 막대그래프가 동일한 X,Y축 스케일을 사용하지 않을 가능성이 커졌다.

  • 이를 해결하기 위해 두 번째 코드로 matplotlib의 AxesSubplot 객체를 생성한 뒤, 꺾은선 그래프와 막대그래프를 동일한 ax 객체에 그렸다. ax 객체를 공유하므로 꺾은선 그래프와 막대그래프가 동일한 X,Y축 범위를 사용하게 되어 두 그래프 간 데이터 불일치가 발생하지 않았다.

[ 회고 ]

  • 이 경험을 통해 데이터 시각화에서 일관성 있는 스케일과 축 설정이 얼마나 중요한지를 배웠다. 그래프를 독립적으로 생성하면 동일한 축 범위를 사용하지 않게되어 두 그래프 간 축의 스케일 차이가 날 경우 시각화에 문제가 생길 수 있다는 점을 알게 되었다. 또한 그래프를 생성할 때 데이터의 맥락을 유지하고, 명확하고 일관된 스케일을 설정하여 정보 전달의 정확성을 보장해야 한다는 점을 깨달았다.