一、前言
Matplotlib 是一個(gè) Python的 2D繪圖庫,它以各種硬拷貝格式和跨平臺(tái)的交互式環(huán)境生成出版質(zhì)量級(jí)別的圖形。
二、安裝
用pip命令安裝第三方庫
pip install matplotlib
三、小試牛刀(直線圖、折線圖)
先繪制個(gè)簡單的圖形,先導(dǎo)入pyplot模塊,然后定義點(diǎn)的坐標(biāo),再調(diào)用plot方法連線繪圖,然后設(shè)置圖形的屬性,最后保存和展示圖形。
PS:savefig()方法必須放在show()方法前。
from matplotlib import pyplot as plt # 導(dǎo)入pyplot模塊
# 定義點(diǎn)的坐標(biāo),即x、y坐標(biāo)
x = range(10)
y1 = [i * 2 for i in x]
y2 = [i * 3 for i in x]
# 調(diào)用plot方法連線繪圖
plt.plot(x, y1, linewidth=1, color="orange", marker="o", label="hhhhhhhh")
plt.plot(x, y2, ":ro", label="ssssss")
plt.xlabel("angle") # 設(shè)置x軸名稱
plt.ylabel("sine") # 設(shè)置y軸名稱
# 設(shè)置橫縱坐標(biāo)
plt.xticks([0, 2, 4, 6, 8, 10, 12])
plt.yticks([0, 5, 10, 15, 20, 25])
plt.title('sine wave') # 設(shè)置標(biāo)題
plt.grid() # 設(shè)置網(wǎng)格模式
plt.legend(["xxxxx", "yyyyyy"], loc="upper left") # 設(shè)置線條標(biāo)識(shí)
# 設(shè)置每個(gè)點(diǎn)上的數(shù)值
for i in range(10):
plt.text(x[i], y2[i], y2[i], fontsize=12, color="black", style="italic", weight="light", verticalalignment='center',
horizontalalignment='right', rotation=0)
plt.savefig('demo.jpg') # 保存圖形,此方法必須放在show()前面,否則保存的是一個(gè)空白圖
# 使用show展示圖形
plt.show()
結(jié)果:

常用方法介紹
-
plt.plot(x, y, "格式控制字符串", 關(guān)鍵字=參數(shù))- x、y分別是橫縱坐標(biāo)。
- 格式控制字符串最多可以包括三部分, "線型","顏色", "點(diǎn)型",。入?yún)㈨樞颍壕€型-》顏色-》點(diǎn)型
線型:linestyle=['-','--','-.',':']
顏色:color=['b','g','r','c','m','y','k','w']
點(diǎn)型:marker=['.',',','o','v','^','<','>','1','2','3','4','s','p','*','h','H','+','x','D','d','|','_','.',','] - 關(guān)鍵字參數(shù),例如線條標(biāo)識(shí)
label
plot()設(shè)置的屬性會(huì)被legend()的覆蓋,legend()優(yōu)先級(jí)更高
-
plt.text(x, y, s, fontsize, verticalalignment,horizontalalignment,rotation , **kwargs)- x,y表示標(biāo)簽添加的位置,默認(rèn)是根據(jù)坐標(biāo)軸的數(shù)據(jù)來度量的,是絕對(duì)值,也就是說圖中點(diǎn)所在位置的對(duì)
應(yīng)的值。 - s表示標(biāo)簽的符號(hào),字符串格式。
- fontsize顧名思義就是你加標(biāo)簽字體大小了,取整數(shù)。
- verticalalignment表示垂直對(duì)齊方式 ,可選 ‘center’ ,‘top’ , ‘bottom’,‘baseline’ 等。
- horizontalalignment表示水平對(duì)齊方式 ,可以填 ‘center’ , ‘right’ ,‘left’ 等。
- rotation表示標(biāo)簽的旋轉(zhuǎn)角度,以逆時(shí)針計(jì)算,取整。
- 后面還有 family 用來設(shè)置字體,style 設(shè)置字體的風(fēng)格,weight 字體的粗細(xì), bbox 給字體添加框,如
bbox=dict(facecolor=‘red’, alpha=0.5) 等,各種風(fēng)格,應(yīng)有盡有,總有一款適合你。
- x,y表示標(biāo)簽添加的位置,默認(rèn)是根據(jù)坐標(biāo)軸的數(shù)據(jù)來度量的,是絕對(duì)值,也就是說圖中點(diǎn)所在位置的對(duì)
-
pyplot.legend(handles,labels,loc)參考傳送門
handles需要傳入你所畫線條的實(shí)例對(duì)象,即調(diào)用plt.plot()返回的對(duì)象。
labels是圖例的名稱(能夠覆蓋在plt.plot( )中l(wèi)abel參數(shù)值)。
loc代表了圖例在整個(gè)坐標(biāo)軸平面中的位置(一般選取'best'這個(gè)參數(shù)值)。supported values are 'best', 'upper right', 'upper left', 'lower left', 'lower right', 'right', 'center left', 'center right', 'lower center', 'upper center', 'center'# 用法一,直接在legend()定義label line1, = plt.plot(n, m1, color='r', linewidth=1.5, linestyle='-') line2, = plt.plot(n, m2, 'b') plt.legend(handles=[line1, line2], labels=['girl購物欲望','boy購物欲望'], loc='best') plt.legend(labels=['girl購物欲望','boy購物欲望'], loc='best') # 這樣寫也OK,默認(rèn)一一對(duì)應(yīng) # 用法二 plt.plot(n, m1, color='r', linewidth=1.5, linestyle='-', label='女生購物欲望') # 給plt.plot( )中參數(shù)label=''傳入字符串類型的值,也就是圖例的名稱 plt.plot(n, m2, 'b', label='男生購物欲望') # 使用plt.legend( )使上述代碼產(chǎn)生效果 plt.legend()
四、餅圖
plt.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, hold=None, data=None)
pie 函數(shù)參數(shù)詳解
- x :(每一塊)的比例,如果sum(x) >1會(huì)使用sum(x)歸一化;
- labels :(每一塊)餅圖外側(cè)顯示的說明文字;
- explode :(每一塊)離開中心距離;
- startangle :起始繪制角度,默認(rèn)圖是從x軸正方向逆時(shí)針畫起,如設(shè)定=90則從y軸正方向畫起;
- shadow :在餅圖下面畫一個(gè)陰影。默認(rèn)值:False,即不畫陰影;
- labeldistance :label標(biāo)記的繪制位置,相對(duì)于半徑的比例,默認(rèn)值為1.1, 如<1則繪制在餅圖內(nèi)側(cè);
- autopct :控制餅圖內(nèi)百分比設(shè)置,可以使用format字符串或者format function'%1.1f'指小數(shù)點(diǎn)前后位數(shù)(沒有用空格補(bǔ)齊);
- pctdistance :類似于labeldistance,指定autopct的位置刻度,默認(rèn)值為0.6;
- radius :控制餅圖半徑,默認(rèn)值為1;counterclock:指定指針方向;布爾值,可選參數(shù),默認(rèn)為:True,即逆時(shí)針。將值改為False即可改為順時(shí)針。
- wedgeprops:字典類型,可選參數(shù),默認(rèn)值:None。參數(shù)字典傳遞給wedge對(duì)象用來畫一個(gè)餅圖。例如:* * wedgeprops={'linewidth':3}設(shè)置wedge線寬為3。
- textprops:設(shè)置標(biāo)簽(labels)和比例文字的格式;字典類型,可選參數(shù),默認(rèn)值為:None。傳遞給text對(duì)象的字典參數(shù)。
- center:浮點(diǎn)類型的列表,可選參數(shù),默認(rèn)值:(0,0)。圖標(biāo)中心位置。
- frame:布爾類型,可選參數(shù),默認(rèn)值:False。如果是true,繪制帶有表的軸框架。
- rotatelabels:布爾類型,可選參數(shù),默認(rèn)為:False。如果為True,旋轉(zhuǎn)每個(gè)label到指定的角度。
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"] # 設(shè)置字體
plt.style.use('fivethirtyeight')
languages = ['JavaScript', 'HTML/CSS', 'SQL', 'Python', 'Java']
popularity = [59219, 55466, 47544, 36443, 35917]
plt.pie(popularity, labels=languages, autopct='%1.1f%%',
counterclock=False, startangle=90, explode=[0, 0.2, 0, 0, 0])
plt.title('top5 編程語言占比')
plt.tight_layout() # 自動(dòng)調(diào)整子圖的尺寸使充滿整個(gè)figure
plt.show()

五、柱狀圖
import matplotlib.pyplot as plt
import random
# 解決中文亂碼問題
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.rcParams["axes.unicode_minus"] = False
# 定義x軸、y軸數(shù)據(jù)
x_data = ["20{}年".format(i) for i in range(16, 22)]
y_data = [random.randint(100, 300) for i in range(6)]
# 繪圖
for i in range(len(x_data)): # 編寫渲染使柱狀圖顏色不同
plt.bar(x_data[i], y_data[i])
# 添加數(shù)據(jù)標(biāo)簽
for i in range(len(x_data)):
plt.text(x_data[i], y_data[i], y_data[i])
plt.title("銷量分析")
plt.xlabel("年份")
plt.ylabel("銷量")
plt.show()
plt.bar(x,height,[width=0.8][,align='center'][,color='blue'])
- x:表示x坐標(biāo)的取值.
- height:條形圖每個(gè)條形的高度,即y坐標(biāo)的取值。
- width:條形圖每個(gè)條形的寬度,取值為0~1,默認(rèn)為0.8。
- align:將條形與x坐標(biāo)對(duì)齊的方式,align='center'表示將條形底邊中心置于x坐標(biāo)的位置,align='edge'表示將條形的左邊緣與x坐標(biāo)位置對(duì)齊。
-
color:條形的顏色,默認(rèn)為'blue'
并列柱狀圖
# 導(dǎo)入擴(kuò)展包
import matplotlib.pyplot as plt
import numpy as np
# 構(gòu)造數(shù)據(jù)
y1 = [1, 4, 6, 8, 9, 4, 3, 8]
y2 = [2, 5, 9, 5, 3, 2, 7, 4]
x = np.arange(len(y1))
# 設(shè)置柱狀圖的寬度
width = 0.4
# 繪圖
plt.figure(figsize=(8, 4))
plt.bar(x=x, height=y1, width=width, label='Data1')
plt.bar(x=x + width, height=y2, width=width, label='Data2')
# 添加數(shù)據(jù)標(biāo)簽
for x_value, y_value in zip(x, y1):
plt.text(x=x_value, y=y_value, s=y_value)
for x_value, y_value in zip(x, y2):
plt.text(x=x_value + width, y=y_value, s=y_value)
# 添加圖標(biāo)題和圖例
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
plt.title('并列柱狀圖')
plt.legend()
plt.show()

