본문 바로가기
ML 인공지능

[Python] 데이터분석을 위한 라이브러리 Matplotlib

by 딧피 2021. 11. 11.
728x90
반응형

**본 내용은 Alice 의 데이터 분석을 위한 라이브러리 과정을 수강하면서 , 직접 궁금한 것을 찾아보고 공부하며 정리한 내용임.

Matplotlib

메트플랏 라이브러리란 데이터 시각화 그래프 패키지임

- 파이썬에서 자료를 차트(chart)나 플롯(plot)으로 시각화하는 패키지 
- .plot() 함수와 .show() 함수를 활용
-  라인 플롯, 바 차트, 파이차트, 히스토그램, Box Plot, Scatter Plot 등을 비롯하여 다양한 차트와 플롯 스타일을 지원
- Matplotlib.org 갤러리 웹페이지에서 다양한 샘플 차트 참고

*matplotlib에서 pyplot으로 그래프를 그릴때, 기본 폰트는 한글 지원안함.
이때 사용할 코드

import matplotlib.font_manager as fm
fname='./NanumBarunGothic.ttf'
font = fm.FontProperties(fname = fname).get_name()
plt.rcParams["font.family"] = font


**참고! 위에서 폰트 설정에 rcParam 속성이 쓰였는데, 벡엔드에서 Runtime 생성시 그려줄 속성을 바꿀수 있다. 
이는 아래에서 다루는 내용들은 plot함수에서 style 설정해준것과 다르다.

정리하자면, 파이썬 설정에는 총 두가지 방법이 있음.

  • 1. rc parameter 설정으로 이후의 그림 전체에 적용 (백엔드, 동적)
  • 2. 인수를 사용하여 개별 텍스트 관련 명령에만 적용 (함수내 인수로 동작)

rcParam 의 구조 참고사이트
https://jrc-park.tistory.com/274

matplotlib 전체 자세히 보려면 ebook
(이 포스팅은 빠른습득 + 요약버젼이라..좀더 자세한정보 얻으려면 아래 ebook 링크 클릭 )
https://datascienceschool.net/01%20python/05.01%20%EC%8B%9C%EA%B0%81%ED%99%94%20%ED%8C%A8%ED%82%A4%EC%A7%80%20%EB%A7%B7%ED%94%8C%EB%A1%AF%EB%A6%AC%EB%B8%8C%20%EC%86%8C%EA%B0%9C.html






아래에서 총 3개 다룰예정

1. Line Plot

2. Bar Plot

3. Histogram




plt.subplots 함수 사용

fig, axes = plt.subplots(1, 2, figsize=(8, 4))  #몇행 , 몇열, 위치

#하나의 도화지에  1*2의 모양으로 그래프. 그래프를 2개 그리고, 가로로 배치.
# fig 는 도화지(figure).
# ax 는 그려질 그래프, 변수(axes).
# plot 하나를 subplot 이라 함.

#마지막 정리를 할떄 tight_layout()함수를 함께 사용하면,subplot으로  자동으로 레이아웃을 맞춰줌.



공통

속성(linestyle, marker, color) 값

 

Line Styles

기호의미

- 실선
대시 선
-. 대시 점 선
: 점선

Markers

기호의미

. , 픽셀
o s 사각형
v, <, ^, > 삼각형 1, 2, 3, 4 삼각선
p 오각형 H, h 육각형

 


1. Line plot

fig, ax = pl.subplots() #1ro

x=np.arange(15) #0~14

y=x**2. #x의 제곱 , x의 세제곱을 표현하고 싶으면 ***3

ax.plot(

    x,y

    linestyle=":",

    maker="*"

    color="#524FA1" #rbg 16진수

)

 

## x축이 0~14까지의 수이고 y의 춝이 x의 2제곱인 선그래프가 그려짐.

 

- Line plot

x= np.arage(10)

fig, ax = plt.subplots()

 

#solid ()

ax.plot(x, x, linestylee="-") 

 

#dashed

ax.plot(x, x+2, linestyelee="--") # x값이 1씩 커질떄 y축은 2씩 커짐. 위의 solid 그래프와 2의 간격을 두고, -- 형태로 그림.

 

#dashdot

ax.plot(x, x+4, linestyle="-.") # dashed그래프에서 2만큼 위에 그래프를 그림. 선의 형태는 -. 그림.

 

#dotted

ax.plot(x, x+6, linestyle=":") # dashdot그랠프와 2만큼 위에 그려짐. 선의 형태는 : 인데, 이때 : 은 누운모양 . . . . 처럼. 

 

 

Color

컬러를 쓰는 방법은 다양하다.

 

ax.plot(x, x, color="r") #red 의 약자

ax.plot(x, x+2, color="green") #정확한 색깔명칭

ax.plot(x, x+4, color="0.8") #gray scale이 0~1로 표현됨.

ax.plot(x, x+6, color="#C4C4C4") #웹 컬러코드

 

Marker

선그래프에서 x값에 해당하는 곳마다 marker 표시를 할 수 있음.

 

ax.plot(x, x maker=".") #dot 으로 표시

ax.plot(x, x maker="o") #dot 보다 큰 동그라미 표시

ax.plot(x, x maker="v") #화살표로 표시됨

ax.plot(x, x maker="s") #square 네모 모양으로 표시됨

ax.plot(x, x maker="*") #기호처럼 *별모양 그대로표시됨

 

 

축 경계 조정방법

 

x=np.linespace(0,10,1000) #start, end, step 포인트 / 0부터 10까지 그래프를 그리며 

fig, ax=plt.subplots()

 

ax.plot(x, np.sin(x)) # numpylib 에서는 수학계산 이용. sin(x)그래프 쓸수있음 , x값이 많을 수록 본래의 곡선형이됨.

                                  

#축세팅

ax.set_xlim(-2,12) #lim은 limit

ax.set_ylim(-1.5,1.5 )

 

더보기

## 기초수학--
#삼각함수 sin,cos,tan/ sin(x)은 1,1 구간내 반환/ 누운s 형태 그래프.
#sin 계산이 안떠오른다면.. (고>중>초등수준 설명)
#반지름 1기준, 180도 = 1 π 라디안
# sin(x) 함수의 1주기가 0~2π

# y = sin(x)

# plot 1번에 그래프 1
# 삼각함수를 토대로 x값이 0~2파이까지 네번의 반원을 돌면 한번의 주기를 완료!
# x는 라디안, x형태가 적으면 각진 형태의 sin그래프, x값이 많을 수록 본래의 곡선형이됨.



https://cosmosproject.tistory.com/253
https://rasino.tistory.com/232

https://ko.khanacademy.org/math/cc-seventh-grade-math/cc-7th-geometry/cc-7th-area-circumference/a/radius-diameter-circumference
https://ko.khanacademy.org/math/cc-seventh-grade-math/cc-7th-geometry/cc-7th-area-circumference/a/radius-diameter-circumference

https://m.blog.naver.com/incoinco/221780288173


#y=tan(x)의 그래프는 여기 https://ko.khanacademy.org/math/trigonometry/unit-circle-trig-func/graphs-of-sine-cosine-tangent/v/tangent-graph

 

 

범례 (legend)
하나의 그래프에 여러 데이터를 한 번에 그리는 경우,
각 데이터의 정보를 그래프에 함께 띄워 주는 정보박스.

- ax.legend()함수

loc  (자주 사용되는 위치 옵션)

문자형 code 문자형 code
‘best’ 0 ‘center left’ 6
‘upper right’ 1 ‘center right’ 7
‘upper left’ 2 ‘lower center’ 8
‘lower left’ 3 ‘upper center’ 9
‘lower right’ 4 ‘center’ 10
‘right’ 5 - -




x.np.arange(10)

fig, ax= plt.subplots()

ax.plot(x, x, label='y=x') # x와 y가 같다. labe은 범례를 그린 박스.

ax.plot(x, x**2, label='y=x^2')  # y는 x의 제곱이다.

ax.set_xlabel("x")

ax.set_ylabel("y")
ax.legend(loc='upper right'        #패드의 location 위치
                  shadow = True,           #패드의 그림자

                  fancybox = True,         #패드박스의 모서리를 둥글게
                  borderpad = 2              #범례를 그린 하얀색 네모(패드)의 크기
)




2.  Bar plot

axes[0]은 막대 그래프, axes[1]은 히스토그램


bar그래프
Bar그래프(막대형 차트)는 여러 값을 비교하는데 적합


x=np.arage(10) #0~9범위 
fig, ax=plt.subplots(figsize=(12,4))  #가로가 12가 높이4인 그래프.

ax.bar(x, x*2) #바그래프의 간격을 x와 y로(y는 x의 2배)

x = np.random.rand(3) # x의 바를 3개 만들자

y = np.random.rand(3) 

z = np.random.rand(3)  

 

data = [x,y,z]

fig, ax=plt.subplots()
x_ax=np.arange(3)
for i in x_ax:

            ax.bar x_ax, data[i] 
           bottom=np.sum(data[ : i], axis=0) #세개의 그래프를 합칠때 아래서부터 순서대로 쌓아올림 axis 0 기준으로 세로로.. 

ax. set_xticks(x_ax)

ax.set_xticklabels(["A","B","C"]) 각 그래프 label.

 


3. Histogram 도수 분포표

Histogram은 일정 시간 동안의 숫자 데이터 분포를 시각화 하는데 적합

fig, ax= plt.subplots()                       # figure , ax 는 plot은 subplots

data=np.random.randn(1000)         #1000개의 data 값
ax.hist(data, bins=50)                      #데이터를 넣고, 50개의 막대로 나타냄.


Matplotlib with pandas


예제 1 ) 

df = pd.read_csv("./president_heights.csv")  #데이터 불러오기
fig, ax = plt.subplots()
ax.plot(df["order"], df["height(cm)"], label="height") #x값에 가져올 데이터, y값에 가져올데이터
ax.set_xlabel("order") #x값에 이름세팅
ax.set_ylabel("height(cm)") #y값에 이름 세팅



예제 2)

df = pd.read_csv("./data/pokemon.csv")  #데이터 불러오기
fire = df[(df['Type 1']=='Fire') | ((df['Type 2'])=="Fire")] #둘중 하나라도 가지고 있으면 fire다.
water = df[(df['Type 1']=='Water') | ((df['Type 2'])=="Water")] #주의할점! 데이터의 이름! Type 과 1 사이의 띄어쓰기, 대문자
fig, ax = plt.subplots()
ax.scatter(fire['Attack'], fire['Defense’], color='R', label='Fire', marker="*", s=50)  #공격x 값, 방어y값, size는 marker크기
ax.scatter(water['Attack'], water['Defense’], color='B', label="Water", s=25) #대소문자 잘보기
ax.set_xlabel("Attack")
ax.set_ylabel("Defense")
ax.legend(loc="upper right")


 

728x90
반응형

댓글