데이터 분석가:Applied Data Analytics/판다스 데이터분석

Matplotlib

데이터분석 2025. 2. 7. 15:58
320x100
728x90

# x, y축 데이터를 plot 함수에 입력
plt.plot(sr_one.index, sr_one.values) #sr_one.index는 x축 값(인덱스), sr_one.values는 y축 값(데이터 값)이 된다.

[<matplotlib.lines.Line2D at 0x12d7b3005b0>]

1. plt.plot(sr_one.index, sr_one.values)

plt.plot(sr_one.index, sr_one.values) plt.show()
  • sr_one이 pandas.Series 객체라고 가정하면, sr_one.index는 x축 값(인덱스), sr_one.values는 y축 값(데이터 값)이 된다.
  • 따라서 plt.plot(sr_one.index, sr_one.values)는 x축과 y축을 명확히 지정해서 선 그래프를 그린다.
  • plt.show()를 호출하면 그래프만 출력된다.

2. plt.plot(sr_one)

plt.plot(sr_one) plt.show()
  • 여기서 sr_one 자체를 plt.plot()에 전달하면, Matplotlib이 내부적으로 x축과 y축을 자동으로 해석해서 그래프를 그린다.
    • x축: sr_one.index
    • y축: sr_one.values
  • 즉, 결과적으로 그래프 모양은 위 코드와 동일하다.
  • 하지만 plt.plot(sr_one)은 리턴 값이 존재하는데, matplotlib.lines.Line2D 객체를 반환한다.

3. "객체가 표시되지 않고 그림만 표시된다는 의미"

plt.plot(sr_one)
  • 이 코드만 실행하면, Jupyter Notebook이나 인터프리터 환경에서는 다음과 같은 객체 정보가 출력될 수 있다.
     
    [<matplotlib.lines.Line2D at 0x7f8c2b3e3d90>]
  • 즉, plt.plot(sr_one)은 그려진 그래프 객체(Line2D)를 반환하는데, plt.show() 없이 실행하면 Python이 이 반환 객체를 출력하려고 시도하는 것.
  • 하지만 plt.show()를 사용하면 Matplotlib이 그래프만 출력하도록 처리하기 때문에 객체 정보는 안 보이고 그래프만 표시됨.

4. 결론

plt.plot(sr_one.index, sr_one.values) 그래프만 출력됨
plt.plot(sr_one) 그래프만 출력됨 (내부적으로 x축, y축 자동 설정)
plt.plot(sr_one); 그래프만 출력됨 (세미콜론 사용 시 객체 출력 방지)
print(plt.plot(sr_one)) Line2D 객체 정보 출력됨

즉, "객체가 표시되지 않고 그림만 표시된다"는 의미는 plt.show()가 반환 객체를 숨기고 그래프만 출력하도록 동작한다는 뜻이다!

 

# x, y축 데이터를 plot 함수에 입력
plt.plot(sr_one.index, sr_one.values, linestyle="--")

# 차트 제목 추가
plt.title('서울 -> 경기 인구 이동')

# 축이름 추가
plt.xlabel('기간')
plt.ylabel('이동 인구수')

plt.show()  # 변경사항 저장하고 그래프 출력

Matplotlib에서는 한글이 깨지는 현상, 연도 X축 눈금 라벨의 글씨가 겹쳐 알아볼 수 없다.

Matplotlib은 한글지원이 안된다는것 때문에 해결을 위해서는 Matplotlib을 사용하는 파이썬 프로그램의 앞부분에 한글 폰트를 지정하는 코드를 추가해야 한다.
# matplotlib 한글 폰트 오류 문제 해결
from matplotlib import font_manager, rc
font_path = "./data/malgun.ttf"   #폰트파일의 위치  malgun.ttf 폰트 파일을 해당 경로 폴더 /data/에 저장후 실행필
font_name = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font_name)
# Excel 데이터를 데이터프레임 변환 
df = pd.read_excel('./data/시도별_전출입_인구수.xlsx')

# 누락값(NaN)을 앞 데이터로 채움 (엑셀 양식 병합 부분)
df = df.ffill()
# x, y축 데이터를 plot 함수에 입력
plt.plot(sr_one.index, sr_one.values)

# 차트 제목 추가
plt.title('서울 -> 경기 인구 이동')

# 축이름 추가
plt.xlabel('기간')
plt.ylabel('이동 인구수')

plt.show()  # 변경사항 저장하고 그래프 출력

X, Y축 제목은 한글로 표기 된다.

다음은 X축의 눈금 라벨의 글씨가 서로 겹치지 않게 충분한 공간과 눈금 라벨 의 방향을 조절하여 겹치지 않게 한다.

# 그림 사이즈 지정(가로 14인치, 세로 5인치)
plt.figure(figsize=(14, 5))   #figure 함수로 그림틀의 가로 사이즈를 더 크게 설정한다.

# x축 눈금 라벨 회전하기
plt.xticks(rotation='vertical')  plt.xticks(rotation=90) 같은 표기이다.   #Xticks() 함수는 X축 눈금 라벨을 반시계 방향으로 90도 회전하여 글씨가 겹치지 않게 만든다

# x, y축 데이터를 plot 함수에 입력 
plt.plot(sr_one.index, sr_one.values)

plt.title('서울 -> 경기 인구 이동')  #차트 제목
plt.xlabel('기간')                  #x축 이름
plt.ylabel('이동 인구수')           #y축 이름

plt.legend(labels=['서울 -> 경기'], loc='best')    #범례 표시  loc=0, loc=1의 결과는 같다

loc 옵션별 위치 값

loc 옵션에는 숫자(정수) 또는 문자열을 사용할 수 있습니다.

(1) 정수 값 (숫자로 위치 지정)

loc 값범례 위치

0 best (자동으로 최적 위치)
1 upper right (오른쪽 위)
2 upper left (왼쪽 위)
3 lower left (왼쪽 아래)
4 lower right (오른쪽 아래)
5 right (오른쪽 중앙)
6 center left (왼쪽 중앙)
7 center right (오른쪽 중앙)
8 lower center (아래 중앙)
9 upper center (위 중앙)
10 center (그래프 정중앙)



plt.show()  # 변경사항 저장하고 그래프 출력 아래 처럼 된다.

# 스타일 서식 지정
plt.style.use('ggplot') 

# 그림 사이즈 지정
plt.figure(figsize=(14, 5))

# x축 눈금 라벨 회전하기
plt.xticks(size=10, rotation='vertical')

# x, y축 데이터를 plot 함수에 입력 (마커 표시 추가)
plt.plot(sr_one.index, sr_one.values, 
         marker='o', 

1. marker 옵션으로 사용할 수 있는 마커 종류

마커 기호설명

'o' 원 (circle)
's' 사각형 (square)
'^' 위쪽 삼각형 (triangle up)
'v' 아래쪽 삼각형 (triangle down)
'<' 왼쪽 삼각형 (triangle left)
'>' 오른쪽 삼각형 (triangle right)
'D' 다이아몬드 (diamond)
'd' 얇은 다이아몬드 (thin diamond)
'*' 별 모양 (star)
'p' 오각형 (pentagon)
'h' 육각형 (hexagon1)
'H' 육각형 (hexagon2)
'X' X자 (X-shaped)
'+' 플러스 (plus)
'x' 작은 x (small x)
`' '`
'_' 수평 선 (horizontal line)


         markerfacecolor='red', 
         markeredgecolor='blue', 
         markeredgewidth=2,
         markersize=10)   

plt.title('서울 -> 경기 인구 이동', size=30)  #차트 제목
plt.xlabel('기간', size=20)                  #x축 이름
plt.ylabel('이동 인구수', size=20)           #y축 이름

plt.legend(labels=['서울 -> 경기'], loc='best', fontsize=15)   #범례 표시

plt.show()  # 변경사항 저장하고 그래프 출력

https://matplotlib.org/stable/gallery/style_sheets/style_sheets_reference.html 여러 스타일 시트가 있다.
그중 # 스타일 서식 지정
plt.style.use('fivethirtyeight') 으로 지정했을때는 아래와 같다. 스타일만 fivethirtyeight으로 바꿨을 뿐인데 전체적인 분위기가 다르게 적용되니 위에 reference사이트를 참조하세요.

 

# 스타일 서식 지정
plt.style.use('seaborn-v0_8-pastel') 

# 그림 사이즈 늘리기
plt.figure(figsize=(14, 5))

# x축 눈금 라벨 회전하기
plt.xticks(size=10, rotation='vertical')

# x, y축 데이터를 plot 함수에 입력 
plt.plot(sr_one.index, sr_one.values, marker='o', markersize=10)  

plt.title('서울 -> 경기 인구 이동', size=30)  #차트 제목
plt.xlabel('기간', size=20)                  #x축 이름
plt.ylabel('이동 인구수', size=20)           #y축 이름

#범례 표시
plt.legend(labels=['서울 -> 경기'], loc='best', fontsize=15)

# 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, 350000),            #텍스트 위치 기준점
             rotation=25,                #텍스트 회전각도
             va='baseline',              #텍스트 상하 정렬
             ha='center',                #텍스트 좌우 정렬
             fontsize=15,                #텍스트 크기
             )

plt.annotate('인구이동 감소(1995-2017)',  #텍스트 입력
             xy=(40, 470000),            #텍스트 위치 기준점
             rotation=-11,               #텍스트 회전각도
             va='baseline',              #텍스트 상하 정렬
             ha='center',                #텍스트 좌우 정렬
             fontsize=15,                #텍스트 크기
             )


plt.show()  # 변경사항 저장하고 그래프 출력

 

 

  • ha (가로 정렬): 'center', 'left', 'right'
  • va (세로 정렬): 'baseline', 'top', 'bottom', 'center', 'center_baseline'

 

# axe 객체에 차트 추가
fig, axes = plt.subplots(1, 2, figsize=(12, 2))
axes[0].plot(samsung_revenue['quarter'], samsung_revenue['value'])
samsung_revenue['value'].plot(ax=axes[1])
plt.show()

 

  • plt.subplots(1, 2)
    • 1행 2열의 서브플롯을 생성 (즉, 가로로 두 개의 그래프를 배치)
    • axes는 두 개의 개별적인 그래프(축, Axes 객체)를 포함하는 리스트가 됩니다.
    • axes[0]: 첫 번째 그래프
    • axes[1]: 두 번째 그래프
  • figsize=(12, 2)
    • 전체 그림의 크기를 가로 12인치, 세로 2인치로 설정.

axes[0].plot(samsung_revenue['quarter'], samsung_revenue['value'])

첫 번째 서브플롯(axes[0])에 samsung_revenue 데이터를 이용해 선 그래프를 추가.

  • samsung_revenue['quarter']: x축 (분기별 데이터)
  • samsung_revenue['value']: y축 (해당 분기의 매출)
  • .plot(): 기본 선 그래프를 그려줌.

첫 번째 그래프는 axes[0]에 직접 그려짐.


samsung_revenue['value'].plot(ax=axes[1])

두 번째 서브플롯(axes[1])에 다른 방법으로 그래프를 추가.

  • samsung_revenue['value'].plot(ax=axes[1])
    • pandas.Series.plot()을 사용해서 그래프를 그리고
    • ax=axes[1]를 지정하여 두 번째 서브플롯(axes[1])에 그리도록 설정.

두 번째 그래프는 pandas의 .plot()을 이용하여 자동으로 그려짐.


plt.show()

  • 위에서 만든 두 개의 그래프를 한 번에 화면에 출력.
  • plt.show()를 실행하면 그래프만 표시되고, 추가적인 객체 출력은 생략됨.

# 스타일 서식 지정
plt.style.use('ggplot')

# 그래프 객체 생성 (figure에 1개의 서브 플롯을 생성)
fig = plt.figure(figsize=(20, 5))   
ax = fig.add_subplot(1, 1, 1)

# axe 객체에 plot 함수로 그래프 출력
ax.plot(sr_one, marker='H', markerfacecolor='orange', markersize=10, 
        color='olive', linewidth=2, label='서울 -> 경기')
ax.legend(loc='best')

#y축 범위 지정 (최소값, 최대값)
ax.set_ylim(50000, 800000)

# 차트 제목 추가
ax.set_title('서울 -> 경기 인구 이동', size=20)

# 축이름 추가
ax.set_xlabel('기간', size=12)
ax.set_ylabel('이동 인구수', size = 12)

# 축 눈금 위치 지정
ax.set_xticks(sr_one.index)

# 축 눈금 라벨 지정 및 75도 회전
ax.set_xticklabels(sr_one.index, rotation=75)

# 축 눈금 라벨 크기
ax.tick_params(axis="x", labelsize=10)
ax.tick_params(axis="y", labelsize=10)

plt.show()  # 변경사항 저장하고 그래프 출력