데이터 분석/Python - pandas

[이론] 시각화 : 선/막대/산점도 그래프

toraa 2025. 1. 13. 14:15

데이터 시각화

  1. 선그래프, 막대그래프, 산점도그래프
  2. 여러개의 그래프
  3. 히스토그램, 상자그림, 히트맵
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

 
기본 그래프 작성

matplotlib, seaborn로 막대그래프, 선그래프, 산점도그래프 같은 기본적인 그래프 생성
▷ 그래프 x축과 y축에 해당될 여러 1차원구조(리스트, 배열, 시리즈등)가 x,y 의 순서와 개수에 맞게 입력

 
그래프 생성 및 기본 설정
matplotlib에는 그래프가 그려지는 표객체인 Axes와 Axes를 포함하는 그림판 객체인 Figure가 존재
figure() : 그림판(Figure) 설정
subplot() : 그림판에 표(Axes)생성
show() : 그림판을 이미지로 출력
 
figure()로 Figuere 정의, subplot()으로 Axes생성

plt.figure(figsize=(10,5))
ax = plt.subplot()
plt.show()

 
한글 폰트 설정하기

plt.rc('font', family='Malgun Gothic')
plt.rcParams['axes.unicode_minus'] = False

plt.rc()
matplotlib의 rc (runtime configuration) 설정을 변경하는 함수로, 폰트 설정을 바꿔주는 역할
’font': 폰트와 관련된 설정을 변경하겠다는 의미
family='Malgun Gothic':
matplotlib 그래프에서 텍스트(라벨, 제목, 축 등)에 사용할 폰트를 맑은 고딕(Malgun Gothic)으로 지정

plt.rcParams: matplotlib의 설정 값을 담고 있는 딕셔너리로, 특정 설정 값을 직접 변경할 수 있음
‘axes.unicode_minus':
그래프에서 마이너스 기호(−)를 설정하는 옵션
기본적으로 matplotlib는 마이너스 기호를 유니코드(−)로 출력하려고 함
하지만 한글 폰트를 사용할 때 유니코드 마이너스가 깨질 가능성이 있음
False로 설정: 유니코드 마이너스를 사용하지 않고 일반 ASCII 마이너스(-)를 사용하게 만듦


Axes 객체의 다양한 함수
set_title() : 그래프의 제목을 설정
set_xlabel() : X축의 레이블(이름)을 설정
set_ylabel() : Y축의 레이블(이름)을 설정
set_xlim() : X축 값의 범위를 설정
set_ylim() : Y축 값의 범위를 설정
set_xticks() : X축 눈금의 위치를 설정
set_yticks() : Y축 눈금의 위치를 설정
set_xticklabels() : X축 눈금의 텍스트(라벨)를 설정
set_yticklabels() : Y축 눈금의 텍스트(라벨)를 설정
grid() : 그래프의 그리드를 표시하거나 숨김
legend() : 그래프의 범례를 표시
tick_params() : X축과 Y축 눈금의 스타일(길이, 방향, 색상 등)을 설정
 

plt.figure(figsize=(10,5))
ax = plt.subplot()
ax.set_title('새로운 표', fontsize=16, fontweight="bold")
ax.set_xlabel('x축', fontsize=14)
ax.set_ylabel('y축', fontsize=14)
ax.grid(True, linestyle="--", alpha=0.7)
plt.show()

 
 

1. 막대그래프

두변수를 선택하여 matplotlib bar() 또는 seaborn barplot() 를 활용하여 막대그래프 생성
막대 그래프 표현을 위한 데이터 집계

import pandas as pd

df_gp=pd.read_csv('data/건강보험심사평가원_진료비.csv')
df_seoul = df_gp[df_gp['시도'] == '서울']
df_gb = df_seoul.groupby('시군구', as_index = False)['환자수'].sum()
df_gb

 
matplotlib의 `bar()` 함수 활용
bar() 함수로 막대그래프 생성

plt.figure(figsize=(10,5))
ax = plt.subplot()
ax.bar(x=df_gb['시군구'], height=df_gb['환자수'])
plt.show()

x인자는 범주형 데이터를 height인자에는 수치형 데이터를 설정
x축의 여러개의 데이터와 y축의 데이터를 그대로 입력해주면 됨
x축은 범주형(문자열), y축은 수치형 데이터를 넣어줌
(문자열일때 범주에 모든 문자열이 다 찍히게 되어서 겹쳐서 나올수 있음)
x와 height에 1차원 구조 넣어주기
 
x축의 라벨 회전시키기

plt.figure(figsize=(10,5))
ax = plt.subplot()
ax.bar(x=df_gb['시군구'], height=df_gb['환자수'])
ax.tick_params(axis="x", rotation=45)
plt.show()

> `rotation` 인자에 회전 각도를 설정
tick_params : 눈금의 라벨을 회전시킬수 있음 (rotatinon = n : n만큼 회전)
 
seaborn의 barplot()
barplot() 함수로 막대그래프 생성

plt.figure(figsize=(10,5))
ax = plt.subplot()
sns.barplot(data = g_sp, x = '시군구', y = '환자수', ax = ax)
ax.tick_params(axis="x", rotation=45)
plt.show()

혼자 axis를 만드는 기능은 없음 (쉽게 그리게끔 도와주는 역할)
data 인자에 DataFrame을 넣을 수있음
→ dataframe 넣으면, x,y 인자에 컬럼 이름만 입력 가능 (x,y로 무조건 통일되어 있음)
굳이 시리즈로 가지고 오지 않아도 데이터프레임에서 가져와서 설정해줌
당연히 컬럼 이름이 들어가니까 컬럼이 존재해야 에러가 나지 않음
(그룹화한 결과를 시각화할때 그룹화컬럼이 인덱스로 가니까 주의해야 함)
seaborn의 그래프 함수는 항상 인자가 x,y로 구성
ax 인자에 사용하고자 하는 Axes 객체를 입력(matplotlib에 대한 의존성)
 
수평 막대 그래프 생성
barh() 함수로 수평 막대그래프 생성

plt.figure(figsize=(6,8))
ax = plt.subplot()
ax.barh(width=df_gb['환자수'], y=df_gb['시군구'] , height=0.7)
plt.show()

막대의 길이는 너비가 됨 (width에 넣어줘야 함)
y축에 범주형 데이터 
barh()에서 height 인자는 막대의 두께를 의미
bar() 에서 width 인자는 막대의 두께를 의미
 
barplot() 함수로 수직 막대그리기

plt.figure(figsize=(6,8))
ax = plt.subplot()
sns.barplot(data = g_sp, x = '환자수', y = '시군구', ax = ax)
plt.show()

y에 범주형 넣으면 y축을 기준으로 범주형으로
x에 범주형을 넣으면 x축을 기준으로범주형으로
자동으로 수평, 수직이 설정됨


2. 선그래프

x축에 순서,시간의 개념이, y축은 그에 따른 수치형 데이터가 들어감
두 변수를 선택해서 matplotlib의 plot() 함수,
 seaborn lineplot() 함수로 선그래프 생성
- 컬럼에 날짜형이나 순서 칼럼이 들어가면 좋음

import pandas as pd
df_w=pd.read_csv('data/기상청2024.csv')
df_seoul = df_w[df_w['지점명'] == '서울']
df_seoul

 
plot() 함수로 선그래프 생성

x = df_seoul['일시']
y = df_seoul['기온(°C)']

plt.figure(figsize=(10,5))
ax = plt.subplot()
ax.plot(x, y)
plt.show()

▷ 데이터가 범주형(문자열)이면 모든 눈금을 표현해서 겹치는 현상이 발생함
plot()에 x,y축 순서대로 할당
기본적으로 시리즈같은 1차원 구조를 넣어줘야 함
 
데이터타입 날짜형 변환

x = df_seoul['일시'].astype('datetime64[ns]')
y = df_seoul['기온(°C)']

plt.figure(figsize=(10,5))
ax = plt.subplot()
ax.plot(x, y)
plt.show()

▷ astype() : 날짜는 날짜형으로 바꿔주면 좋음
(연속형, 흐름으로 인식되기 때문에 특정 날짜만 잘라서 표현됨)
 
lineplot() 함수

df_seoul['일시'] = df_seoul['일시'].astype('datetime64[ns]')
plt.figure(figsize=(10,5))
ax = plt.subplot()
sns.lineplot(data = df_seoul, x ='일시', y='습도(%)', ax=ax)
plt.show()

3. 산점도 그래프
특정데이터를 좌표에 점을 찍어 분포를 알아볼수 있음
두변수 이상을 선택하여 matplotlib scatter() 또는 seaborn scatterplot() 로 생성

df_w=pd.read_csv('data/기상청2024.csv')
df_w

 
 
scatter() 함수로 산점도 그래프 생성

plt.figure(figsize=(6,6))
ax = plt.subplot()
ax.scatter(x=df_w['습도(%)'], y=df_w['기온(°C)'], s=10)
plt.show()

▷ 산점도 분포로 두 변수간 관계를 파악할 수 있음
▷ corr()로 파악하는 것을 시각적으로 보는 느낌
 
점의 크기와 투명도 설정

x = df_w['습도(%)']
y = df_w['기온(°C)']
s = df_w['풍속(m/s)'] *10

plt.figure(figsize=(6,6))
ax = plt.subplot()
ax.scatter(x=x, y=y, s=s, alpha=0.5)
plt.show()

s : 점의 크기
alpha : 투명도(0~1)
 
scatterplot() 함수 : 산점도 그래프 생성

plt.figure(figsize=(6,6))
ax = plt.subplot()
sns.scatterplot(data=df_w, x='습도(%)', y='기온(°C)', size=10, hue='지점명', ax=ax)
plt.show()

size 인자로 점의 크기 설정(상대적)
hue 인자로 그룹별로 특정 범주형 컬럼을 입력해주면, 그 범주형안에 있는 그룹별로 다른 색상으로 지정해줌
 
relplot()함수 : 정보를 표 바깥으로

sns.relplot(kind='scatter',data=df_w, x='습도(%)', y='기온(°C)', 
            size=df_w['풍속(m/s)'] *10, 
            hue='지점명', alpha=0.5)
plt.show()