# 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)
- 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)
- 여기서 sr_one 자체를 plt.plot()에 전달하면, Matplotlib이 내부적으로 x축과 y축을 자동으로 해석해서 그래프를 그린다.
- x축: sr_one.index
- y축: sr_one.values
- 즉, 결과적으로 그래프 모양은 위 코드와 동일하다.
- 하지만 plt.plot(sr_one)은 리턴 값이 존재하는데, matplotlib.lines.Line2D 객체를 반환한다.
3. "객체가 표시되지 않고 그림만 표시된다는 의미"
- 이 코드만 실행하면, 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은 한글지원이 안된다는것 때문에 해결을 위해서는 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축의 눈금 라벨의 글씨가 서로 겹치지 않게 충분한 공간과 눈금 라벨 의 방향을 조절하여 겹치지 않게 한다.
# 그림 사이즈 지정(가로 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() # 변경사항 저장하고 그래프 출력
'데이터 분석가:Applied Data Analytics > 판다스 데이터분석' 카테고리의 다른 글
4. Data transformation - 영국시장의 중고 자동차 가격 데이터 다루기[프로젝트] (0) | 2025.02.13 |
---|---|
3. Data transformation (0) | 2025.02.12 |
1. Data cleaning - 타이타닉 데이터 다루기 (0) | 2025.02.11 |
6장_데이터프레임의 다양한 응용(데이터프레임 합치기) (0) | 2025.02.10 |
6장_데이터프레임의 다양한 응용 (0) | 2025.02.10 |