Matplotlib是一個基於python的2D畫圖庫,能夠用python腳本方便的畫出折線圖,直方圖,功率譜圖,散點圖等常用圖表,而且語法簡單。
Python中通過matplotlib模塊的pyplot子庫來完成繪圖。Matplotlib可用於創建高質量的圖表和圖形,也可以用於繪制和可視化結果。matplotlib是Python優秀的數據可視化第三方庫,matplotlb.pyplot是繪制種類可視化圖形的命令子庫,相當於快捷方式 import matplotlib.pyplot as plt.
- 線形圖:
線性圖是最基本的圖表類型,常用於繪制連續的數據。通過繪制線形圖,可以表現出數據的一種趨勢變化。
Matplotlib的plot(X,Y)用來繪制線形圖,在參數中傳入X和Y的坐標即可。其中,X和Y軸坐標的數據格式可以是列表、數組和Series.
例1:坐標數據格式為series
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
data={'name':['Tom','Peter','Lucy','Max'],
'sex':['female','female','male','male'],
'math':[78,79,83,92],
'city':['北京','上海','廣州','北京']
}
df=pd.DataFrame(data)
print(df)
#DataFrame數據的行索引作為X軸,math列索引作為Y軸
plt.plot(df.index,df['math'],color='red',linestyle='-',linewidth=3,marker='D')
#通過plot函數的color參數可以指定線條的顏色,
linestyle參數可以指定線條的形狀,
linewidth參數可指定線條的寬度,
marker參數可對坐標點進行標記(默認情況下,坐標點是沒有標記的),
#結果:
name sex math city #創建一個DataFrame數據
0 Tom female 78 北京
1 Peter female 79 上海
2 Lucy male 83 廣州
3 Max male 92 北京
繪制的線性圖:
注意:顏色設置要放在線條和點的樣式的前面,顏色、線條和點的樣式可以放置於格式字符串。
如:plt.plot(df.index,df['math'],'co-') 運行結果如下:
2. 柱狀圖
2.1 繪制柱狀圖主要是使用matplotlib的bar函數:
bar函數的color參數可以設置柱狀圖的填充顏色,
alpha參數可以設置透明度,
例如:import matplotlib.pyplot as plt
data=[23,85,72,43,52]
plt.bar([1,2,3,4,5],data,color='royalblue',alpha=0.7) #運行結果:
bottom參數用於設置柱狀圖的高度,以此繪制堆積柱狀圖;
width參數 用於設置柱狀圖的寬度,以此可以繪制並列柱狀圖。
grid函數用於繪制格網,通過對參數的個性化設置,可以繪制出個性的格網
例如:
import numpy as np
import matplotlib.pyplot as plt
data1=[23,85,72,43,52]
data2=[42,35,21,16,9]
width=0.3
plt.bar(np.arange(len(data1)),data1,color='royalblue',alpha=0.7,width=width)
plt.bar(np.arange(len(data2))+width,data2,color='green',alpha=0.7,width=width)
plt.grid(color='black',linstyle='--',linewidth=3,axis='y',alpha=0.6)
#運行結果:
Bar函數的通過barh函數可以繪制水平柱狀圖
import numpy as np
import matplotlib.pyplot as plt
data1=[23,85,72,43,52]
plt.barh(np.arange(len(data1)),data1,color='green',alpha=0.5) #如圖所示:
2.2 刻度與標簽:
現實中的柱狀圖的X軸是有刻度標簽的,上述實例中未設置。在matplotlib中,
通過xticks函數 設置圖標的X軸的刻度和刻度標簽,yticks函數設置y軸的刻度和標簽。
通過xlabel 和 ylabel 方法給X軸和Y軸添加標簽,
通過title方法為圖表添加標題
例如:
import numpy as np
import matplotlib.pyplot as plt
data1=[23,85,72,43,52]
labels=['A','B','C','D','E']
plt.xticks(range(len(data1)),labels) #設置刻度和標簽
plt.xlabel('Class') #plt.xlabel、ylabel、title方法分別給X軸和Y軸,圖標題添加標簽。
plt.ylabel('Amounts')
plt.title('Example')
#plt.bar(range(len(data1)),data)
plt.bar(np.arange(len(data1)),data1,color='royalblue',alpha=0.7)
plt.grid(color='black',linstyle='--',linewidth=3,axis='y',alpha=0.6)
#運行結果:
2.3 圖例:
圖例是標識圖表元素的重要工具,在bar函數中傳入label參數表示圖例名稱,通過legend函數即可繪制出圖例。
data1=[23,85,72,43,52]
data2=[42,35,21,16,9]
width=0.3
plt.bar(np.arange(len(data1)),data1,width=width,label='one')
plt.bar(np.arange(len(data2))+width,data2,width=width,label='two')
plt.legend() #結果圖:
2.4 文本注解:
例如:在柱狀圖中加入文本數字,可以很清楚的知道每個類別的數量。通過text函數可以在指定的坐標(x,y)上加入文本注釋
data=[23,85,72,43,52]
labels=['A','B','C','D','E']
plt.xticks(range(len(data)),labels) #設置刻度和標簽
plt.xlabel('Class')
plt.ylabel('Amounts')
plt.title('Example')
plt.bar(range(len(data)),data)
for x,y in zip(range(len(data)),data):
plt.text(x,y,y,ha='center',va='bottom') #文本注解 # 第一個參數是x軸坐標
# 第二個參數是y軸坐標
# 第三個參數是要顯式的內容
3.散點圖:
Matpltlib中 scatter函數可以用來繪制散點圖,傳入X和Y軸坐標。Scatter(X,Y)
利用Numpy創建一組隨機數
import numpy as np
import matplotlib.pyplot as plt
X=np.random.randn(100)
Y=np.random.randn(100)
plt.scatter(X,Y,color='red',marker='D')
#散點圖:
4. 直方圖
matplotlib的hist()函數用來繪制直方圖。
直方圖與條形圖的區別:
直方圖是用面積表示各頻數的多少,矩形的高度表示每一組的頻數或頻率,寬度則表示各組的組距,因此其寬度與高度均有意義;
條形圖(柱狀圖)是用條形的長度表示各類頻數的多少,其寬度是固定的。
由於分組數據具有連續性,直方圖的各矩形通常是連續排列,而條形圖是分開排列;條形圖主要是用於展示分類數據,而直方圖則主要用於展示數據型數據。
x=np.random.normal(size=100)
plt.hist(x,bins=30)
5. 自定義設置
Matplotlib的圖像位於Figure對象中,實際上就是創建了一個空的圖像窗口。可通過figure函數可以創建一個新的Figure,用於繪制圖表
fig=plt.figure(figsize=(10,6)) #figsize參數可以設置圖表(整個圖)的長寬比
ax1=fig.add_subplot(2,2,1) #不能通過空figure繪圖,必須用add_subplot()創建一個或者多個子subplot繪圖區才能繪圖
#意思是:繪制2*2兩行兩列共4個子subplot圖像
ax2=fig.add_subplot(2,2,2) #在創建Figure對象過程中,通過add_subplot函數創建子圖,用於繪制圖形
ax3=fig.add_subplot(2,2,3)
years=[1950,1960,1970,1980,1990,2000,2010]
gdp=[300.2,543.3,1075.9,2862.5,5979.6,10289.7,14958.3]
ax1.scatter(years,gdp) #選用不同的ax變量,則可以在對應的subplot子圖中繪圖(散點圖、線形圖、柱狀圖)
ax2.plot(years,gdp)
ax3.bar(years,gdp)
#plt.subplots可以輕松的創建子圖,而axes的索引類型類似於二維數組,這樣就可以對指定的子圖進行繪制。Subplot函數中有3個參數:垂直繪圖的數量、水平繪圖的數量以及表示繪圖位置的索引(基於行進行計算)
fig,axes=plt.subplots(2,2,figsize=(10,6))
axes[1,0].plot(years,gdp)
axes[0,0].scatter(years,gdp)
axes[0,1].bar(years,gdp)
axes[1,1].hist(years,gdp)
注意:當沒有設置figsize時,創建多子圖會顯得擁擠。通過plt..subplot_adjust方法可以設置子圖的間距修改子圖之間的間距(增加額外的空間以調整兩個子圖之間的距離)
subplots__adjust(left=None,bottom=None,right=None,top=None,wspace=None,hspace=None) ,其中前4個參數用於設置subplot子圖的外圍邊距,wspace和hapace參數設置用於設置subplot子圖間的邊距。
fig,axes=plt.subplots(2,2) #未設置figsize時,默認情況下,各sudplot子圖間都會留有一定的間距。
years=[1950,1960,1970,1980,1990,2000,2010]
gdp=[300.2,543.3,1075.9,2862.5,5979.6,10289.7,14958.3]
fig,axes=plt.subplots(2,2)
plt.subplots_adjust(wspace=0.3,hspace=0.3)
axes[1,0].plot(years,gdp)
axes[0,0].scatter(years,gdp)
axes[0,1].bar(years,gdp)
axes[1,1].hist(years,gdp)
6. 樣式與字體:
Matplotlib自帶了一些樣式供用戶使用,如常用的ggplot樣式,通過plt.style.use('ggplot') 函數即可調用該樣式繪圖。
Matplotlib默認為英文字體,如果繪制中出現漢字就會亂碼,因此需要指定matplotlib的默認字體,這樣就可以解決亂碼的問題,
plt.rcParams['font.sans-serif']=['simhei'] #指定默認字體
plt.rcParams['axes.unicode_minus']=False #解決保存圖像時負號‘-’顯示為方塊的問題