학회&동아리/FORZA

[FORZA STUDY] 나도코딩 - 데이터분석 및 시각화 week5

최연재 2023. 5. 21. 12:31

📍기본 설정

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family'] = 'Malgun Gothic' # Windows, Mac일 때는 AppleGothic
#matplotlib.rcParams['font.family'] = 'HYGungSo-Bold'# 궁서체
matplotlib.rcParams['font.size'] = 15 # 폰트 크기
matplotlib.rcParams['axes.unicode_minus'] = False # 한글 폰트 사용 시 마이너스 글자가 깨지는 것 방지

df = pd.read_excel('../Pandas/score.xlsx')

1. 막대 그래프 (심화)

1.1 수평으로 누운 그래프

labels = ['강백호', '서태웅', '정대만'] #이름
values = [190, 187, 184] #키

plt.barh(labels, values) #수평으로 누운 그래프
plt.xlim(175,195)

1.2 set_hatch

📌 아래 링크 참고

https://matplotlib.org/stable/gallery/shapes_and_collections/hatch_style_reference.html

 

Hatch style reference — Matplotlib 3.7.1 documentation

Note Click here to download the full example code Hatch style reference Hatches can be added to most polygons in Matplotlib, including bar, fill_between, contourf, and children of Polygon. They are currently supported in the PS, PDF, SVG, OSX, and Agg back

matplotlib.org

bar = plt.bar(labels, values)
bar[0].set_hatch('/') # ///으로 채워짐
bar[1].set_hatch('x') # xxxx
bar[2].set_hatch('..') #..

1.3 값 표시하기

bar = plt.bar(labels, values)
plt.ylim(175,195)

for idx, rect in enumerate(bar):
   plt.text(idx, rect.get_height() + 0.5, values[idx], ha= 'center', color='blue')


2. DataFrame 활용

2.0 꺾은선 그래프

plt.plot(df['지원번호'], df['키'])

plt.plot(df['지원번호'], df['영어'])
plt.plot(df['지원번호'], df['수학'])

2.1 격자 표시하기

plt.plot(df['지원번호'], df['영어'])
plt.plot(df['지원번호'], df['수학'])

plt.grid() #격자가 표시됨

plt.plot(df['지원번호'], df['영어'])
plt.plot(df['지원번호'], df['수학'])

plt.grid(axis='x')

 

plt.plot(df['지원번호'], df['영어'])
plt.plot(df['지원번호'], df['수학'])

plt.grid(axis='y', color='purple', alpha=0.2, linestyle='--', linewidth=2)


3. 누적 막대 그래프

3.1 plt.bar

plt.bar(df['이름'], df['국어'])
plt.bar(df['이름'], df['영어'])

국어점수 막대 위에 영어점수 막대가 생기기 때문에 국어점수 > 영어점수인 경우에만 두 값을 같이 볼 수 있다.

3.2 누적 막대 그래프

plt.bar(df['이름'], df['국어'])
plt.bar(df['이름'], df['영어'], bottom=df['국어']) #국어점수 위에 영어점수

plt.bar(df['이름'], df['영어'], bottom=df['국어']) #국어점수 위에 영어점수

국어점수 위에 영어점수를 쌓는다.

plt.bar(df['이름'], df['국어'])
plt.bar(df['이름'], df['영어'], bottom=df['국어']) #국어점수 위에 영어점수
plt.bar(df['이름'], df['수학'], bottom=df['국어']+df['영어'])

plt.bar(df['이름'], df['국어'], label='국어')
plt.bar(df['이름'], df['영어'], bottom=df['국어'], label='영어') #국어점수 위에 영어점수
plt.bar(df['이름'], df['수학'], bottom=df['국어']+df['영어'], label='수학')

plt.xticks(rotation=60)
plt.legend()


4. 다중 막대 그래프

4.0 np.arange

np.arange(5)
np.arange(3, 6)
np.arange(3, 6)
arr = np.arange(5)
arr
arr + 100
arr * 3

4.1 다중 막대 그래프

N = df.shape[0]
index = np.arange(N)
index

w = 0.25
plt.bar(index-w, df['국어'])
plt.bar(index, df['영어'])
plt.bar(index+w, df['수학'])

w = 0.25
plt.bar(index-w, df['국어'], width=w)
plt.bar(index, df['영어'], width=w)
plt.bar(index+w, df['수학'], width=w)

w = 0.25
plt.bar(index-w, df['국어'], width=w, label='국어')
plt.bar(index, df['영어'], width=w, label='영어')
plt.bar(index+w, df['수학'], width=w, label='수학')
plt.legend()

w = 0.25
plt.bar(index-w, df['국어'], width=w, label='국어')
plt.bar(index, df['영어'], width=w, label='영어')
plt.bar(index+w, df['수학'], width=w, label='수학')
plt.legend(ncol=3)

plt.figure(figsize=(10, 5))
plt.title('학생별 성적')
w = 0.25
plt.bar(index-w, df['국어'], width=w, label='국어')
plt.bar(index, df['영어'], width=w, label='영어')
plt.bar(index+w, df['수학'], width=w, label='수학')
plt.legend(ncol=3)
plt.xticks(index, df['이름'], rotation=60)
plt.show()


5. 원 그래프 (기본)

5.1 원 그래프

values = [1, 1, 1, 1, 1, 1]
labels = ['Python', 'Java', 'Javascript', 'C#', 'C/C++', 'ETC']

plt.pie(values, labels = labels, autopct='%.1f') #소수점 첫째 자리까지
plt.show()

values = [30, 25, 20, 13, 10, 2]
labels = ['Python', 'Java', 'Javascript', 'C#', 'C/C++', 'ETC']

plt.pie(values, labels = labels, autopct='%.1f%%', startangle=90, counterclock=False)
plt.show()

5.1 explode

values = [30, 25, 20, 13, 10, 2]
labels = ['Python', 'Java', 'Javascript', 'C#', 'C/C++', 'ETC']
explode = [0.2, 0.1, 0, 0, 0, 0]

plt.pie(values, labels=labels, explode = explode)
plt.show()

values = [30, 25, 20, 13, 10, 2]
labels = ['Python', 'Java', 'Javascript', 'C#', 'C/C++', 'ETC']
explode = [0.05]*6

plt.pie(values, labels=labels, explode = explode)
plt.show()

plt.pie(values, labels=labels, explode=explode)
plt.legend(loc=(1.2,0.3))
plt.show()

plt.pie(values, labels=labels, explode=explode)
plt.title('언어')
plt.legend(loc=(1.2,0.3), title='언어별 선호도')
plt.show()


6. 원 그래프 (심화)

6.0 기본 원 그래프

values = [30, 25, 20, 13, 10, 2]
labels = ['Python', 'Java', 'Javascript', 'C#', 'C/C++', 'ETC']
colors = ['#ffadad', '#ffd6a5', '#fdffb6', '#caffbf', '#9bf6ff', '#a0c4ff']
explode = [0.05]*6

plt.pie(values, labels = labels, autopct='%.1f%%', startangle=90, counterclock=False, colors=colors, explode=explode)
plt.show()

6.1 중간이 빈 원 그래프

wedgeprops = {'width':0.6}
plt.pie(values, labels = labels, autopct='%.1f%%', startangle=90, counterclock=False, colors=colors, explode=explode, wedgeprops=wedgeprops)
plt.show()

wedgeprops = {'width':0.6, 'edgecolor':'w', 'linewidth':5}
plt.pie(values, labels = labels, autopct='%.1f%%', startangle=90, counterclock=False, colors=colors,wedgeprops=wedgeprops)
plt.show()

⭐ pctdistance : 중심으로부터 값들의 거리 

def customer_autopct(pct):
    return '{:.0f}%'.format(pct) if pct>=10 else ''
    #return ('%.1f%%' % pct) if pct >= 10 else ''
    #return '{:.1f}%'.format(pct) if pct>=10 else ''

plt.pie(values, labels = labels, autopct=customer_autopct, startangle=90, counterclock=False, colors=colors,wedgeprops=wedgeprops, pctdistance=0.7)
plt.show()

def customer_autopct(pct):
    return '{:.0f}%'.format(pct) if pct>=10 else ''
    #return ('%.1f%%' % pct) if pct >= 10 else ''
    #return '{:.1f}%'.format(pct) if pct>=10 else ''

plt.pie(values, labels = labels, autopct=customer_autopct, startangle=90, counterclock=False, colors=colors,wedgeprops=wedgeprops, pctdistance=1)
plt.show()

def customer_autopct(pct):
    return '{:.0f}%'.format(pct) if pct>=10 else ''
    #return ('%.1f%%' % pct) if pct >= 10 else ''
    #return '{:.1f}%'.format(pct) if pct>=10 else ''

plt.pie(values, labels = labels, autopct=customer_autopct, startangle=90, counterclock=False, colors=colors,wedgeprops=wedgeprops, pctdistance=0.2)
plt.show()

6.2 DataFrame 활용

grp = df.groupby('학교')
values = [grp.size()['북산고'], grp.size()['능남고']]
labels = ['북산고', '능남고']

plt.pie(values, labels=labels)
plt.title('소속 학교')
plt.show()