前言
??大家好,我是向陽花,CSDN全棧領(lǐng)域新星創(chuàng)作者一枚??。
在上一節(jié)中我們講到了使用Matplotlib繪圖配置的各項配置,如果沒有看這篇文章的朋友,建議先學(xué)習(xí)這篇文章:一文搞定Matplotlib繪圖配置(大三學(xué)長的萬字筆記)
那么接下來,我們就開始使用 Matplotlib 進(jìn)行各種基礎(chǔ)圖形的繪制。此外,我們還可以參考官網(wǎng):matplotlib官網(wǎng),進(jìn)行繪制更多圖象,結(jié)合文檔學(xué)習(xí),也是程序員們的一項重要技能哦!
在繪圖之前,我們還是把相應(yīng)的包導(dǎo)入,還有配置做好:
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
# 當(dāng)瀏覽器不顯示繪圖圖片時,加上這一行
%matplotlib inline
# 讓圖片可以顯示中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 讓圖片可以顯示負(fù)號
plt.rcParams['axes.unicode_minus'] = False
# 支持svg矢量圖
%config InlineBackend.figure_format = 'svg'
一、折線圖
折線圖可以顯示隨時間(根據(jù)常用比例設(shè)置)而變化的連續(xù)數(shù)據(jù),用折線的升降來體現(xiàn)數(shù)據(jù)變化的趨勢。
下面我們來繪制折線圖。
1 - 單線
fig = plt.figure(figsize=(4,3))
# 數(shù)據(jù)
x = [2018,2019,2020,2021,2022,2023]
y = [40,30,20,80,50,60]
# 繪制折線圖
plt.plot(x,y,c='g',marker='D',markersize=3)
# 添加標(biāo)簽
plt.xlabel('年份')
plt.ylabel('報名人數(shù)')
# 添加標(biāo)題
plt.title('某活動報名人數(shù)',fontsize=10)
# 添加文本
for a,b in zip(x,y):
plt.text(
x=a+0.3,
y=b+0.5, # 根據(jù)(x,y)坐標(biāo)確定文本的位置
s=b, # 文本內(nèi)容
ha='center', # 水平對齊方式
va='center' # 垂直對齊方式
)
2 - 多線
當(dāng) plot() 函數(shù)只接收了一個數(shù)據(jù)時,那么X軸范圍是 0-N
(N是數(shù)據(jù)個數(shù))。
fig = plt.figure(figsize=(4,3))
x = np.random.randint(0,10,15)
# 當(dāng) plot() 函數(shù)只接收了一個數(shù)據(jù)時,那么X軸范圍是0-N(N是數(shù)據(jù)個數(shù))
plt.plot(x,marker='*',c='r')
# cumsum:計算X的累加和
plt.plot(x.cumsum(),marker='o',c='b')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Change Trend')
二、柱狀圖(條形圖)
柱狀圖利用柱子的高度,來反映數(shù)據(jù)的差異,也可用于比較數(shù)據(jù)的變化趨勢。條形圖和柱狀圖類似,是橫向柱狀圖。
1 - 單柱
單柱即只繪制一種顏色的柱子(只有一類數(shù)據(jù))。
# make data
x = ['C','Java','Shell','DB','Python']
y = [65,52,87,71,100]
# figure
fig = plt.figure(figsize=(4,3))
# labels
plt.xlabel('Project',fontsize=10)
plt.ylabel('Score',fontsize=10)
# add text
for a,b in zip(x,y):
plt.text(
x=a,
y=b+2,
s="{}分".format(b),
ha='center',
va='center'
)
# plot
plt.bar(x,y,width=0.5)
2 - 多柱
多柱即一次繪制多個柱狀圖,也稱為簇狀柱形圖。
fig = plt.figure(figsize=(4,3))
# make data
x = np.arange(2015,2024)
y1 = make_random()
y2 = make_random()
# 每一個柱子的寬度
# (默認(rèn)值是0.6,我們要分為兩個柱子,那么每一個柱子占0.3)
width = 0.3
# ticks
plt.xticks(x)
plt.yticks(np.arange(11))
# plot(x-width/2是將柱子往左移動)
plt.bar(x-width/2,y1,color='orange',width=width)
plt.bar(x+width/2,y2,color='green',width=width)
繪制效果如下:(因為是隨機(jī)數(shù),所以每個人繪制的效果是不一定一樣的)
3 - 堆疊
首先編寫生成隨機(jī)數(shù)的函數(shù):
def make_random():
return np.random.randint(5,10,9)
接下來繪制兩個柱狀圖:
fig = plt.figure(figsize=(4,3))
# make data
x = np.arange(2015,2024)
y1 = make_random()
y2 = make_random()
# plot
plt.bar(x,y1,color='b')
plt.bar(x,y2,color='g')
繪制結(jié)果如下:
我們會發(fā)現(xiàn),雖然現(xiàn)在柱狀圖是堆疊的,但是有些藍(lán)色部分被綠色部分完全擋住了,根本看不出來它的值是多少,所以說這樣繪制肯定是不可取的,我們需要對代碼進(jìn)行修改。
其實,要實現(xiàn)堆疊效果,就是讓第二次繪圖時,Y2軸的取值建立在Y1之上,也就是對每一個Y2+Y1
,所以我們只需要修改最后一行,加上 bottom
參數(shù),這樣即可實現(xiàn)堆疊效果。
plt.bar(x,y2,color='g',bottom=y1)
4 - 條形
條形圖是水平方向的柱狀圖,和柱狀圖繪圖方法類似,使用的是 barh()
方法。
# make data
x = ['C','Java','Shell','DB','Python']
y = [65,52,87,71,100]
# figure
fig = plt.figure(figsize=(4,3))
# labels
plt.xlabel('Project',fontsize=10)
plt.ylabel('Score',fontsize=10)
# add text
for a,b in zip(y,x):
plt.text(
x=a+5,
y=b,
s="{}分".format(a),
ha='center',
va='center'
)
# plot
plt.barh(x,y)
三、直方圖
直方圖描述的是一組數(shù)據(jù)的出現(xiàn)次數(shù)分布。直方圖有助于我們知道數(shù)據(jù)的分布情況,諸如眾數(shù)、中位數(shù)的大致位置、數(shù)據(jù)是否存在缺口或者異常值。
fig = plt.figure(figsize=(4,3))
# make data
x = np.random.randint(0,11,100) # 1-10
# plot
plt.hist(x)
plt.show() # instantly show,no print other.
此外,還可以對直方圖進(jìn)行分組。
分組的意思就是劃分區(qū)間,比如說[0-2]一組,那么在0-2范圍內(nèi)的數(shù)據(jù)都會被統(tǒng)計進(jìn)來,作為一類數(shù)據(jù)。hist()
方法的 bins
參數(shù)就是用來分組的。
fig = plt.figure(figsize=(4,3))
# make data
x = np.random.randint(0,11,100) # 1-10
# divide groups
# 劃分為4組,因為X取值范圍是0-10,所以就是0-2.5,2.5-5,5-7.5,7.5-10這四組
bins = 4
# ticks
plt.xticks(x)
# plot
plt.hist(x,bins=bins)
plt.show() # instantly show,no print other.
四、箱型圖
箱型圖,它能顯示處一組數(shù)據(jù)的最大值,最小值,中位數(shù),上下四分位數(shù)以及異常值。
1 - 單個
fig = plt.figure(figsize=(4,3))
x = [1,3,2,5,10,-10,23]
plt.boxplot(x)
plt.show()
上面的圖中即包含了各種情況,那么什么樣的數(shù)據(jù)會被判斷為異常值?
異常值(用字母 K 表示),分為中度異常(K = 1.5)和重度異常(K = 3),有一個計算方法如下。
設(shè):QL(下四分位數(shù)),QU(上四分位數(shù)),IQR(QU - QL)。那么中度異常
就是小于:
Q
L
?
1.5
I
Q
R
QL-1.5IQR
QL?1.5IQR
或者大于:
Q
U
+
1.5
I
Q
R
QU+1.5IQR
QU+1.5IQR
重度異常同理,將1.5換成3即可。
2 - 多個
一次畫多個箱型圖,只需要為 boxplot()
函數(shù)傳遞一個列表即可。
fig = plt.figure(figsize=(4,3))
x1 = np.random.randint(10,100,100)
x2 = np.random.randint(10,100,100)
x3 = np.random.randint(10,100,100)
plt.boxplot(
x = [x1,x2,x3],
notch=True, # change a style
)
plt.show() # instantly show,no print other.
五、散點(diǎn)圖
1 - 散點(diǎn)圖
散點(diǎn)圖用于在水平軸和縱軸上繪制數(shù)據(jù)點(diǎn),它表示了因變量隨自變量變化的趨勢。通俗的講,它反映Y軸變量受X軸變量的影響程度。
fig = plt.figure(figsize=(4,3))
x = range(1,7,1)
y = range(10,70,10)
plt.scatter(x,y)
2 - 氣泡圖
它與散點(diǎn)圖類似,繪制的時候,將一個變量放在橫軸,另一個變量放在縱軸,而第三個變量則表示很多泡泡的大?。ㄟ@意味著它是一個可迭代對象)。
fig = plt.figure(figsize=(4,3))
# Create a sample from the "standard normal" distribution.
data = np.random.randn(100,2)
# An array of bubble sizes
size = np.random.randint(50,200,100)
# An array of bubble colors
color = np.random.randn(100)
# plot
plt.scatter(
x=data[:,0],
y=data[:,1],
s=size,
c=color,
alpha=0.5
)
六、餅圖
1 - 餅圖
餅狀圖用來顯示一個數(shù)據(jù)系列,具體來說,餅狀圖顯示一個數(shù)據(jù)系列中各項占項目總和的百分比。
plt.figure(figsize=(4, 3))
# make data
x = np.random.randint(10,30,5)
citys = ['Beijing','Shanghai','Shenzhen','Nanjing','Guangzhou']
plt.pie(
x=x,
autopct='%.1f%%', # 顯示百分比
pctdistance=0.6, # 文字距離圓心的距離
labels=citys, # 標(biāo)簽
labeldistance=1.3, # 標(biāo)簽距離圓心的位置
textprops={'fontsize':12,'color':'black'}, # 文字樣式
explode=[0,0,0.05,0,0.09], # 分裂效果
shadow=True # 陰影效果
)
plt.show()
2 - 甜甜圈 | 空心
要繪制甜甜圈,只需要加上一個 wedgeprops
屬性即可。
甜甜圈設(shè)置的原理就是通過設(shè)置餅狀圖的餅的寬度,寬度初始值為1,此時是占滿了整個圓的,如果小于1,那么就是圓環(huán)狀了。
plt.figure(figsize=(4, 3))
# make data
x = np.random.randint(10,30,5)
citys = ['Beijing','Shanghai','Shenzhen','Nanjing','Guangzhou']
plt.pie(
x=x,
autopct='%.1f%%', # 顯示百分比
pctdistance=0.6, # 文字距離圓心的距離
labels=citys, # 標(biāo)簽
labeldistance=1.3, # 標(biāo)簽距離圓心的位置
textprops={'fontsize':12,'color':'black'}, # 文字樣式
explode=[0,0,0.05,0,0.09], # 分裂效果
shadow=True, # 陰影效果
wedgeprops={'width': 0.5,'edgecolor':'w'} # 甜甜圈設(shè)置
)
plt.show()
3 - 甜甜圈 | 實心
實心甜甜圈的原理就是,外面的圓環(huán)使用的是空心甜甜圈,里面的圓是正常畫的餅圖,只不過,里面的餅圖剛好填充了甜甜圈的內(nèi)部空白區(qū)域,通過設(shè)置 radius
可以達(dá)到,下面請看代碼示例。
plt.figure(figsize=(6, 4))
# make data
citys = ['Beijing','Shanghai','Shenzhen','Nanjing','Guangzhou']
x1 = np.random.randint(10,30,5)
x2 = np.random.randint(10,30,5)
# 第一個圓環(huán)
plt.pie(
x=x1,
autopct='%.1f%%', # 顯示百分比
pctdistance=0.6, # 文字距離圓心的距離
labels=citys, # 標(biāo)簽
labeldistance=1.3, # 標(biāo)簽距離圓心的位置
wedgeprops={'width': 0.4,'edgecolor':'w'} # 甜甜圈設(shè)置
)
# 第二個圓環(huán),用來填充空白處
plt.pie(
x=x2,
autopct='%.1f%%', # 顯示百分比
pctdistance=0.6, # 文字距離圓心的距離
radius=0.6 # 設(shè)置圓的半徑,從而使該圓剛好填充空白區(qū)域
)
plt.show()
七、面積圖
面積圖又稱為區(qū)域圖,和折線圖類似,用于強(qiáng)調(diào)Y軸隨X軸而變化的程度,可用于引起人們對總值趨勢的注意。
fig = plt.figure(figsize=(4,3))
x = [1,2,3,4,5]
y = np.random.randint(10,100,5)
# label
plt.xlabel('Month')
plt.ylabel('Score')
# title
plt.title('Score vary from month')
plt.suptitle('Super Title',y=1)
# plot
plt.stackplot(x,y)
# text
for a,b in zip(x,y):
plt.text(
x=a,
y=b+2,
s=b,
fontsize=10,
alpha=0.7,
ha='center',
va='center'
)
# instantly show
plt.show()
八、熱力圖
熱力圖是一種通過對色塊著色來顯示數(shù)據(jù)的統(tǒng)計圖表。
適用場景:
(1)熱力圖的優(yōu)勢在于“空間利用率高”,可以容納較為龐大的數(shù)據(jù)。熱力圖不僅有助于發(fā)現(xiàn)數(shù)據(jù)間的關(guān)系、找出極值,也常用于刻畫數(shù)據(jù)的整體樣貌,方便在數(shù)據(jù)集之間進(jìn)行比較(例如將每個運(yùn)動員的歷年成績都濃縮成一張熱力圖,再進(jìn)行比較)。
(2)如果將某行或某列設(shè)置為時間變量,熱力圖也可用于展示數(shù)據(jù)隨時間的變化。例如,用熱力圖來反映一個城市一年中的溫度變化,氣候的冷暖走向,一目了然。
# figure
fig = plt.figure(figsize=(4,3))
# make data
x = ["project-{}".format(i+1) for i in range(5)]
y = ['Beijing','Shanghai','Shenzhen','Nanjing','Guangzhou']
data = np.random.randint(1000,6000,(5,5))
# ticks
plt.xticks(ticks=range(len(x)),labels=x,rotation=45)
plt.yticks(ticks=range(len(citys)),labels=citys)
# add text
for i in range(len(x)):
for j in range(len(y)):
plt.text(
x=i,
y=j,
s=data[j,i],
ha='center',
va='center',
fontsize=10,
color='g'
)
# plot
plt.imshow(data,cmap='Blues')
# add side color bar
plt.colorbar()
九、極坐標(biāo)圖
極坐標(biāo)系是一個二維坐標(biāo)系統(tǒng),該坐標(biāo)系統(tǒng)中任意位置可由一個夾角和一段相對原點(diǎn)的距離來表示。極坐標(biāo)圖(Polar)用來將極坐標(biāo)系的信息表示出來的圖形格式。
N = 8
# create a arithmetic progression with eight number from 0 to 2*np.pi
x = np.linspace(0,2*np.pi,N,endpoint=False)
# the height of polar
heiht = np.random.randint(3,15,size=N)
# width
width = 2*np.pi / N
# color
color = np.random.rand(8,3) # rand:Return a array from 0 to 1.
# plot
axes = plt.subplot(111,projection='polar')
axes.bar(
x=x,
height=heiht,
width=width,
bottom=0,
color=color
)
十、雷達(dá)圖
當(dāng)我們需要綜合評價多個變量或指標(biāo)時,條形圖或柱狀圖可能是我們的首選,涉及到多組間的比較時,可能就需要分組條形圖或分組柱狀圖了。
有時候也不禁問自己,只有這一種選擇嗎?
今天,我們就說說另外一種數(shù)據(jù)展示的圖表——雷達(dá)圖。
在實際場景中,雷達(dá)圖也用于描述一個人的能力。比如中國乒乓球員有一位被成為“六邊形戰(zhàn)士”的,這個六邊形能力,就算用雷達(dá)圖描述的。
雷達(dá)圖其實就是放在極坐標(biāo)系中的首尾相連的折線圖。
plt.figure(figsize=(3,3))
x = np.linspace(0,2*np.pi,6,endpoint=False)
y = [80,60,90,70,70,100]
# 首尾相連
x = np.concatenate((x,[x[0]]))
y = np.concatenate((y,[y[0]]))
# 繪制極坐標(biāo)系
axes = plt.subplot(111,polar=True)
# 繪制折線條
axes.plot(x,y,ls='-',lw=1,color='g')
# 填充
axes.fill(x,y,alpha=0.3)
# 顯示文本
for a,b in zip(x,y):
plt.text(
x=a,
y=b+2,
s=b,
fontsize=10,
color='r',
ha='center',
va='center'
)
十一、等高線圖
等高線圖,有時稱為地形圖,是在平面上用等高線表示的三維地貌。 該圖顯示鳥瞰圖,允許人們直觀地看到正在繪制的丘陵、山谷和斜坡。
在繪制等高線圖之前,我們先來介紹一個 meshgrid(a,b)
方法,該方法將 a,b 變成相同形狀(shape)的數(shù)組,并返回新的數(shù)組。
a = np.array([1,2,3])
b = np.array([4,5])
# meshgrid(a,b),將 a,b 變成相同形狀的數(shù)組
A,B = np.meshgrid(a,b)
display(A,B)
下面我們來繪制等高線圖:
fig = plt.figure(figsize=(4, 3))
# make data
x = np.linspace(-5,5,100)
y = np.linspace(-5,5,100)
# let x,y have same shape
X,Y = np.meshgrid(x,y)
Z = np.sqrt(X**2+Y**2)
# plot
cb = plt.contourf(X,Y,Z)
# color bar
plt.colorbar(cb)
plt.show()
十二、3D圖
在前面我們提到使用 matplotlib 也可以繪制3D圖,下面我們就來繪制一些常見的3D圖象。
下面的繪制方法,如果是 matplotlib-3.1.1 版本,會出現(xiàn)一系列類似下面的警告。
雖然說沒有什么影響,但是有些不美觀,因此,繪制3D圖時可以參考官網(wǎng)的繪圖案例去繪圖。
1 - 三維折線圖
fig = plt.figure(figsize=(4, 3))
# data
x = np.linspace(0,100,400)
# image
y = np.sin(x)
z = np.cos(x)
# 3D line chart
axes = Axes3D(fig)
fig.add_axes(axes)
axes.plot(x,y,z)
plt.show()
2 - 三維散點(diǎn)圖
fig = plt.figure(figsize=(4, 3))
axes = Axes3D(fig)
fig.add_axes(axes)
# make data
x = np.random.rand(50)
y = np.random.rand(50)
z = np.random.rand(50)
# plot scatter
axes.scatter(x,y,z,color='b',s=100)
3 - 三維柱狀圖
fig = plt.figure(figsize=(5, 4))
axes = Axes3D(fig)
fig.add_axes(axes)
x = np.arange(1, 5)
for i in x:
axes.bar(
np.arange(4),
np.random.randint(10, 100, size=4),
zs=i,
zdir='x',
width=0.6,
alpha=0.7
)
# label
axes.set_xlabel('X軸',fontsize=10,color='r')
axes.set_ylabel('Y軸',fontsize=10,color='g')
axes.set_zlabel('Z軸',fontsize=10,color='b')
圖象處理
- 讀取圖片
該方法返回一個 NumPy 數(shù)組。
n = plt.imread(r'F:\Pictures\圖片素材\csdn封面\社區(qū)圖片\聽海.png')
- 顯示圖片
該方法傳遞一個 numpy 數(shù)組作為參數(shù)。
plt.imshow(n)
- 保存圖片
該方法至少傳遞文件名和 numpy 數(shù)組作為參數(shù)。
plt.imsave('sea.jpg',n,dpi=200)
結(jié)語
以上就是本期要分享的全部內(nèi)容了!綜合來看,我們要善于查看方法幫助(將光表定位在方法的花括號中,然后按 Shift + Tab
即可。文章來源:http://www.zghlxwxcb.cn/news/detail-694206.html
我是向陽花,我在CSDN等你!??文章來源地址http://www.zghlxwxcb.cn/news/detail-694206.html
到了這里,關(guān)于【Matplotlib】一文帶你掌握Matplotlib繪制各種圖形的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!