学习笔记——matplotlib学习
數據可視化何其多,除了Tableau,ECharts,Matplotlib也是神器之一,將枯燥無味的數據形象直觀地展示出來,是很有成就感的事情。Matplotlib作為數據科學的的必備庫,算得上是python可視化領域的元老,更是很多高級可視化庫的底層基礎,其重要性不言而喻。本文主要學習的是matplotlib.pyplot的可視化應用
文章目錄
- 一、數據可視化類型
- 二、相關函數簡介
- 三、一些常用的基礎API
- 四、繪圖3步走
- 五、幾種常用圖表
- 1、柱狀圖
- 2、折線圖
- 3、餅圖
- 4、散點圖
- 5、氣泡圖/云圖
- 6、直方圖
- 7、雷達圖
一、數據可視化類型
二、相關函數簡介
matplotlib.pyplot是一個命令型函數集合,它可以讓人們像使用MATLAB一樣使用matplotlib。在matplotlib.pyplot庫中有plt子庫,該子庫提供了7個用于讀取和顯示的函數,17個用于繪制基礎圖表的函數、3個區域填充函數、9個坐標軸設置函數以及11個標簽與文本設置函數,具體如下表1-1~1-5所示:
表1-1 plt庫中的讀取和顯示函數| plt.legend( ) | 在繪圖區域放置繪圖標簽 |
| plt.show( ) | 顯示繪制的圖像 |
| plt.matshow( ) | 在窗口中顯示數組矩陣 |
| plt.imshow( ) | 在axes上顯示圖像 |
| plt.imsave( ) | 保存數組為圖像 |
| plt.savefig( ) | 設置圖像保存的格式 |
| plt.imread( ) | 從圖像文件中讀取數組 |
| plt. plot(x,y,label,color,width) | 根據(x,y)數組繪制直、曲線 |
| plt. box(data,notch,position) | 繪制一個箱型圖 |
| plt. bar(left,height,width,bottom) | 繪制一個條形圖 |
| plt. barh(bottom,width,height,left) | 繪制一個橫向條形圖 |
| plt. polar(theta,r) | 繪制極坐標圖 |
| plt. pie(data,exxplode) | 繪制餅圖 |
| plt. psd(x,NFFT=256,pad_to,F) | 繪制功率譜密度圖 |
| plt. specgram(x,NFFT=256,Fs) | 繪制譜圖 |
| plt. cohere(x,y,NFFT=256,Fs) | 繪制X-Y的相關性函數 |
| plt. scatter( ) | 繪制散點圖 |
| plt. step(x,y,where) | 繪制步階圖 |
| plt. hist(x,bins,normed) | 繪制直方圖 |
| plt. contour(X,Y,Z,N) | 繪制等值線 |
| plt. clines( ) | 就只垂直線 |
| plt. stem(x,y,linefmt,markerfmt,basefmt) | 繪制曲線中每個點到水平軸線的垂線 |
| plt. plot_date( ) | 繪制數據日期 |
| plt. plotfile( ) | 繪制數據后寫入文件 |
| fill(x,y,c,color) | 填充多邊形 |
| fill_between(x,y1,y2,where,color) | 填充曲線圍成的多邊形 |
| fill_betweenx(y,x1,x2,where,hold) | 填充水平線之間的區域 |
| plt. axis( ) | 獲取設置軸屬性的快捷鍵 |
| plt. xlim( ) | 設置X軸的取值范圍 |
| plt. ylim( ) | 設置Y軸的取值范圍 |
| plt. xscale( ) | 設置X軸縮放 |
| plt. yscale( ) | 設置Y軸縮放 |
| plt. autoscale( ) | 自動縮放軸視圖 |
| plt. text( ) | 為axes圖添加注釋 |
| plt. thetagrids( ) | 設置極坐標網絡 |
| plt. grid( ) | 網格顯示 |
| plt. figlegend( ) | 為全局繪圖區域放置圖注 |
| plt. xlabel( ) | 設置當前X軸的文字 |
| plt. ylabel( ) | 設置當前Y軸的文字 |
| plt. xticks( ) | 設置當前X軸刻度位置的文字和值 |
| plt. yticks( ) | 設置當前Y軸刻度位置的文字和值 |
| plt. clabel( ) | 設置等高線數據 |
| plt. get_figlabels( ) | 返回當前繪圖區域的標簽列表 |
| plt. figtext( ) | 為全局繪圖區域添加文本信息 |
| plt. title( ) | 設置標題 |
| plt. suptitle( ) | 設置總標題 |
| plt. annotate( ) | 為文本添加注釋 |
注意:均可通過help()命令查看API,用到什么查什么。
補充:
繪圖接口有2種形式,分別是面向"當前"圖的plt接口和面向對象接口,在這2種方式的相應接口中,多數接口名是一致的,例如:plt.plot()和axes.plot()、plt.legend()和axes.legend(),但也有一些不一致的接口:
plt.axes()——fig.add_axes()plt.subplot()——fig.add_subplot()plt.GridSped()——fig.add_gridspec()plt.xlabel()——axes.set_xlabel()plt.ylabel()——axes.set_ylabel()plt.xlim()——axes.set_xlim()plt.ylim()——axes.set_ylim()plt.title()——axes.set_title()對此,一方面兩類接口雖然略有區別,但也還算有規律;另一方面,在面向對象繪圖配置圖例時,有更為便捷的設置圖例接口axes.set(),其可以接收多種參數一次性完成所有配置,這也正是面向對象繪圖的強大之處。
三、一些常用的基礎API
1、解決中文亂碼,防止方塊化
plt.rcParams["font.sans-serif"]="SimHei"2、解決負號不能正常顯示的問題
plt.rcParams["axes.unicode_minus"]=False3、在jupyter notebook上面顯示圖片
%matplotlib inline4、作圖使用svg格式顯示更為清晰
%config InlineBackend.figure_format="svg"5、設置畫布
plt.figure() 創建一個全局繪圖區域 參數: num:設置圖像編號 figsize:設置圖像的寬度和高度,單位為英寸 facecolor:設置圖像的背景顏色 dpi:設置繪圖對象的分辨率 edgecplor:設置圖像的邊框顏色6、創建子圖
fig=plt.figure()fig.add_subplot(3,2,2) #3X2的第2個圖形或者plt.subplot(3,2,2) #3X2的第2個圖形四、繪圖3步走
五、幾種常用圖表
下面將介紹幾種較為常用的圖表:柱狀圖、餅圖、折線圖、散點圖、氣泡圖/云圖、雷達圖。
1、柱狀圖
柱狀圖也叫條形圖,是一種以長方形的長度為變量來表達圖形的統計報告圖,它由一系列高度不等的縱向條紋表示數據分布的情況,用來比較兩個或兩個以上的數值。
它適用于二維數據集,并且該數據集只需要(或者說“只能”更準確一些)比較其中一個維度。實現比較的手段就是利用柱狀體之間的高度差來反映數據差異,因為人的肉眼對于高度的辨識度是較高的。但是,當數據集的規模太過龐大時,柱狀體太多也會在所難免的沒有那么方便地進行比較了,所以柱狀圖一般只適用于中小規模的數據集。
柱狀圖實際上是用來表示分組(或離散)變量的可視化
API:
bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)| x | x坐標 | int,float |
| height | 條形的高度 | int,float |
| width | 寬度 | 0~1,默認0.8 |
| botton | 條形的起始位置 | 也是y軸的起始坐標 |
| align | 條形的中心位置 | “center”,"edge"邊緣 |
| color | 條形的顏色 | “r",“b”,“g”,"#123465",默認“b" |
| edgecolor | 邊框的顏色 | 同上 |
| linewidth | 邊框的寬度 | 像素,默認無,int |
| tick_label | 下標的標簽 | 可以是元組類型的字符組合 |
| log | y軸使用科學計算法表示 | bool |
| orientation | 是豎直條還是水平條 | 豎直:“vertical”,水平條:“horizontal” |
示例:
import numpy as np import matplotlib.pyplot as plt size = 5 a = np.random.random(size) b = np.random.random(size) c = np.random.random(size) d = np.random.random(size) x = np.arange(size)total_width, n = 0.8, 3 # 有多少個類型,只需更改n即可 width = total_width / n x = x - (total_width - width) / 2plt.bar(x, a, width=width, label='a') plt.bar(x + width, b, width=width, label='b') plt.bar(x + 2 * width, c, width=width, label='c') plt.legend() plt.show()結果展示:
水平條形圖
繪制方法一:使用plt.bar()
還用上的數據,參數orientation默認是’vertical’垂直,改為"horizontal"(水平)。
注意:
1、x的起始位置,水平條底部,以及長度的取值變化
2、添加標簽的時候enumerate()函數遍歷出的結果(自動加序號),以及text()函數的參數。
示例:
import numpy as np import matplotlib.pyplot as plt size = 5 a = np.random.random(size) b = np.random.random(size) c = np.random.random(size) d = np.random.random(size) x = np.arange(size)total_width, n = 0.8, 3 # 有多少個類型,只需更改n即可 width = total_width / n x = x - (total_width - width) / 2plt.bar(0,bottom=x,height=width,width=a, label='a',orientation="horizontal") plt.bar(0,bottom=x+width,height=width,width=b,label='b',orientation="horizontal") plt.bar(0,bottom=x+2*width,height=width,width=c,label='c',orientation="horizontal")plt.legend() plt.show()結果展示:
繪制方法二:使用plt.barh()
barh(y, width, height=0.8, left=None, *, align='center', **kwargs)還用上的數據,參數orientation為"horizontal"(水平)。
示例:
import numpy as np import matplotlib.pyplot as plt size = 5 a = np.random.random(size) b = np.random.random(size) c = np.random.random(size) d = np.random.random(size) x = np.arange(size)total_width, n = 0.8, 3 # 有多少個類型,只需更改n即可 width = total_width / n x = x - (total_width - width) / 2plt.barh(x, left=0,height=width,width=a,orientation="horizontal",alpha = 0.8) plt.barh(x+width, left=0,height=width,width=b,orientation="horizontal",alpha = 0.8) plt.barh(x+2*width, left=0,height=width,width=c,orientation="horizontal",alpha = 0.8) plt.legend() plt.show()結果展示:
2、折線圖
在折線圖中,我們通常更關注于每條折線的走勢(或者說“更能看出數據的走向”,所以它適用于整體趨勢比單個數據點更重要的二維數據集。而正因為它關心的是整體而非個別的點,所以當數據集的規模越大時,折線圖所呈現的整體會更加的準確。每個數據集在折線圖中僅表現為一條折線,這使得它可以同時承載多個數據集并提供比較。
API:
plt.plot(x,y,linestyle,linewidth,color,marker,markersize,markeredgecolor,markerfactcolor,label,alpha)參數:
x,y:指定折線圖的x軸/y軸的數據;linestyle:指定折線的類型,可以是實線、虛線、點虛線等,默認文實線;linewidth:指定折線的寬度marker:設置點的形狀markersize:設置點的大小markeredgecolor:設置點的邊框色markerfactcolor:設置點的填充色label:為折線圖添加標簽常用的marker風格:
“+”:十字 “O”:圓圈“*”:星型 “s”:正方形“p”:五邊形 “h”:六邊形“d”:小菱形 “D”:鉆石常用的color風格:
“b”:blue藍色 “g”:green綠色 “k”:黑色 “w”:white白色“r”:red紅色 “y”:yellow黃色“c”:cyan青色 “m”:magenta品紅示例:
import numpy as np import matplotlib.pyplot as plt plt.figure(figsize=(10,6)) x = np.arange(-2*np.pi,2*np.pi,0.01) #x = np.arange(-2*np.pi,2*np.pi,0.01) x1 = np.arange(-2*np.pi,2*np.pi,0.2) y1 = np.sin(3*x1)/x1 y2 = np.sin(2*x)/x y3 = np.sin(x)/x plt.plot(x1,y1,c='b',linestyle='--',marker='^',label="y1=sin(3*x1)/x1")#linestyle設置線的風格,marker設置點的風格 plt.plot(x,y2,c='r',linestyle='-.',label="y2=sin(2*x)/x") plt.plot(x,y3,c='g',label="y3=sin(x)/x") plt.legend() plt.show()結果展示:
3、餅圖
餅圖是一種經常被人們避免使用的圖表,因為人眼對面積的辨識度沒有像對高度那樣那么高,所以利用面積去反映數據起不到很好的作用。但是,存在即合理,當我們想要去強調某個部分占整體的比重時,用餅圖是再適合不過了。
餅圖用于表示不同分類的占比情況,通過弧度大小來對比各種分類。餅圖將一個圓餅按照分類的占比劃分成多個區塊,整個圓餅代表數據的總量,每個區塊(圓弧)表示該分類占總體的比例大小。
API:
pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, *, data=None)參數:
x:指定繪圖的數據;explode:指定餅圖某些部分的突出顯示,即呈現爆炸式;labels:為餅圖添加標簽說明,類似于圖例說明;colors:指定餅圖的填充色;autopct:自動添加百分比顯示,可以采用格式化的方法顯示;pctdistance:設置百分比標簽與圓心的距離;shadow:是否添加餅圖的陰影效果;labeldistance:設置各扇形標簽(圖例)與圓心的距離;startangle:設置餅圖的初始擺放角度;radius:設置餅圖的半徑大小;counterclock:是否讓餅圖按逆時針順序呈現;wedgeprops:設置餅圖內外邊界的屬性,如邊界線的粗細、顏色等;textprops:設置餅圖中文本的屬性,如字體大小、顏色等;center:指定餅圖的中心點位置,默認為原點frame:是否要顯示餅圖背后的圖框,如果設置為True的話,需要同時控制圖框x軸、y軸的范圍和餅圖的中心位置;示例:
import matplotlib.pyplot as pltlabels = 'A', 'B', 'C', 'D' fracs = [15, 30.55, 44.44, 10] color = 'blue','red','yellow','green' explode = [0, 0.1, 0, 0] # 0.1 凸出這部分, plt.pie(x=fracs,explode=explode, # 突出分裂的部分labels=labels, # 添加分類標簽colors=color, # 設置餅圖的自定義填充色autopct='%.1f%%', # 設置百分比的格式,這里保留一位小數pctdistance=0.6, # 設置百分比標簽與圓心的距離labeldistance = 1.15, # 設置各標簽與圓心的距離startangle = 180, # 設置餅圖的初始角度radius = 1, # 設置餅圖的半徑counterclock = False, # 是否逆時針,這里設置為順時針方向wedgeprops = {'linewidth': 1.3, 'edgecolor':'green'},# 設置餅圖內外邊界的屬性值textprops = {'fontsize':15, 'color':'k'}, # 設置文本標簽的屬性值center = (0.5,0.5), # 設置餅圖的原點frame = 0 )# 是否顯示餅圖的圖框,這里設置顯示 plt.show()結果展示:
4、散點圖
散點圖在回歸分析中的使用較多,他將序列顯示為一組點。值點在圖標表中的位置表示,類別由圖表中的不同標記表示,所以散點圖通常用于比較跨類別的聚合數據。
散點圖正是用來尋找數據集維度間的相互關系的。如果數據集規模足夠大并且維度間可能并不存在關系,我們依然可以通過散點圖來總結數據點的分布模式,得到有用的信息。
API:
scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, *, data=None, **kwargs)常用參數解釋:
x,y:表示即將繪制散點圖的數據點 s:是一個可選的參數。 c:表示的是顏色,也是一個可選項。 marker:表示的是標記的樣式,默認的是'o'。 alpha:實數,0-1之間。示例:
#導入必要的模塊 import numpy as np import matplotlib.pyplot as plt #產生測試數據 x = np.arange(1,10) y = x fig = plt.figure() ax1 = fig.add_subplot(111) #設置標題 ax1.set_title('Scatter Plot') #設置X軸標簽 plt.xlabel('X') #設置Y軸標簽 plt.ylabel('Y') #畫散點圖 ax1.scatter(x,y,c = 'r',marker = 'o') #設置圖標 plt.legend('x1') #顯示所畫的圖 plt.show()結果展示:
5、氣泡圖/云圖
氣泡圖是二維圖表展示三維(或者四維)數據集的典范,通常被看做散點圖的變種。它利用點的面積來表示第三維的數值。但是,前面提到過,人眼對面積的辨識度并不高,所以氣泡圖只能用于對第三維的展現不做精確要求的場景。
示例:
import numpy as np import matplotlib.pyplot as pltx=np.random.rand(50) y=np.random.rand(50) colors=np.random.rand(50) #顏色隨機 area=(50*np.random.rand(50))**2 #散點的大小隨機 fig=plt.figure(figsize=(10,5))plt.subplot(1,1,1) plt.scatter(x,y,s=area,marker="o",c=colors) #設置標題 plt.title("plot of scatter for x to y",fontdict={'fontsize':20,'color':'blue'},loc='center') # 設置x軸和y軸的軸標題 plt.xlabel("x for x in range(50)",fontdict={'fontsize':10,'color':'blue'}) plt.ylabel("y for y in range(50)",fontdict={'fontsize':10,'color':'blue'}) # 添加圖例 # plt.legend('xfory') # 添加數字標簽 for a,b in zip(x,y):plt.text(round(a,2),round(b,2),round(b,2),ha="center",va='top',fontdict={'fontsize':7,'color':'black'}) plt.xlim(0,1) #x軸的坐標軸取值范圍 # 給坐標A添加標注A(x10,y10) plt.annotate("A(x,y)",xy=(x[10],y[10]),fontsize=15) plt.show()結果展示:
6、直方圖
直方圖又稱質量分布圖,是一種統計報告圖。它由一系列高度不等的縱向條紋或線段表示數據分布的情況,一般用橫軸表示數據類型,用縱軸表示分布情況。
API:
hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False)參數:
x:指定要繪制直方圖的數據;bins:指定直方圖條形的個數;range:指定直方圖數據的上下界,默認包含繪圖數據的最大值和最小值;normed:是否將直方圖的頻數轉換成頻率;weights:該參數可為每一個數據點設置權重;cumulative:是否需要計算累計頻數或頻率;bottom:可以為直方圖的每個條形添加基準線,默認為0;histtype:指定直方圖的類型,默認為bar,除此還有’barstacked’,‘step’, ‘stepfilled’;align:設置條形邊界值的對其方式,默認為mid,除此還有’left’和’right’;orientation:設置直方圖的擺放方向,默認為垂直方向;rwidth:設置直方圖條形寬度的百分比;log:是否需要對繪圖數據進行log變換;color:設置直方圖的填充色;label:設置直方圖的標簽,可通過legend展示其圖例;stacked:當有多個數據時,是否需要將直方圖呈堆疊擺放,默認水平擺放;示例:
#電影時長分布分析(直方圖) import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties import matplotlibplt.rcParams['font.sans-serif'] = ['KaiTi'] # 顯示中文 x = [194,110,109,104,48,60,127,41,196,74,116,123,169,60,86,87,60,60,60,105,60,112,60,120,60,60,60,238,128,7,280,180,87,122,18,60,60,60,12,92,60,127,115,60,121,115,60,60,60,119]plt.figure() plt.hist(x,50,histtype='bar',label='電影時長',facecolor='red',alpha=0.75) plt.title('電影時長分布分析') plt.legend() plt.show()結果展示:
7、雷達圖
雷達圖可以用來表示多維(四維以上)的數據集,并且數據集的每個維度都必須是可以排序的。但它所能承載的數據點是非常有限的,當數據點過多時,并不利用數據點之間的比較。
示例:
import numpy as np import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['KaiTi'] # 顯示中文 results = [{"大學英語": 87, "高等數學": 79, "體育": 95, "計算機基礎": 92, "程序設計": 85},{"大學英語": 80, "高等數學": 90, "體育": 91, "計算機基礎": 85, "程序設計": 88}] data_length = len(results[0]) # 將極坐標根據數據長度進行等分 angles = np.linspace(0, 2*np.pi, data_length, endpoint=False) labels = [key for key in results[0].keys()] score = [[v for v in result.values()] for result in results] #為了使雷達圖一圈封閉起來,需要下面的步驟 # 使雷達圖數據封閉 score_a = np.concatenate((score[0], [score[0][0]])) score_b = np.concatenate((score[1], [score[1][0]])) angles = np.concatenate((angles, [angles[0]])) labels = np.concatenate((labels, [labels[0]])) # 設置圖形的大小 fig = plt.figure(figsize=(8, 6), dpi=100) # 新建一個子圖 這里一定要設置為極坐標格式 ax = plt.subplot(111, polar=True) # 繪制折線圖 /繪制雷達圖 ax.plot(angles, score_a, color='g') ax.plot(angles, score_b, color='b') # 添加每個特征的標簽 ax.set_thetagrids(angles*180/np.pi, labels) # 設置雷達圖的0度起始位置 ax.set_theta_zero_location('N') # 設置雷達圖的坐標刻度范圍 ax.set_rlim(0, 100) # 設置雷達圖的坐標值顯示角度,相對于起始角度的偏移量 ax.set_rlabel_position(270) ax.set_title("成績情況分析") plt.legend(["小明", "小紅"], loc='best') plt.show()結果展示:
總結
以上是生活随笔為你收集整理的学习笔记——matplotlib学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QPropertyAnimation实现
- 下一篇: Qt 设置窗口背景图片的几种方法