본문 바로가기
데이터 분석/파이썬 데이터 분석가 되기+챗GPT

03장 데이터 시각화 라이브러리, 맷플롯립

by yEvery 2025. 1. 25.
import matplotlib.pyplot as plt

matplotlib 모듈의 하위 모듈인 pyplot을 import하면 그래프 작성에 필요한 기능을 일일이 호출하지 않아도 된다.

plt.xlabel('xlabel')
plt.ylabel('ylabel')

plt.legend()

plt.xlim([0,5])
plt.ylim([0, 15])

plt.xscale('linear')
plt.yscale('log')

맷플롯립으로 축 레이블, 범례, 축 범위, 축 스케일을 커스터마이징 할 수 있다.

plt.plot([1, 2, 3], [4, 4, 4], '-', label='solid')
plt.plot([1, 2, 3], [2, 2, 2], linestyle='dotted', label='dotted')

plt.plot([4, 5, 6], "b")
plt.plot([2, 3, 4], marker="s")

plt.plot([1, 2, 3], [4, 5, 6], color='violet')

선과 관련된 옵션으로는 선의 종류, 마커, 선의 색상을 커스터마이징 할 수 있다.

plt.title('subtitle')
plt.suptitle('supertitle')

제목 관련 옵션으로는 슈퍼 타이틀서브 타이틀이 있다.

그룹으로 그래프를 만들었을 때, 슈퍼타이틀은 그 그룹 전체의 제목, 서브타이틀은 각각의 그래프의 제목이다.

plt.xticks(x, years)
plt.grid(True, linestyle='--', linewidth=0.5, color='gray', alpha=0.7)
plt.text(i, value + 1, str(value), ha='center', va='bottom', color='black', fontsize=10)

그래프의 배경과 관련해서는 눈금, 그리드, 텍스트 추가가 있다.

plt.plot(pclass_survived_mean['Pclass'], pclass_survived_mean['Survived'], marker='o', linestyle='-', color='violet')

plt.bar(survived_counts.index, survived_counts, color= ['mediumorchid', 'darkviolet', 'indigo'])

bars = plt.barh(survived_counts.index, survived_counts, color=['darkturquoise', 'salmon'])
plt.axvline(x=survived_counts['male'], color='gray', linestyle='--', linewidth=1)

scatter = plt.scatter(x='Age', y='Fare', data=titanic, c=titanic['Survived'], cmap='Set2', alpha=0.7)
plt.legend(handles=scatter.legend_elements()[0], title='Survived', labels=['Not Survived', 'Survived'], loc='upper right')

plt.pie(survived_counts, labels=['Not Survived', 'Survived'], colors=['orange', 'gold'] autopct='$0.1f%%', startangle=90, shadow=True, explode=(0, 0.1))

plt.hist(titanic['Age'], bins=20, color='seagreen', edgecolor='black')

선 그래프는 특정 값에 대한 추이를 보여줄 때 유용, plot(x축값, y축값, x축 포인트, 선스타일, 색) 을 통해 그릴 수 있다. 

 

막대 그래프

  1. 수직 막대 그래프: 시계열 데이터와 같이 시간에 따른 데이터의 변화를 보여줄 때 적합, plt.bar(x축값, 막대의 높이로 나타날 값, 색상)을 통해 그릴 수 있다.
  2. 수평 막대 그래프: 두 범주 간의 차이를 수평으로 비교할 때 유용, plt.barh(y축 값으로 사용할 값, 막대의 너비로 나타날 값, 색)을 통해 그릴 수 있다. plt.axvline()을 통해 수평선을 추가하여 차이를 시각적으로 강조하는 데 도움을 줄 수 있다.

산점도 그래프두 변수 간의 관계를 시각적으로 나타내는 데 유용, 변수 간의 상관 관계, 분포, 군집 등을 파악

산점도 그래프를 그리기 전에 결측치를 제거하는 이유: 그래프의 해석이 어려워지고, 잘못된 결과를 얻을 수 있다.

plt.scatter()을 통해 그릴 수 있다. c는 색상, cmap은 컬러맵, alpha는 투명도를 나타낸다.

handles=scatter.legend_elements()[0]은 범례 핸들을 설정한다.

 

파이 차트는 전체 데이터에서 특정 요소의 비율을 시각적으로 나타내기 좋음, plt.pie()를 통해 그릴 수 있다.

autopct='%0.1f%%'는 각 범주의 백분율을 소수점 첫 번째 자리까지 표시, explode는 범주별 튀어나옴의 정도

 

히스토그램수치형 데이터의 분포를 확인하는 데 사용, plt.hist()을 통해 그릴 수 있다. bins는 구간 개수이다.

correlation_matrix = titanic.drop('PassengerId', axis=1).corr(numeric_only=True)
plt.matshow(correlation_matrix, cmap='PuRd_r')

히트맵: 2차원 데이터를 색상으로 표현하는 그래프, 행렬 형태의 데이터를 시각화 할 때 자주 사용, 값이 진할 수록 연관성이 높다. corr() 함수는 변수들 간의 상관 행렬을 계산

plt.fill_between(survived_counts.index.astype(str), survived_counts[1], color='purple', alpha=0.9, label-'Survived')

영역 채우기 그래프: 두 개의 선 또는 곡선 사이의 영역을 칠하여 강조하는 그래프, 데이터셋 간의 데이터 분포와 차이를 명확하게 시각화하는데 유용, plt.fill_between()을 통해 그릴 수 있다. 

plt.boxplot([titanic['Pclass'] == 1]['Age'],
             titanic['Pclass'] == 2]['Age'],
             titanic['Pclass'] == 3]['Age']],
             labels=['1st Class', '2nd Class', '3rd Class'])

박스 플롯: 데이터의 분포와 중앙값, 이상치를 시각적으로 나타내는 그래프

  • 박스: 데이터의 1사분위와 3사분위를 표현, 상자 내부의 가로선은 데이터의 중앙값
  • 수염: 박스플롯에서 1.5배 IQR 범위 내의 데이터 중 최소값과 최대값을 시각화
  • 이상치: 수염을 벗어난 범위에 위치한 데이터를 점으로 나타냄
violin_plot = plt.violinplot([titanic['Pclass'] == 1]['Age'],
                              titanic['Pclass'] == 2]['Age'],
                              titanic['Pclass'] == 3]['Age']],
                              showmeans=False, showmedians=True)

바이올린 플롯: 데이터 분포를 시각적으로 표현, 동일한 범주 내에서 데이터 간의 분포를 비교하거나 이상치를 탐지할 때 사용, 데이터 포인트의 밀도를 시각적으로 보여줌, 밀도 분포를 추정하는 데 활용

plt.errorbar(fare_means.index, fare_means, yerr=fare_std, fmt=]o], capsize=5, capthick=1, label='Fare')

에러 바: 통계적 불확실성 또는 편차를 시각적으로 표현, 주로 그래프나 차트에 사용하여 데이터 포인트 주변의 오차 또는 편차 범위를 표시하는 데 활용 yerr는 에러바의 길이로 사용

plt.subplot(nrow, ncols, index)

plt.subplots(nrows, ncols, sharex, sharey)

fig, ax1 = plt.subplots()
ax1.plot(x, y1, '-s', color='indigo', markersize=7, linewidth=5, alpha=0.7, label='Not Survived')
ax2.twinx()
ax2.bar(x, y2, color='deeppink', alpha=0.7, width=0.7, label='Survived')
  • 개별 서브플롯을 하나씩 생성: 새 서브플롯을 생성할 때, 인덱스로 figure 내에서의 서브플롯 위치를 지정해야 한다.
  • 개별 서브플롯을 동시에 생성: figure 내에 있는 서브플롯에 접근할 때 인덱스가 아니라 함수가 반환한 축 배열을 활용
  • 하나의 서브플롯에 여러 그래프 그리기: twinx()함수를 사용하여 하나의 x축과 두 개의 y축 이용
plt.savefig('/content/histogram.jpg', format='jpg')

그래프 저장하기: savefig() 함수 사용, savefig() 함수를 호출한 이후에 plt.show()를 호출하면 저장된 이미지가 비어 있을 수 있기 때문에 저장할 때는 plt.show()를 사용하지 않는 것이 좋다.

 

+박스플롯과 선 그래프를 twinx() 했을 때 선 그래프가 박스 플롯과 x축이 완전히 똑같게 겹쳐지지 않아 챗gpt를 통해 해결