-
[Library] Matplotlib 베이직 - Plot, Scatter, Hist, SubplotsCodes & Programming 2021. 5. 28. 14:07
오늘은 Matplot library에서 기본 바그래프, 히스토그램 등을 연습한 내역을 업데이트 하고자 합니다.
아래는 주피터 노트북 형태인데, 아직 보기에 예쁘진 않은 것 같네요. 다음 포스팅에는 더 연습해 볼게요.
예제가 모두 익숙한 건 기분 탓이 아니고, 실제로 본적이 있으시기 때문일 겁니다. 공식 문서를 참고하여 만들었습니다.
이만한 슨생님이 안 계시더라구요 ^0^ /
#먼저 라이브러리를 불러오겠습니다.
In [ ]:
import seaborn as sns import matplotlib.pyplot as plt import numpy as np
#데이터셋을 불러와 볼게요. 펭귄데이터는 시본에서 제공하고있는 데이터 셋에 있어요.
In [ ]:
df = sns.load_dataset('penguins') df
Out[ ]:
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex 0 Adelie Torgersen 39.1 18.7 181.0 3750.0 Male 1 Adelie Torgersen 39.5 17.4 186.0 3800.0 Female 2 Adelie Torgersen 40.3 18.0 195.0 3250.0 Female 3 Adelie Torgersen NaN NaN NaN NaN NaN 4 Adelie Torgersen 36.7 19.3 193.0 3450.0 Female ... ... ... ... ... ... ... ... 339 Gentoo Biscoe NaN NaN NaN NaN NaN 340 Gentoo Biscoe 46.8 14.3 215.0 4850.0 Female 341 Gentoo Biscoe 50.4 15.7 222.0 5750.0 Male 342 Gentoo Biscoe 45.2 14.8 212.0 5200.0 Female 343 Gentoo Biscoe 49.9 16.1 213.0 5400.0 Male 344 rows × 7 columns
#기본 그래프를 그려보았습니다. Y축에는 레이블도 넣어주었어요. 그래프 위에 설명이 붙어나오는 경우가 있는데 그때는 plt.show(); 로 실행해주심 됩니다.
In [ ]:
ax = plt.axes() ax.plot([1,2,3,4]) plt.ylabel('some numbers') plt.show()
# 'r--' -- > red컬러로 -- 이 점선그래프로 만들었습니다.
In [ ]:
plt.plot([1,2,3,4], [1,4,9,16], 'r--', marker = 'o') plt.axis([0,6,0,20]) plt.show()
#세개의 다른 선 그래프를 그렸습니다.
In [ ]:
t = np.arange(0. , 5. , 0.2) t
Out[ ]:
array([0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8, 2. , 2.2, 2.4, 2.6, 2.8, 3. , 3.2, 3.4, 3.6, 3.8, 4. , 4.2, 4.4, 4.6, 4.8])
In [ ]:
plt.plot(t, t, 'r--') plt.plot(t, t**2, 'bs') plt.plot(t, 3*t, 'g^') plt.show() or plt.plot(t, t, 'r--', t, t**2, 'bs', t, 3*t, 'g^') plt.show()
#맨 위에서 불러왔던 데이터에서 숫자 몇 열만 긁어와 스캐터 플랏을 그렸습니다.
In [ ]:
df2 = df.iloc[:, 2:5] df2
Out[ ]:
bill_length_mm bill_depth_mm flipper_length_mm 0 39.1 18.7 181.0 1 39.5 17.4 186.0 2 40.3 18.0 195.0 3 NaN NaN NaN 4 36.7 19.3 193.0 ... ... ... ... 339 NaN NaN NaN 340 46.8 14.3 215.0 341 50.4 15.7 222.0 342 45.2 14.8 212.0 343 49.9 16.1 213.0 344 rows × 3 columns
In [ ]:
df2['color'] = np.random.randint(0,50,344) df2['d'] = np.abs(df2['color']) * 100 df2
Out[ ]:
bill_length_mm bill_depth_mm flipper_length_mm color d 0 39.1 18.7 181.0 18 1800 1 39.5 17.4 186.0 30 3000 2 40.3 18.0 195.0 44 4400 3 NaN NaN NaN 38 3800 4 36.7 19.3 193.0 46 4600 ... ... ... ... ... ... 339 NaN NaN NaN 35 3500 340 46.8 14.3 215.0 48 4800 341 50.4 15.7 222.0 24 2400 342 45.2 14.8 212.0 12 1200 343 49.9 16.1 213.0 39 3900 344 rows × 5 columns
In [ ]:
plt.scatter('bill_length_mm', 'bill_depth_mm', c = 'color', data = df2 ) plt.show()
#서브플랏 지정하여 그래프 그리기
In [ ]:
x = ['A', 'B', 'C'] y = [1,10,100] plt.figure(figsize =(9,3)) #figsize = plt.subplot(131) plt.bar(x,y) plt.subplot(132) plt.scatter(x,y) plt.axis() plt.subplot(133) plt.plot(x,y) plt.show()
#중간에 1
3 , 46 비어있는 공간을 두기위해 plt.setp을 사용하였습니다.
In [ ]:
lines = plt.plot([1,2,3], [1,2,3], [4,5,6], [4,5,6]) plt.setp(lines, color = 'r', linewidth = 2.0);
#plt.setp(lines)를 치면 설명들이 나오네요.
In [ ]:
plt.setp(lines)
agg_filter: a filter function, which takes a (m, n, 3) float array and a dpi value, and returns a (m, n, 3) array alpha: float or None animated: bool antialiased or aa: bool clip_box: `.Bbox` clip_on: bool clip_path: Patch or (Path, Transform) or None color or c: color contains: callable dash_capstyle: {'butt', 'round', 'projecting'} dash_joinstyle: {'miter', 'round', 'bevel'} dashes: sequence of floats (on/off ink in points) or (None, None) data: (2, N) array or two 1D arrays drawstyle or ds: {'default', 'steps', 'steps-pre', 'steps-mid', 'steps-post'}, default: 'default' figure: `.Figure` fillstyle: {'full', 'left', 'right', 'bottom', 'top', 'none'} gid: str in_layout: bool label: object linestyle or ls: {'-', '--', '-.', ':', '', (offset, on-off-seq), ...} linewidth or lw: float marker: marker style markeredgecolor or mec: color markeredgewidth or mew: float markerfacecolor or mfc: color markerfacecoloralt or mfcalt: color markersize or ms: float markevery: None or int or (int, int) or slice or List[int] or float or (float, float) path_effects: `.AbstractPathEffect` picker: float or callable[[Artist, Event], Tuple[bool, dict]] pickradius: float rasterized: bool or None sketch_params: (scale: float, length: float, randomness: float) snap: bool or None solid_capstyle: {'butt', 'round', 'projecting'} solid_joinstyle: {'miter', 'round', 'bevel'} transform: `matplotlib.transforms.Transform` url: str visible: bool xdata: 1D array ydata: 1D array zorder: float
#서브플랏을 그려주고, 그래프별 marker와 linestyle에 변형을 주었습니다.
In [ ]:
import matplotlib.pyplot as plt def f (t): return np.exp(-t) * np.cos(2*np.pi*t) t1 = np.arange(0.0, 5.0, 0.1) t2 = np.arange(0.0, 5.0, 0.02) plt.figure() plt.subplot(211) plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k') #뒤에 애 빼보기 plt.subplot(212) plt.plot(t2, np.cos(2*np.pi*t2), 'r--') plt.show()
#위와 차이점이 있다면, 위 그래프에서는 당초 axes의 수를 지정하지 않고, 211, 212와 같이 순서대로 선언하고 진행했어요.
아래 그래프는 애당초 ax2, ax2로 설정후에 진행했습니다.
In [ ]:
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) fig, (ax1, ax2) = plt.subplots(2, sharey= True) ax1.plot(x1,y1,'bo-') ax1.set(title = ' 2 polots :)', ylabel = 'Plot 1') ax2.plot(x2, y2, 'r.-') ax2.set(xlabel = 'Time', ylabel = 'Plot 2') plt.show()
#figure와 ax의 차이 예시입니다. figure를 여러개 설정해주어 그래프를 그릴수 있고, 한 figure에 여러개 ax를 추가하여 그릴수있습니다. 후자가 matplot이 선호하는 방식인 것으로 저는 이해했습니다.
In [ ]:
plt.figure(1) # the first figure plt.subplot(211) # the first subplot in the first figure plt.plot([1, 2, 3]) plt.subplot(212) # the second subplot in the first figure plt.plot([4, 5, 6]) plt.figure(2) # a second figure plt.plot([4, 5, 6]) # creates a subplot() by default plt.figure(1) # figure 1 current; subplot(212) still current plt.subplot(211) # make subplot(211) in figure1 current plt.title('Easy as 1, 2, 3') # subplot 211 title plt.show();
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:12: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance. if sys.path[0] == '':
#히스토그램을 그려보았습니다. 흥미로운 것은 $blabla$ 를 사용하여 적용해주면, 저희가 아는 수학적 기호들을 불러와주네요.
In [ ]:
mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) n, bins, patches = plt.hist(x, 50, density = 1, facecolor = 'g', alpha = .75) #bins 의 갯수 = 50 plt.text(60, .025, r'$\mu=100,\ \sigma=15$') #위치 포인트 x,y - 적을 내용 순 plt.axis([40,160,0,0.03]) plt.grid(True) plt.show()
#annotate를 실행했습니다. plt.annotate(적을 말, 포인트 좌표, 텍스트가 들어갈 좌표, 화살표 속성) 순으로 적어주면 됩니다. 다른 파라미터 ? 를 더 애드할 수 있겠네요.
In [ ]:
ax = plt.subplot() t = np.arange(0.0, 5.0, 0.01) s = np.cos(2*np.pi*t) line, = plt.plot(t,s, lw = 2) plt.annotate('local max', xy=(2,1), xytext = (3, 1.5), arrowprops = dict(facecolor = 'black', shrink = 0.05)) plt.ylim(-2,2) plt.show()
감사합니다 :)
2021.05.28
'Codes & Programming' 카테고리의 다른 글
[Python Basic] zip()과 Dict(), enumerate() 로 리스트를 딕셔너리로 바꾸기 (0) 2021.07.22 [git/conda] 명령어 모음 (0) 2021.07.08 [Pandas/Matplotlib] 소소하지만 알면 좋은 팁 (판다스 포맷, 플랏 한글폰트 깨짐, 화질 설정 등) (0) 2021.07.01 [Kaggle] Bike Sharing Demand - 자전거 수요 예측 경진대회(RandomForestRegression) (0) 2021.06.13 [Kaggle] 경진대회 - 타이타닉 생존률 예측 (Top 21%) (0) 2021.06.11