생각하는 감쟈
[Python] 2-5) Matplotlib 1 본문
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 |