본문 바로가기

Python

Python - 시각화, 그래프(plot)

### pandas에서 시각화 
import pandas as pd
df = pd.read_excel\
('./남북한발전전력량.xlsx',engine='openpyxl') 
# .은 현재폴더 의미 없어도 됨
print(df.head())

남북한발전전력량.xlsx
0.01MB


# 0행과 5행의 정보만 1990년 이후 데이터만 가져오기 2열 이후 정보만 저장
ndf = df.iloc[[0,5],2:]
print(ndf)

# 인덱스 변경하기 [0,5] -> ['South','North']
ndf.index=["South","North"]
print(ndf)

# 열의 이름을 정수형으로 변경하기
ndf.columns = ndf.columns.map(int)
print(ndf.head())

# 선그래프 출력하기
ndf.plot()


# 열별로 선 그래프가 작성됨 => 전치행렬 (행열바꾸기)
ndf2 = ndf.T
print(ndf2)
ndf2.plot()

# 막대그래프 
ndf2.plot(kind="bar")

# 히스토그램
ndf2.plot(kind="hist")

# 산점도 
# auto-mpg.csv 파일을 읽기
df = pd.read_csv("auto-mpg.csv",header=None)
df

df.columns = ['mpg','cylinders','displacement',
              'horsepower','weight','acceleration',
              'modelyear','origin','name']

print(df)
print(df.head())
print(df.corr())
print(df[['mpg','weight']].corr())
df.plot(x='weight',y='mpg',kind='scatter')
df.plot(x='mpg',y='weight',kind='scatter')

df[['mpg','cylinders']].plot(kind='box')

##############################
# matplot 모듈을 사용하여 그래프 작성하기
##############################

시도별 전출입 인구수.xlsx
0.10MB

#시도별 전출입 인구수.xlsx 파일을 읽어서 df 저장하기
df = pd.read_excel\
    ("시도별 전출입 인구수.xlsx",engine='openpyxl')

엑셀 원본


print(df.head())

# 누락값(NaN)을 앞 데이터로 채움. 
# fillna() : 누락값 채움
df = df.fillna(method='ffill')
print(df.head())
print(df.info())

# 전출지가 서울에서 다른 지역으로 이동한 데이터만 추출하기 
mask = (df['전출지별'] =='서울특별시') & \
       (df['전입지별'] != '서울특별시')
print(mask)

# mask 값이 true인 레코드만 선택하여 df_seoul 데이터 저장 
df_seoul = df[mask]
print(df_seoul)

# df_seoul 데이터에서 전출지별 컬럼의 값은 모두 서울특별시임 
# 전출지별 컬럼을 제거하기
df_seoul.drop(["전출지별"],axis=1,inplace=True)

# 전입지별 컬럼의 이름을 전입지로 변경하기
df_seoul = df_seoul.rename(columns={"전입지별":"전입지"},inplace=True)
df_seoul

 

# 전입지 컬럼으로 index 설정하기
df_seoul.set_index('전입지',inplace=True)
print(df_seoul.head())

# 경기도로 이동한 인구 데이터만 선택하여 sr1 저장하기
sr1 = df_seoul.loc["경기도"]
print(sr1)
sr1.plot()

# matplot 라이브러리로 시각화하기 #한글 폰트 추가하기 
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties\
    (fname="c:/Windows/Fonts/malgun.ttf").get_name()
print(font_name)
rc('font',family=font_name)

plt.plot(sr1.index,sr1.values)
print(type(sr1))
plt.plot(sr1)

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

 

# 그래프 크기 지정 
plt.figure(figsize=(14,5))
plt.xticks(rotation='vertical')
plt.plot(sr1.index,sr1.values)
plt.title("서울->경기 인구 이동")
plt.xlabel('기간')
plt.ylabel('이동 인구수')
plt.legend(labels=['서울 -> 경기'],loc='best')

# 스타일 서식 지정
plt.style.use('ggplot')
plt.figure(figsize=(14,5)) 
plt.xticks(rotation='vertical',size=10)
plt.plot(sr1.index,sr1.values,marker='o',markersize=10) 
plt.title("서울->경기 인구 이동")
plt.xlabel('기간')
plt.ylabel('이동 인구수')
plt.legend(labels=['서울 -> 경기'],loc='best',fontsize=15)

# 그래프에 설명 추가하기

plt.style.use('ggplot')  
plt.figure(figsize=(14,5)) 

plt.xticks(rotation='vertical',size=20)  
plt.plot(sr1.index,sr1.values,marker='o',markersize=10) 
plt.title("서울->경기 인구 이동")
plt.xlabel('기간')
plt.ylabel('이동 인구수')
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),
)

 

# 문자 주석 추가 (위의 ggplot부터 한번에 실행해야함)

plt.annotate('인구 이동 증가(1970-1995)',
             xy=(10,450000),
             rotation=25,
             va='baseline',
             ha='center',
             fontsize=15,
             )

plt.annotate('인구 이동 감소(1995-2017)',
             xy=(40,560000),
             rotation=-11,
             va='baseline',
             ha='center',
             fontsize=15,
            )

 

# 한번에 2개의 그래프를 작성하기
fig = plt.figure(figsize=(10,10))
# 그래프가 그려지는 영역
ax1 = fig.add_subplot(2,1,1) #2행 1열 1번째
ax2 = fig.add_subplot(2,1,2) #2행 1열 2번째

ax1.plot(sr1,'o',markersize=10)
ax2.plot(sr1,'o',markersize=10,\
         markerfacecolor='green',color='olive',\
             linewidth=2,label='서울->경기')
ax2.legend(loc='best')
ax1.set_ylim(50000,800000)
ax2.set_ylim(50000,800000)
ax1.set_xticklabels(sr1.index,rotation=75)
ax2.set_xticklabels(sr1.index,rotation=75)

 

# 서울에서 '충청남도', '경상북도', '강원도'로 이동한
# 인구 데이터 
import pandas as pd 
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
rc('font',family="Malgun Gothic")
df = pd.read_excel("시도별 전출입 인구수.xlsx",engine="openpyxl",header=0)
df = df.fillna(method='ffill')
mask = (df['전출지별']=='서울특별시')
df_seoul = df[mask]
df_seoul = df_seoul.drop(["전출지별"], axis=1)
df_seoul.rename({'전입지별':'전입지'},axis=1,inplace=True)
df_seoul.set_index('전입지',inplace=True)
print(df_seoul.info())
print(df_seoul.head())

# 서울에서 '충청남도','경상북도','강원도'로 이동한 
# 인구 데이터 값만 선택.
# sr1 데이터에 저장하기
# 1970년대 데이터만 조회하기
# range(1970,1980) : 1970 ~ 1979년 까지의 숫자를 저장한 리스트
col_years = list(map(str,range(1970,1980)))
sr1 = df_seoul.loc[["충청남도","경상북도","강원도"],col_years]

print(col_years)
print(sr1)



plt.style.use("ggplot")
fig = plt.figure(figsize=(20,5))
ax = fig.add_subplot(1,1,1) #1행 #1열 1번째 그림판 

# ax 객체에 plot 함수로 그래프 출력
# col_years : x축의 값 
# sr1.loc["충청남도",:] : y축의 값
ax.plot(col_years, sr1.loc["충청남도",:], marker='o', \
        markerfacecolor = 'green', \
        markersize = 10, color = 'olive', linewidth=2, \
        label='서울 -> 충남')
ax.plot(col_years, sr1.loc["경상북도",:], marker='o', \
        markerfacecolor = 'blue', \
        markersize = 10, color = 'skyblue', linewidth=2, \
        label='서울 -> 경북')
ax.plot(col_years, sr1.loc["강원도",:], marker='o', \
        markerfacecolor = 'red', \
        markersize = 10, color = 'magenta', linewidth=2, \
        label='서울 -> 강원')
ax.legend(loc='best')
ax.set_title('서울->충남,경북,강원 인구 이동',size=20)
ax.set_xlabel('기간',size=12)
ax.set_ylabel('이동 인구수',size=12)
ax.set_xtickslabels(col_years,rotation=90)
ax.tick_params(axis='x',labelsize=10)
ax.tick_params(axis='y',labelsize=10)
plt.show()


### 2000년 이후에 서울에서 경기도, 부산광역시로 전출한 인구를 
### 그래프로 작성하기 
col_years = list(map(str,range(2000,2018)))
sr2 = df_seoul.loc[["경기도","부산광역시"],col_years]

print(col_years)
print(sr1)



plt.style.use("ggplot")
fig = plt.figure(figsize=(20,5))
ax = fig.add_subplot(1,1,1) #1행 #1열 1번째 그림판 

# ax 객체에 plot 함수로 그래프 출력
# col_years : x축의 값 
# sr1.loc["충청남도",:] : y축의 값
ax.plot(col_years, sr2.loc["경기도",:], marker='o', \
        markerfacecolor = 'green', \
        markersize = 10, color = 'olive', linewidth=2, \
        label='서울 -> 경기도')
ax.plot(col_years, sr2.loc["부산광역시",:], marker='o', \
        markerfacecolor = 'blue', \
        markersize = 10, color = 'skyblue', linewidth=2, \
        label='서울 -> 부산광역시')
ax.legend(loc='best') #가장 좋은 위치 알아서 찾아줌
ax.set_title('서울->경기도,부산광역시 인구 이동',size=20)
ax.set_xlabel('기간',size=12)
ax.set_ylabel('이동 인구수',size=12)
ax.set_xtickslabels(col_years, rotation=90)
ax.tick_params(axis='x',labelsize=10)
ax.tick_params(axis='y',labelsize=10)
plt.show()

 


# 하나의 그림판에 여러개의 그래프 작성 
# 서울에서 '충청남도', '경상북도', '강원도', '전라남도'
# 이동한 인구 데이터 값만 선택
col_years = list(map(str,range(2000,2018)))
sr2 = df_seoul.loc[["충청남도","경상북도","강원도","전라남도"],col_years]

plt.style.use("ggplot")
fig = plt.figure(figsize=(20,10))
ax1 = fig.add_subplot(2,2,1) #2행 #2열 1번째 그림판 
ax2 = fig.add_subplot(2,2,2) #2행 #2열 2번째 그림판 
ax3 = fig.add_subplot(2,2,3) #2행 #2열 3번째 그림판 
ax4 = fig.add_subplot(2,2,4) #2행 #2열 4번째 그림판 


ax1.plot(col_years, sr2.loc["충청남도",:], marker='o', \
        markerfacecolor = 'green', \
        markersize = 10, color = 'olive', linewidth=2, \
        label='서울 -> 충청남도')
ax2.plot(col_years, sr2.loc["경상북도",:], marker='o', \
        markerfacecolor = 'blue', \
        markersize = 10, color = 'skyblue', linewidth=2, \
        label='서울 -> 경상북도')
ax3.plot(col_years, sr2.loc["강원도",:], marker='o', \
        markerfacecolor = 'red', \
        markersize = 10, color = 'magenta', linewidth=2, \
        label='서울 -> 강원도')
ax4.plot(col_years, sr2.loc["전라남도",:], marker='o', \
        markerfacecolor = 'orange', \
        markersize = 10, color = 'yellow', linewidth=2, \
        label='서울 -> 전라남도')

# 범례
ax1.legend(loc="best")
ax2.legend(loc="best")
ax3.legend(loc="best")
ax4.legend(loc="best")

#차트 제목
ax1.set_title("서울->충남 인구이동",size=15)
ax2.set_title("서울->경북 인구이동",size=15)
ax3.set_title("서울->강원 인구이동",size=15)
ax4.set_title("서울->전남 인구이동",size=15)
ax1.set_xtickslabels(col_years,rotation=90)
ax2.set_xtickslabels(col_years,rotation=90)
ax3.set_xtickslabels(col_years,rotation=90)
ax4.set_xtickslabels(col_years,rotation=90)

plt.show()

# 면적 그래프(area)
# 선 그래프 작성시 선과 x 축 사이의 공간을 색으로 표시하는

sr3 = sr2.T # 행과 열 바꾸기 
plt.style.use("ggplot")
sr3.index = sr3.index.map(int) # 년도 -> 정수형으로 변환 

# 데이터 프레임의 그래프로 그래프 작성하기
# stacked = True / False 겹치는지 쌓아가는지 
# alpha = 0.2 : 투명도 / 0.5 디폴트
sr3.plot(kind="area", stacked=False, \
         alpha=0.2, figsize=(20,10))
plt.title("서울->타시도 인구이동")
plt.ylabel("인구 이동수",size=20)
plt.xlabel("기간",size=20)
plt.legend(loc="best",fontsize=15)
plt.show()

stacked=False
stacked=True


# 막대 그래프 작성하기
# 2000년 이후 서울에서 '충청남도', '경상북도', '강원도', '전라남도'로 
# 이동한 인구수
col_years = list(map(str,range(2000,2018)))
sr2 = df_seoul.loc[["충청남도","경상북도","강원도","전라남도"],col_years]

sr3 = sr2.T 
plt.style.use("ggplot")
sr3.index = sr3.index.map(int)

sr3.plot(kind='bar', figsize=(20,10), width=0.7,
         color=['orange','green','skyblue','blue'])
plt.title('서울 -> 타시도 인구 이동', size=30)
plt.ylabel('이동 인구 수', size = 20)
plt.xlabel('기간', size = 20)
plt.ylim(5000,60000)
plt.legend(loc='best', fontsize=15)
plt.show()

 

# 가로로 막대그래프 작성하기
# 서울에서 '충청남도', '경상북도', '강원도', '전라남도'로 이동한 인구수
# 합계 컬럼 생성하기
print(sr2.sum(axis=1))
sr2["합계"] = sr2.sum(axis=1)
print(sr2)

# 합계 내림차순 정렬하기
sr2.tot = sr2[["합계"]].sort_values(by="합계",ascending=True)
print(sr2.tot)

plt.style.use('ggplot')
sr2.tot.plot(kind='barh',color='cornflowerblue',width=0.5,figsize=(10,5))
plt.title('서울 -> 타시도 인구 이동')
plt.ylabel('전입지')
plt.xlabel('이동 인구 수')
plt.show()

# kind = 'barh' : 수평 막대 그래프

 

# 서울에서 '충청남도', '경상북도', '강원도', '전라남도'로 이동한 인구수 
# 단 2010 이후에 이동한 합계를 수평 막대 그래프로 작성하기
col_years = list(map(str,range(2000,2018)))
sr2 = df_seoul.loc[["충청남도","경상북도","강원도","전라남도"],col_years]
sr2["합계"] = sr2.sum(axis=1)
sr2.tot = sr2[["합계"]].sort_values(by="합계",ascending=True)

plt.style.use('ggplot')
sr2.plot(kind='barh',color='cornflowerblue',width=0.5,figsize=(10,5))
plt.title('서울 -> 타시도 인구 이동')
plt.ylabel('전입지')
plt.xlabel('이동 인구 수')
plt.show()

# 리스트 데이터를 막대그래프로 출력하기 
import matplotlib.pyplot as plt
plt.style.use("ggplot")

# x축의 레벨  
subjects = ["Oracle","R","Python","Sklearn","Tensorflow"]

# y축의 값
scores = [65,90,85,60,95]

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1) 

# ax1.bar : 막대 그래프 
# range(len()) : x축의 구분선들 
ax1.bar(range(len(subjects)), scores, align="center",color="darkblue")

# x축의 위치 아래쪽
ax1.xaxis.set_ticks_position("bottom")

# y축의 위치 왼쪽 
ax1.yaxis.set_ticks_position("left")

# x축의 레벨 부분을 설정 
plt.xticks(range(len(subjects)),subjects,rotation=0,fontsize="small")
plt.xlabel("Subjects")
plt.ylabel("Score")
plt.title("Class Score")

# 현재 plt 내용을 bar_plot.png 파일로 저장한다.
plt.savefig("bar_plot.png", dpi=400, bbox_inches="tight")
plt.show()

# 연합 막대그래프 그리기 
import pandas as pd
import matplotlib.pyplot as plt 
plt.style.use('ggplot')
plt.rcParams['axes.unicode_minus'] = False

# Excel 데이터를 데이터프레임 변환 
df = pd.read_excel('남북한발전전력량.xlsx', engine = 'openpyxl')
df = df.loc[5:9]
df.drop('전력량 (억㎾h)',axis='columns',inplace=True)
df.set_index('발전 전력별',inplace=True)
df = df.T

print(df.head())

# 증감율(변동률) 계산
# '합계' 컬럼명을 '총발전량' 컬럼명으로 변경
df = df.rename(columns={'합계':'총발전량'})
print(df.head())

# 총발전량 - 1년 컬럼 추가하기 
# df['총발전량'].shift(1) : 앞의 레코드 값을 가져오기 
df['총발전량 - 1년'] = df['총발전량'].shift(1)

# 100 / 90 => 1.1 - 1 +> 0.1 * 100 = 10.11 (증감율 계산)
df['증감율'] = ((df['총발전량'] / df['총발전량 - 1년']) -1) * 100

# 2축 그래프 그리기
# stacked=True : 두개의 그래프를 쌓아서 출력하기 
ax1 = df[['수력','화력']].plot(kind='bar', figsize=(20,10), \
                           width=0.7, stacked=True)


#ax1 도화지를 복사해서 ax2를 생성하기     
ax2 = ax1.twinx()

# 선 그래프 작성하기 
# ls = '--' : 선의 종류 
# marker : 마커 종류 (동그라미)
# markersize : 마커 사이즈
# color : 색상
ax2.plot(df.index, df.증감율, ls ='--', marker='o',markersize=20,
         color='green', label='전년대비 증감율(%)')
ax1.set_ylim(0,500)
ax2.set_ylim(-50,50)
ax1.set_xlabel('연도',size=20)
ax1.set_ylabel('전력량 (억㎾h)')
ax2.set_ylabel('전년대비 증감율(%)')
plt.title('북한 전력 발전량 (1990 ~ 2016)', size=30)
ax1.legend(loc='upper left')
ax2.legend(loc='upper right')
plt.show()

########### 히스토그램 ###########
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('classic')
df = pd.read_csv("auto-mpg.csv", header=None)
# df.columns : 컬럼명 설정 
df.columns = ['mpg','cylinders','displacement','horsepower','weight',
              'acceleration','model year','origin','name']
# df['mpg'] : 시리즈
# kind='hist' : 그래프의 종류가 히스토그램이다
# kind='area' : 그래프 종류 선 그래프(면적) 
# kind='bar' : 막대 그래프
# kind='barh' : 수평 막대 그래프 
# bins=10 : 데이터 구간을 10칸으로 설정
df['mpg'].plot(kind='hist',bins=10,color='coral',figsize=(10,5))
plt.title("Histogram")
plt.xlabel('mpg')
plt.show()

 

### 산점도 그래프 작성하기
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot') # 'ggplot' 또는 'default'로 실행 가능 

# read_csv() 함수로 df 생성
df = pd.read_csv('auto-mpg.csv', header = None)

# 열 이름 작성하기 
df.columns = ['mpg','cylinders','displacement','horsepwoer',\
              'weight','acceleration','model year','origin','name']

# 연비(mpg)와 차중(weight) 열에 대한 산점도 그리기 
# s : 점의 크기 지정 
df.plot(kind='scatter',x='weight',y='mpg',c='coral', s=20,\
        figsize=(10,5))
plt.title('Scatter Plot - mpg vs. weight')
plt.show()


### 버블 그래프 작성하기 : 산점도 
###                      3개의 변수로 지정.
###                      x축, y축, 점의 크기(cylinders)
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('default') # 'ggplot' 또는 'default'로 실행 가능 

# read_csv() 함수로 df 생성
df = pd.read_csv('auto-mpg.csv', header = None)

# 열 이름 작성하기 
df.columns = ['mpg','cylinders','displacement','horsepwoer',\
              'weight','acceleration','model year','origin','name']

# 연비(mpg)와 차중(weight) 열에 대한 산점도 그리기 
# s : 점의 크기 지정
# cylinders 개수의 상대적 비율을 계산하여 시리즈 생성 

cylinders_size = df.cylinders / df.cylinders.max() * 300
df.plot(kind='scatter',x='weight',y='mpg',c='coral',\
        figsize=(10,5), s = cylinders_size,alpha=0.3)
plt.title('Scatter Plot - mpg vs. weight')

# 색상으로 설정하기
df.plot(kind='scatter', x='weight', y='mpg', marker='+',\
        figsize=(10,5), cmap='viridis',c=cylinders_size,\
        s=50, alpha=0.3)
plt.title('Scatter Plot - mpg-weight-cylinders')
plt.savefig("./scatter.png")
plt.savefig("./scatter_transparent.png",transparent=True)
plt.show()

# 파이그래프
# 데이터 개수 카운트를 위해 값1을 가진 열을 추가
df['count'] = 1
print(df.head())
print(df.info())

# origin 컬럼의 값 : 1(USA),2(EU),3(JAPAN)
df_origin = df.groupby('origin').sum() # origin 열을 기준으로 

# df_origin["count"] : 국가별 자동차의 갯수 
print(df_origin.head())                # 그룹 연산 결과 출력 
print(df_origin)

# 제조국가(origin) 값을 실제 지역명으로 변경
df_origin.index = ['USA','EU','JAPAN']

# 제조국가(origin) 열에 대한 파이 차트 그리기 - count 열 데이터 사용
df_origin['count'].plot(kind='pie',
          figsize=(7,5),
          autopct='%1.1f%%', # 퍼센트 % 표시 
          startangle=10, #파이 조각을 나누는 시작점(각도 표시)
          colors=['chocolate','bisque','cadetblue'] #색상표시
    ) 
plt.title('Model Origin', size=20)
plt.axis('equal') # 파이 차트의 비율을 같게 (원에 가깝게) 조정 
plt.legend(labels=df_origin.index, loc='upper right') # 범례 
plt.show()

### 박스 그래프 (한 화면에 두 개의 그래프 작성)
### 세로 박스 그래프, 가로 박스 그래프
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
rc('font',family='Malgun Gothic')
plt.style.use("seaborn-poster")
plt.rcParams['axes.unicode_minus'] = False

# read_csv() 함수로 df 생성
df = pd.read_csv('auto-mpg.csv',header=None)

# 열 이름을 지정
df.columns = ['mpg','cylinders','displacement','horsepwoer',\
              'weight','acceleration','model year','origin','name']
    
fig = plt.figure(figsize=(15,5))
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)
print(df[df['origin']==3]['mpg'])

 

# vert = 가로 or 세로

ax1.boxplot(x=[df[df['origin']==1]['mpg'],
               df[df['origin']==2]['mpg'],
               df[df['origin']==3]['mpg']],
            labels=['USA','EU','JAPAN'])

ax2.boxplot(x=[df[df['origin']==1]['mpg'],
               df[df['origin']==2]['mpg'],
               df[df['origin']==3]['mpg']],
            labels=['USA','EU','JAPAN'],
            vert=False)

ax1.set_title('제조국가별 연비 분포(수직 박스 플롯)')
ax2.set_title('제조국가별 연비 분포(수평 박스 플롯)')

plt.show()

# 선형 회귀 그래프 : 산점도 선형회귀선 표시
sns.set_style('darkgrid')
fig = plt.figure(figsize=(15,5))
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)
sns.regplot(x='age',  #x축 변수
            y='fare',  #y축 변수
            data=titanic, #데이터
            ax=ax1) #axe 객체 - 1번째 그래프 
sns.regplot(x='age',
            y='fare',
            data=titanic,
            ax=ax2, #axe 객체 - 2번째 그래프 
            fit_reg=False) #회귀선 미표시

plt.show()

## 히스토그램 그래프 작성하기 
## 그래프 객체 생성 (figure)
## kde : 커널 밀도 그래프
## hist : 히스토그램 그래프
## 그래프 객체 생성 (figure)
fig = plt.figure(figsize=(15,5))
ax1 = fig.add_subplot(1,3,1)
ax2 = fig.add_subplot(1,3,2)
ax3 = fig.add_subplot(1,3,3)

# distplot
sns.distplot(titanic['fare'], ax=ax1)
# kdeplot
sns.kdeplot(x='fare',data=titanic,ax=ax2)
# histplot
sns.histplot(x='fare',data=titanic,ax=ax3)
    
# 차트 제목
ax1.set_title('titanic fare - distplot')
ax2.set_title('titanic fare - kdeplot')
ax3.set_title('titanic fare - histplot')

plt.show()

# 히트맵
sns.heatmap(table, # 데이터프레임
            annot=True, fmt='d', # 데이터 값 표시 여부, 정수형 포맷
            cmap='YlGnBu', # 컬러 맵
            linewidth=.5, # 구분 선
            cbar=False) # 컬러 바 표시
plt.show()


sns.heatmap(table, # 데이터프레임
            annot=True, fmt='d', # 데이터 값 표시 여부, 정수형 포맷
            cmap='YlGnBu', # 컬러 맵
            linewidth=.5, # 구분 선
            cbar=True) # 컬러 바 표시
plt.show()

 

# 산점도 
import pandas as pd
import numpy as np
import seaborn as sns

sns.set_style('whitegrid')
fig = plt.figure(figsize=(15,5))
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)


sns.stripplot(x='class', #x축 변수
              y='age', #y축 변수
              data=titanic, #데이터
              hue="sex", #구분 컬럼
              ax=ax1) #1번째 그래프

sns.swarmplot(x='class',
              y='age',
              data=titanic,
              hue="sex",
              ax=ax2
             )

# 차트 제목 표시
ax1.set_title('Strip Plot')
ax2.set_title('Swarm Plot')
plt.show()

# 막대 그래프
fig = plt.figure(figsize=(15,5))
ax1 = fig.add_subplot(1,3,1)
ax2 = fig.add_subplot(1,3,2)
ax3 = fig.add_subplot(1,3,3)
sns.barplot(x='sex',y='survived',data=titanic,ax=ax1)
sns.barplot(x='sex',y='survived',hue='class',\
            data=titanic,ax=ax2)
sns.barplot(x='sex',y='survived',hue='class',dodge=False,\
            data=titanic,ax=ax3)

# 차트 제목 표시
ax1.set_title("titanic survived - sex")
ax2.set_title("titanic survived - sex/class")
ax3.set_title("titanic survived - sex/class(stacked)")

 

# countplot : 막대 그래프 건수 출력
# 그래프 객체 생성(figure에 3개의 서브 플롯을 생성)
fig = plt.figure(figsize=(15,5))
ax1 = fig.add_subplot(1,3,1)
ax2 = fig.add_subplot(1,3,2)
ax3 = fig.add_subplot(1,3,3)
print(titanic["who"].head())

# 기본값
sns.countplot(x='class',palette='Set1',data=titanic,ax=ax1)

# hue 옵션에 'who' 추가
sns.countplot(x='class',hue='who',palette='Set2',\
              data=titanic, ax=ax2)

# dodge = False 옵션 추가 (축 방향으로 분리하지 않고 누적 그래프 출력)
sns.countplot(x='class',hue='who',palette='Set3',\
              dodge=False,data=titanic,ax=ax3)
    
# 차트 제목 표시
ax1.set_title('titanic class')
ax2.set_title('titanic class - who')
ax3.set_title('titanic class - who(stacked)')
plt.show()

 

# 박스 & 바이올린 그래프 

# 박스플롯 : 값의 범위

# 바이올린 :  값의 범위 + 분포
fig = plt.figure(figsize=(15,5))
ax1 = fig.add_subplot(2,3,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
ax4 = fig.add_subplot(2,2,4)

# 박스 그래프 - 기본값
sns.boxplot(x='alive',y='age',data=titanic,ax=ax1)

# 박스 그래프 - hue 추가
sns.boxplot(x='alive',y='age',hue='sex',data=titanic,ax=ax2)

# 바이올린 그래프 - 기본값
sns.violinplot(x='alive',y='age',data=titanic,ax=ax3)

# 바이올린 그래프 - 기본값
sns.violinplot(x='alive',y='age',hue='sex',data=titanic,ax=ax4)

ax2.legend(loc='upper center')
ax4.legend(loc='upper center')
plt.show()

# 조인트 그래프 - 산점도 (기본값) x,y축 데이터의 히스토그램
j1 = sns.jointplot(x="fare",y="age",data=titanic)


# 조인트 그래프 - 회귀선 
# kind='reg' : 회귀선
j2 = sns.jointplot(x="fare",y="age",kind='reg',\
                   data=titanic)


# 조인트 그래프 - 육각그래프 
j3 = sns.jointplot(x="fare",y="age",kind='hex',\
                   data=titanic)


# 조인트 그래프 - 산점도 (기본값
j4 = sns.jointplot(x="fare",y="age",kind='kde',\
                   data=titanic)
   


# 차트 제목 표시 (각각 그래프 함수 밑에 함께 입력해주면 된다.)
j1.fig.suptitle('titanic fare - scatter', size=15)
j2.fig.suptitle('titanic fare - reg', size=15)
j3.fig.suptitle('titanic fare - hex', size=15)
j4.fig.suptitle('titanic fare - kde', size=15)
plt.show()

 

### FacetGrid
# 조건에 따라 그리드 나누기
# who : man,woman,child 
# survived : 0 : 구조X, 1 : 구조O
g = sns.FacetGrid(data=titanic,col='who',row='survived')
# 그래프 적용하기

# 나이 컬럼을 기준으로 히스토그램을 표시하기
g = g.map(plt.hist, 'age')
plt.show()

 

### pairplot : 이변수 데이터 분포 그리기 
### 대각선 위치 그래프는 히스토그램으로 표시 
### 각 변수들의 산점도 출력, 
### pairplot 
### titanic 데이터셋 중에서 분석 데이터 분석하기
titanic_pair = titanic[['age','pclass','fare']]
print(titanic)

# 조건에 따라 그리드 나누기
g = sns.pairplot(titanic_pair)