생각하는 감쟈

[Python] 2-5) Matplotlib 1 본문

Language/Python

[Python] 2-5) Matplotlib 1

생각하는 감쟈🥔 2023. 3. 29. 10:07

 

 

 

 12일차 (23.03.28)

 

 

 

 

라인 플롯

plt.title("plot")
plt.plot([1,4,7,13])
plt.show()
 
plt.title("x ticks")
plt.plot([10,20,30],[1,5,15])
plt.show()
 
plt.plot([10,20,30,40],[1,5,15,24],'rs--') 
plt.show()
 

'rs--' : 점 실선 스타일

 

 

 

색깔

blue -b

green - g

red - r

cyan - c

magenta - m

yellow - y

black - k

white - w

 

 

마커 : 데이터 위치 기호

 

 

선 스타일

- solid line

-- dashed line

-. das-dot line

: dotted line

 

 

기타 스타일

색 - c

선 굵기 - lw

선스타일 - ls

마커 종류 - marker

마커 크가 - ms

마커 선 색 - mec

마커 선 굵기 - mew

마커 내부 색 - mfc

 

plt.plot([10, 20, 30, 40], [1, 4, 9, 16], c="b",
         lw=5, ls="--", marker="o", ms=15, mec="g", mew=5, mfc="r")
plt.title("style")
plt.show()
 
plt.plot([10, 20, 30, 40], [1, 4, 9, 16],
         c="b", lw=5, ls="--", marker="o", ms=15, mec="g", mew=5, mfc="r")
plt.xlim(0, 50)
plt.ylim(-10, 30)
plt.show()
 

xlim / ylim : 범위 설정


틱 설정

축 상의 위치표시 지점 : 틱

틱에 써진 숫자 혹은 글자

import numpy as np
X = np.linspace(-np.pi, np.pi, 256)
C = np.cos(X)
plt.plot(X, C)
plt.xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi])
plt.yticks([-1, 0, +1])
plt.show()
 

np.linspace(-np.pi, np.pi, 256) : -3.14 3.14에서 256개를 뽑아서 x에 넘겨주기

 

X = np.linspace(-np.pi, np.pi, 256)
C = np.cos(X)
plt.plot(X, C)
plt.xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi],
           [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
plt.yticks([-1, 0, 1], ["Low", "Zero", "High"])
plt.show()
 

LaTeX 문자열로 tiok label 정의

$$사이에 LaTex 수학 문자식 사용

 

 

 

그리드 설정

import numpy as np
X = np.linspace(-np.pi, np.pi, 256)
C = np.cos(X)
plt.plot(X, C)
plt.xticks([-np.pi, -np.pi / 2, 0, np.pi / 2, np.pi],
           [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
plt.yticks([-1, 0, 1], ["Low", "Zero", "High"])
plt.grid(True)
plt.show()
 

plt.grid(True) 그리드 제거

 

 

여러개의 선 그리기

t = np.arange(0., 5., 0.2)
plt.plot(t, t, 'r--', t, 0.5 * t**2, 'bs:', t, 0.2 * t**3, 'g^-')
plt.show()
 

 

 

겹쳐 그리기

plt.plot([1, 4, 9, 16],
         c="b", lw=5, ls="--", marker="o", ms=15, mec="g", mew=5, mfc="r")
#plt.hold(True)
plt.plot([9, 16, 4, 1],
         c="k", lw=3, ls=":", marker="s", ms=10, mec="m", mew=5, mfc="c")
#plt.hold(False)
plt.show()
 

복수의 plot 명령을 한 그림에서 표현

plt.hold(True) / plt.hold(False): 1.5 버전에서는 이 코드 필요

 

 

범례

 

0 : best

1 : upper right

2 : uuper left

3 : lower left

4 : lower right

5 : right

6 : center left

7 : center right

8 : lower center

9 : upper center

10 : center

X = np.linspace(-np.pi, np.pi, 256)
C, S = np.cos(X), np.sin(X)
plt.plot(X, C, ls="--",label="cosine")
plt.plot(X, S, ls=":",label="sine")
plt.legend(loc=2)
plt.grid(True)
plt.show()
 

 

x,y 축 라벨, 타이틀

X = np.linspace(-np.pi, np.pi, 256)
C, S = np.cos(X), np.sin(X)
plt.plot(X, C, label="cosine")
plt.legend(loc=2)
plt.xlabel("time")
plt.ylabel("amplitude")
plt.title("Cosine Plot")
plt.show()
 

연습문제)

 

여러가지 함수를 사용하여 아래 조건에 맞는 그래프를 그린다

1 xlabel,ylabel,title을 모두 갖는다

2 하나의 figure에3개 이상의 plot을 그린다

3 각 plot는 다른 선, 마크, 색 스타일을 갖는다.

4 legend는 그래프와 겹치지 않는 곳에 위치 시킨다

 

plt.plot([1, 4, 9, 16],
         c="b", lw=5, ls="-", marker="o", ms=15, mec="g", mew=5, mfc="k", label="s")
plt.plot([2, 0, 16, 7],
         c="r", lw=5, ls="--", marker="+", ms=15, mec="r", mew=5, mfc="m", label="b")
plt.plot([4, 10, 3, 9],
         c="y", lw=5, ls="-.", marker=">", ms=15, mec="k", mew=5, mfc="g", label="x")

plt.legend(loc=2)

plt.xlabel("x plot")
plt.ylabel("y plot")
plt.title("plot ex1")
plt.show()
 

figure

 

figure객체

figure 명령을 명시적으로 사요하는 경우는 여러개의 윈도우를 동시에 뛰어야 하거나

lineplot이 아는 경우, jupiter 노트북 등에서 line plot의 경우 그림의 크기를 설정하고 싶을 떄

 

figure의 구성

matplotilib 에서 그래프를 figure 객체내의 존재

즉, 그래프를 그리려면 figure 함수를 사용해 객체를 생성해야함(캔버스)

figure 갹체에 Axes 객체(또는 subplot)를 생성 ( 하나의 plot)

Axis는 가로축이나 세로축을 의미

np.random.seed(0)
f1 = plt.figure(figsize=(10, 2))
plt.title("figure size : (10, 2)")
plt.plot(np.random.randn(100))
plt.show()
 

 

x1 = np.linspace(0.0, 5.0)
x2 = np.linspace(0.0, 2.0)

y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)
y2 = np.cos(2 * np.pi * x2)

ax1 = plt.subplot(2, 1, 1)#row, column, index
plt.plot(x1, y1, 'yo-')
plt.title('A tale of 2 subplots')
plt.ylabel('Damped oscillation')

ax2 = plt.subplot(2, 1, 2)
plt.plot(x2, y2, 'r.-')
plt.xlabel('time (s)')
plt.ylabel('Undamped')

plt.tight_layout()#플롯간의 간격을 자동으로 맞춤
plt.show()
 

 

np.random.seed(0)

plt.subplot(221)    # 2행 2열 짜리 첫번재 표 ','없으면 연속적인 값
plt.plot(np.random.rand(5))
plt.title("axes 1")

plt.subplot(222)
plt.plot(np.random.rand(5))
plt.title("axes 2")

plt.subplot(223)
plt.plot(np.random.rand(5))
plt.title("axes 3")

plt.subplot(224)
plt.plot(np.random.rand(5))
plt.title("axes 4")

plt.tight_layout()
plt.show()
 
fig, axes = plt.subplots(2, 2)

np.random.seed(0)
axes[0, 0].plot(np.random.rand(5))
axes[0, 0].set_title("axes 1")
axes[0, 1].plot(np.random.rand(5))
axes[0, 1].set_title("axes 2")
axes[1, 0].plot(np.random.rand(5))
axes[1, 0].set_title("axes 3")
axes[1, 1].plot(np.random.rand(5))
axes[1, 1].set_title("axes 4")

plt.tight_layout()
plt.show()
 

 

Axis 객체와 축

하나의 Axes객체는 두개 이상의 Axis객체를 갖음

여러 플롯을 하나의 AXes객체에 표시할때 y값의 크기가 달라서 표사하기 힘듬

twinx 사용

fig, ax0 = plt.subplots()
ax1 = ax0.twinx()#x축만 공유하고 y축은 따로씀
ax0.plot([10, 5, 2, 9, 7], 'r-', label="y0")
ax0.set_ylabel("y0")
ax0.grid(False)
ax1.plot([100, 200, 220, 180, 120], 'g:', label="y1")
ax1.set_ylabel("y1")
ax1.grid(False)
ax0.set_xlabel("x")
plt.show()
 

 

 

 

바차트

x데이터가 카테고리 값인 경우 bar, barh명령으로 바 차트 시각화

import matplotlib as mpl
import matplotlib.pylab as plt

y = [2, 3, 1]
x = np.arange(len(y))

xlabel = ['a', 'b', 'c']
plt.title("Bar Chart")
plt.bar(x, y) #x 데이터가 카테고리 값인 경우
plt.xticks(x, xlabel)
plt.yticks(sorted(y))
plt.xlabel("abc")
plt.ylabel("count")
plt.show()
 
y = np.arange(3)
years = ['2018', '2019', '2020']
values = [100, 400, 900]
colors = ['y', 'dodgerblue', 'C2']

plt.barh(y, values, color=colors)
plt.yticks(y, years)

plt.show()
 

 

스템 플롯

바차트와 비슷하지만 폭이 없는 스템플롯

x = np.linspace(0.1, 2 * np.pi, 10)
plt.title("Stem Plot")
plt.stem(x, np.cos(x), '-.')
plt.show()
 

 

파이차트

labels = ['frog', 'pig', 'dog', 'tree']
sizes = [15, 30, 45, 10]
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']
explode = (0, 0.1, 0, 0)#중심에서 벗어나는 정도
plt.title("Pie Chart")
# startangle:시작각도,  autopct:부채꼴안에 표시되는 숫자 형식
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
        autopct='%1.1f%%', shadow=True, startangle=90)
plt.axis('equal')#원의 형태 유지
plt.show()
 

 

 

히스토리

도수분포표를 그래프로 나타낸 것으로서, 가로죽은 계급, 세로축은 도수(횟수나 개수 등)를 나타냄

np.random.seed(0)
x = np.random.randn(1000)
plt.title("Histogram")
arrays, bins, patches = plt.hist(x, bins=10)
print(arrays)
print(bins)
print(patches)
plt.show()
 
np.random.seed(0)
x = np.random.randn(1000)
plt.title("Histogram")
arrays, bins, patches = plt.hist(x, bins=10)
print(arrays)
print(bins)
print(patches)
plt.show()
 

 

스캐터 플롯

두 개의 실수 데이터 집합을 나타냄

np.random.seed(0)
#평균 0, 표준편차 1, 갯수 100
X = np.random.normal(0, 1, 100)
Y = np.random.normal(0, 1, 100)

plt.title("Scatter Plot")
plt.scatter(X, Y)
plt.show()
 
N = 30
np.random.seed(0)
#0~1사이 균일분포에서 난수생성
x = np.random.rand(N)
y1 = np.random.rand(N)
y2 = np.random.rand(N)
y3 = np.pi * (15 * np.random.rand(N))**2
plt.title("Bubble Chart")
plt.scatter(x, y1, c=y2, s=y3)
plt.show()
 

 

 

 

 

 

 

 

#ABC부트캠프 #부트캠프 #유클리드소프트 #파이썬 #고용노동부 #한국산업인력공단 #서포터즈 #python #Ai #Bigdata #cloud #대외활동 #대학생 #daily

 

'Language > Python' 카테고리의 다른 글

[Python] 3-1) 데이터 수집 및 크롤링  (0) 2023.03.30
[Python] 2-5) Matplotlib 2  (0) 2023.03.29
[Python] 2-4) Data Frame 2  (1) 2023.03.28
[Python] 2-4) Data Frame 1  (0) 2023.03.28
[Python] 2-3) Pandas Series  (1) 2023.03.27
Comments