資料可視化何其多,除了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所示:
| 函式名稱 | 函式作用 |
|---|---|
| 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"]=False
3、在jupyter notebook上面顯示圖片
%matplotlib inline
4、作圖使用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) / 2
plt.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) / 2
plt.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) / 2
plt.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 plt
labels = '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 plt
x=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 matplotlib
plt.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 plt
plt.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()
結果展示:
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/280233.html
標籤:其他
