50题matplotlib从入门到精通
生活随笔
收集整理的這篇文章主要介紹了
50题matplotlib从入门到精通
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
作者:王大毛(和鯨社區(qū))
Matplotlib 是 Python 的繪圖庫。它可與 NumPy 一起使用,提供了一種有效的 MatLab 開源替代方案,也可以和圖形工具包一起使用。
雖然相比其他圖形庫(Seaborn | pyecharts | plotly | bokeh | pandas_profiling )這個庫丑丑呆呆的,甚至有點難用,但人家畢竟是開山始祖,方法全,能夠支持你各類騷操作的需求??梢哉f是現(xiàn)在 python 數(shù)據(jù)分析中,用的人最多的圖形庫了。
本文代碼可以在github下載:
https://github.com/fengdu78/Data-Science-Notes/tree/master/5.data-visualization/1.matplotlib/matplotlib50
一、導(dǎo)入
1.導(dǎo)入 matplotlib 庫簡寫為 plt
import matplotlib.pyplot as plt import numpy as np二、基本圖表
2.用 plot 方法畫出 x=(0,10)間 sin 的圖像
x = np.linspace(0, 10, 30) plt.plot(x, np.sin(x));3.用點加線的方式畫出 x=(0,10)間 sin 的圖像
plt.plot(x, np.sin(x), '-o');4.用 scatter 方法畫出 x=(0,10)間 sin 的點圖像
plt.scatter(x, np.sin(x));5.用餅圖的面積及顏色展示一組 4 維數(shù)據(jù)
rng = np.random.RandomState(0) x = rng.randn(100) y = rng.randn(100) colors = rng.rand(100) sizes = 1000 * rng.rand(100)plt.scatter(x, y, c=colors, s=sizes, alpha=0.3,cmap='viridis') plt.colorbar(); # 展示色階6.繪制一組誤差為 ±0.8 的數(shù)據(jù)的誤差條圖
x = np.linspace(0, 10, 50) dy = 0.8 y = np.sin(x) + dy * np.random.randn(50)plt.errorbar(x, y, yerr=dy, fmt='.k') <Container object of 3 artists>7.繪制一個柱狀圖
x = [1,2,3,4,5,6,7,8] y = [3,1,4,5,8,9,7,2] label=['A','B','C','D','E','F','G','H']plt.bar(x,y,tick_label = label);8.繪制一個水平方向柱狀圖
plt.barh(x,y,tick_label = label);9.繪制 1000 個隨機值的直方圖
data = np.random.randn(1000) plt.hist(data);10.設(shè)置直方圖分 30 個 bins,并設(shè)置為頻率分布
plt.hist(data, bins=30,histtype='stepfilled', density=True) plt.show();11.在一張圖中繪制 3 組不同的直方圖,并設(shè)置透明度
x1 = np.random.normal(0, 0.8, 1000) x2 = np.random.normal(-2, 1, 1000) x3 = np.random.normal(3, 2, 1000)kwargs = dict(alpha=0.3, bins=40, density = True)plt.hist(x1, **kwargs); plt.hist(x2, **kwargs); plt.hist(x3, **kwargs);12.繪制一張二維直方圖
mean = [0, 0] cov = [[1, 1], [1, 2]] x, y = np.random.multivariate_normal(mean, cov, 10000).T plt.hist2d(x, y, bins=30);13.繪制一張設(shè)置網(wǎng)格大小為 30 的六角形直方圖
plt.hexbin(x, y, gridsize=30);三、自定義圖表元素
14.繪制 x=(0,10)間 sin 的圖像,設(shè)置線性為虛線
x = np.linspace(0,10,100) plt.plot(x,np.sin(x),'--');15.設(shè)置 y 軸顯示范圍為(-1.5,1.5)
x = np.linspace(0,10,100) plt.plot(x, np.sin(x)) plt.ylim(-1.5, 1.5);16.設(shè)置 x,y 軸標(biāo)簽 variable x,value y
x = np.linspace(0.05, 10, 100) y = np.sin(x) plt.plot(x, y, label='sin(x)') plt.xlabel('variable x'); plt.ylabel('value y');17.設(shè)置圖表標(biāo)題“三角函數(shù)”
x = np.linspace(0.05, 10, 100) y = np.sin(x) plt.plot(x, y, label='sin(x)') plt.title('三角函數(shù)');18.顯示網(wǎng)格
x = np.linspace(0.05, 10, 100) y = np.sin(x) plt.plot(x, y) plt.grid()19.繪制平行于 x 軸 y=0.8 的水平參考線
x = np.linspace(0.05, 10, 100) y = np.sin(x) plt.plot(x, y) plt.axhline(y=0.8, ls='--', c='r')20.繪制垂直于 x 軸 x<4 and x>6 的參考區(qū)域,以及 y 軸 y<0.2 and y>-0.2 的參考區(qū)域
x = np.linspace(0.05, 10, 100) y = np.sin(x) plt.plot(x, y) plt.axvspan(xmin=4, xmax=6, facecolor='r', alpha=0.3) # 垂直x軸 plt.axhspan(ymin=-0.2, ymax=0.2, facecolor='y', alpha=0.3); # 垂直y軸21.添加注釋文字 sin(x)
x = np.linspace(0.05, 10, 100) y = np.sin(x) plt.plot(x, y) plt.text(3.2, 0, 'sin(x)', weight='bold', color='r');22.用箭頭標(biāo)出第一個峰值
x = np.linspace(0.05, 10, 100) y = np.sin(x) plt.plot(x, y) plt.annotate('maximum',xy=(np.pi/2, 1),xytext=(np.pi/2+1, 1),weight='bold',color='r',arrowprops=dict(arrowstyle='->', connectionstyle='arc3', color='r'));四、自定義圖例
23.在一張圖里繪制 sin,cos 的圖形,并展示圖例
x = np.linspace(0, 10, 1000) fig, ax = plt.subplots()ax.plot(x, np.sin(x), label='sin') ax.plot(x, np.cos(x), '--', label='cos') ax.legend();24.調(diào)整圖例在左上角展示,且不顯示邊框
ax.legend(loc='upper left', frameon=False); fig25.調(diào)整圖例在畫面下方居中展示,且分成 2 列
ax.legend(frameon=False, loc='lower center', ncol=2) fig26.繪制的圖像,并只顯示前 2 者的圖例
y = np.sin(x[:, np.newaxis] + np.pi * np.arange(0, 2, 0.5)) lines = plt.plot(x, y)# lines 是 plt.Line2D 類型的實例的列表plt.legend(lines[:2], ['first', 'second']);# 第二個方法 #plt.plot(x, y[:, 0], label='first') #plt.plot(x, y[:, 1], label='second') #plt.plot(x, y[:, 2:]) #plt.legend(framealpha=1, frameon=True);27.將圖例分不同的區(qū)域展示
fig, ax = plt.subplots()lines = [] styles = ['-', '--', '-.', ':'] x = np.linspace(0, 10, 1000)for i in range(4):lines += ax.plot(x, np.sin(x - i * np.pi / 2),styles[i], color='black') ax.axis('equal') (-0.5, 10.5, -1.1, 1.1) # 設(shè)置第一組標(biāo)簽 ax.legend(lines[:2], ['line A', 'line B'],loc='upper right', frameon=False)# 創(chuàng)建第二組標(biāo)簽 from matplotlib.legend import Legend leg = Legend(ax, lines[2:], ['line C', 'line D'],loc='lower right', frameon=False) ax.add_artist(leg);五、自定義色階
28.展示色階
x = np.linspace(0, 10, 1000) I = np.sin(x) * np.cos(x[:, np.newaxis])plt.imshow(I) plt.colorbar();29.改變配色為'gray'
plt.imshow(I, cmap='gray');30.將色階分成 6 個離散值顯示
plt.imshow(I, cmap=plt.cm.get_cmap('Blues', 6)) plt.colorbar() plt.clim(-1, 1);六、多子圖
31.在一個 1010 的畫布中,(0.65,0.65)的位置創(chuàng)建一個 0.20.2 的子圖
ax1 = plt.axes() ax2 = plt.axes([0.65, 0.65, 0.2, 0.2])32.在 2 個子圖中,顯示 sin(x)和 cos(x)的圖像
fig = plt.figure() ax1 = fig.add_axes([0.1, 0.5, 0.8, 0.4], ylim=(-1.2, 1.2)) ax2 = fig.add_axes([0.1, 0.1, 0.8, 0.4], ylim=(-1.2, 1.2))x = np.linspace(0, 10) ax1.plot(np.sin(x)); ax2.plot(np.cos(x));33.用 for 創(chuàng)建 6 個子圖,并且在圖中標(biāo)識出對應(yīng)的子圖坐標(biāo)
for i in range(1, 7):plt.subplot(2, 3, i)plt.text(0.5, 0.5, str((2, 3, i)),fontsize=18, ha='center')# 方法二 # fig = plt.figure() # fig.subplots_adjust(hspace=0.4, wspace=0.4) # for i in range(1, 7): # ax = fig.add_subplot(2, 3, i) # ax.text(0.5, 0.5, str((2, 3, i)),fontsize=18, ha='center')34.設(shè)置相同行和列共享 x,y 軸
fig, ax = plt.subplots(2, 3, sharex='col', sharey='row')35.用[]的方式取出每個子圖,并添加子圖座標(biāo)文字
for i in range(2):for j in range(3):ax[i, j].text(0.5, 0.5, str((i, j)), fontsize=18, ha='center') fig36.組合繪制大小不同的子圖,樣式如下
Image Name
grid = plt.GridSpec(2, 3, wspace=0.4, hspace=0.3) plt.subplot(grid[0, 0]) plt.subplot(grid[0, 1:]) plt.subplot(grid[1, :2]) plt.subplot(grid[1, 2]);37.顯示一組二維數(shù)據(jù)的頻度分布,并分別在 x,y 軸上,顯示該維度的數(shù)據(jù)的頻度分布
mean = [0, 0] cov = [[1, 1], [1, 2]] x, y = np.random.multivariate_normal(mean, cov, 3000).T# Set up the axes with gridspec fig = plt.figure(figsize=(6, 6)) grid = plt.GridSpec(4, 4, hspace=0.2, wspace=0.2) main_ax = fig.add_subplot(grid[:-1, 1:]) y_hist = fig.add_subplot(grid[:-1, 0], xticklabels=[], sharey=main_ax) x_hist = fig.add_subplot(grid[-1, 1:], yticklabels=[], sharex=main_ax)# scatter points on the main axes main_ax.scatter(x, y,s=3,alpha=0.2)# histogram on the attached axes x_hist.hist(x, 40, histtype='stepfilled',orientation='vertical') x_hist.invert_yaxis()y_hist.hist(y, 40, histtype='stepfilled',orientation='horizontal') y_hist.invert_xaxis()七、三維圖像
38.創(chuàng)建一個三維畫布
from mpl_toolkits import mplot3d fig = plt.figure() ax = plt.axes(projection='3d')39.繪制一個三維螺旋線
ax = plt.axes(projection='3d')# Data for a three-dimensional line zline = np.linspace(0, 15, 1000) xline = np.sin(zline) yline = np.cos(zline) ax.plot3D(xline, yline, zline);40.繪制一組三維點
ax = plt.axes(projection='3d') zdata = 15 * np.random.random(100) xdata = np.sin(zdata) + 0.1 * np.random.randn(100) ydata = np.cos(zdata) + 0.1 * np.random.randn(100) ax.scatter3D(xdata, ydata, zdata, c=zdata, cmap='Greens');八、寶可夢數(shù)據(jù)集可視化
41.展示前 5 個寶可夢的 Defense,Attack,HP 的堆積條形圖
import pandas as pd df = pd.read_csv('Pokemon.csv') pokemon = df['Name'][:5] hp = df['HP'][:5] attack = df['Attack'][:5] defense = df['Defense'][:5] ind = [x for x, _ in enumerate(pokemon)]plt.figure(figsize=(10,10)) plt.bar(ind, defense, width=0.8, label='Defense', color='blue', bottom=attack+hp) plt.bar(ind, attack, width=0.8, label='Attack', color='gold', bottom=hp) plt.bar(ind, hp, width=0.8, label='Hp', color='red')plt.xticks(ind, pokemon) plt.ylabel("Value") plt.xlabel("Pokemon") plt.legend(loc="upper right") plt.title("5 Pokemon Defense & Attack & Hp") plt.show()42.展示前 5 個寶可夢的 Attack,HP 的簇狀條形圖
N = 5 pokemon_hp = df['HP'][:5] pokemon_attack = df['Attack'][:5]ind = np.arange(N) width = 0.35 plt.bar(ind, pokemon_hp, width, label='HP') plt.bar(ind + width, pokemon_attack, width,label='Attack')plt.ylabel('Values') plt.title('Pokemon Hp & Attack')plt.xticks(ind + width / 2, (df['Name'][:5]),rotation=45) plt.legend(loc='best') plt.show()43.展示前 5 個寶可夢的 Defense,Attack,HP 的堆積圖
x = df['Name'][:4] y1 = df['HP'][:4] y2 = df['Attack'][:4] y3 = df['Defense'][:4]labels = ["HP ", "Attack", "Defense"]fig, ax = plt.subplots() ax.stackplot(x, y1, y2, y3) ax.legend(loc='upper left', labels=labels) plt.xticks(rotation=90) plt.show()44.公用 x 軸,展示前 5 個寶可夢的 Defense,Attack,HP 的折線圖
x = df['Name'][:5] y1 = df['HP'][:5] y2 = df['Attack'][:5] y3 = df['Defense'][:5]# Create two subplots sharing y axis fig, (ax1, ax2,ax3) = plt.subplots(3, sharey=True)ax1.plot(x, y1, 'ko-') ax1.set(title='3 subplots', ylabel='HP')ax2.plot(x, y2, 'r.-') ax2.set(xlabel='Pokemon', ylabel='Attack')ax3.plot(x, y3, ':') ax3.set(xlabel='Pokemon', ylabel='Defense')plt.show()45.展示前 15 個寶可夢的 Attack,HP 的折線圖
plt.plot(df['HP'][:15], '-r',label='HP') plt.plot(df['Attack'][:15], ':g',label='Attack') plt.legend();46.用 scatter 的 x,y,c 屬性,展示所有寶可夢的 Defense,Attack,HP 數(shù)據(jù)
x = df['Attack'] y = df['Defense'] colors = df['HP']plt.scatter(x, y, c=colors, alpha=0.5) plt.title('Scatter plot') plt.xlabel('HP') plt.ylabel('Attack') plt.colorbar();47.展示所有寶可夢的攻擊力的分布直方圖,bins=10
x = df['Attack'] num_bins = 10 n, bins, patches = plt.hist(x, num_bins, facecolor='blue', alpha=0.5) plt.title('Histogram') plt.xlabel('Attack') plt.ylabel('Value') plt.show()48.展示所有寶可夢 Type 1 的餅圖
plt.figure(1, figsize=(8,8)) df['Type 1'].value_counts().plot.pie(autopct="%1.1f%%") plt.legend()49.展示所有寶可夢 Type 1 的柱狀圖
ax = df['Type 1'].value_counts().plot.bar(figsize = (12,6),fontsize = 14) ax.set_title("Pokemon Type 1 Count", fontsize = 20) ax.set_xlabel("Pokemon Type 1", fontsize = 20) ax.set_ylabel("Value", fontsize = 20)plt.show()50.展示綜合評分最高的 10 只寶可夢的系數(shù)間的相關(guān)系數(shù)矩陣
import seaborn as snstop_10_pokemon=df.sort_values(by='Total',ascending=False).head(10) corr=top_10_pokemon.corr()fig, ax=plt.subplots(figsize=(10, 6)) sns.heatmap(corr,annot=True) ax.set_ylim(9, 0) plt.show()備注:公眾號菜單包含了整理了一本AI小抄,非常適合在通勤路上用學(xué)習(xí)。
往期精彩回顧2019年公眾號文章精選適合初學(xué)者入門人工智能的路線及資料下載機器學(xué)習(xí)在線手冊深度學(xué)習(xí)在線手冊AI基礎(chǔ)下載(第一部分)備注:加入本站微信群或者qq群,請回復(fù)“加群”加入知識星球(4500+用戶,ID:92416895),請回復(fù)“知識星球”喜歡文章,點個在看
總結(jié)
以上是生活随笔為你收集整理的50题matplotlib从入门到精通的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 清华毕业生开发新特效编程语言:99 行代
- 下一篇: spark性能优化 -- spark工