matplotlib模組詳解

馬昌偉發表於2021-12-20

 

簡單繪圖,折線圖,並儲存為圖片

matplotlib模組詳解
import matplotlib.pyplot as plt

x=[1,2,3,4,5]

y=[10,5,15,10,20]

plt.plot(x,y,'ro-',color='blue')

plt.savefig('testblueline.jpg')

plt.show()
程式

 生成圖片:

import matplotlib.pyplot as plt
x=[1,2,3,4,5] #x軸資料
y=[10,5,15,10,20] #y軸資料。x軸和y軸一一對應就形成平面直角座標系的座標
plt.plot(x,y,'ro-',color='blue') #第一個引數是x軸,第二個是y軸,第四個指定折線圖顏色。
plt.savefig('testblueline.jpg') #將繪圖儲存為圖片
plt.show() #在pycharm中能展示出來

餅圖繪製 

matplotlib模組詳解
# coding=utf-8
import matplotlib.pyplot as plt

election_data = {'Biden': 290, 'Trump': 214, 'Others': 538 - 290 - 214}
candidate = [key for key in election_data]
votes = [value for value in election_data.values()]
plt.figure(figsize=(10, 10), dpi=100)
plt.pie(votes, labels=candidate, autopct="%1.2f%%", colors=['c', 'm', 'y'],
        textprops={'fontsize': 24}, labeldistance=1.05)
plt.legend(fontsize=16)
plt.title("2020年A國大選票數佔比", fontsize=24)
plt.savefig('bingtu.jpg')
plt.show()
程式
# coding=utf-8
import matplotlib.pyplot as plt

election_data = {'Biden': 290, 'Trump': 214, 'Others': 538 - 290 - 214} #資料欄位
candidate = [key for key in election_data] #字典的鍵是候選人,也是餅圖的三個扇區
votes = [value for value in election_data.values()] #字典的值是投票人數,
plt.figure(figsize=(10, 10), dpi=100) #
plt.pie(votes, labels=candidate, autopct="%1.2f%%", colors=['c', 'm', 'y'],
        textprops={'fontsize': 24}, labeldistance=1.05) #把數值列表也就是投票數放第一個引數,labels是名稱也就是候選人列表,
            #autopct引數,寫1.2表示餅圖數值百分比保留兩位小數,如果不加,這裡顯示出6位小數。如果填1.0或者1,那麼沒有小數
            #colors引數列表,代表餅圖扇區的顏色,與標籤即候選人是對應的,第一個顏色列表元素,對應第一個候選人列表元素。字母是顏色開頭字母,
            #我將c變成b,扇區就變藍色,寫成r,扇區就變成紅色。
            #textprops引數裡放標籤和數值也就是候選人和投票百分比的文字大小。
            #labeldistance是標籤到圓心的距離,1.05正好不壓住餅圖,小於1,標籤(候選人)進入了餅圖內,遠大於1那麼標籤離餅圖太遠。等於1會壓蓋一點餅圖
plt.legend(fontsize=16) #legend 圖例,說明的意思。這裡可以控制右上角圖例的大小。這裡候選人就是圖例,每個候選人就是圖例中的一個,餅圖根據它來劃分的,然後根據投票數值佔比,來劃分餅圖百分比
plt.title("2020年A國大選票數佔比", fontsize=24)#這裡控制餅圖的標題,標題字型大小
# plt.savefig('bingtu.jpg')
plt.show() #

pie(): matplotlib中繪製餅圖的函式。第一個引數傳入用於繪製餅圖的資料列表,其他引數都是關鍵字引數。labels引數用於設定每個扇形的標籤,說明每個扇形的資料歸屬。autopct引數用於設定餅圖中的百分比,一般保留兩位小數,傳入"%1.2f%%"即可。colors引數用於設定每個扇形的顏色,與資料列表一一對應,傳入一個與資料列表長度相等的列表。textprops引數用於設定標籤和百分比的字型、大小等,傳入一個字典。labeldistance引數用於設定標籤與餅圖的距離,預設值為1.1。

餅圖將一個圓餅按照各分類的佔比劃分成多個扇形,整個圓餅代表資料的總量,每個扇形表示該分類佔總體的比例大小,所有扇形相加的和等於100%。餅圖適用於表示不同分類在總體中的佔比情況,通過弧度大小來比較不同分類的佔比大小,尤其在需要突出顯示其中某一個部分的佔比時。

上面的餅圖繪製了2020年A國大選的票數佔比情況,可以一目瞭然地看到候選人的得票佔比情況。如果需要突出顯示某位候選人的得票佔比,可以對餅圖進行分離展示。

中文字型顯示和繪圖方框

新增字型變數,其它方法上引用變數 

matplotlib模組詳解
# coding=utf-8
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties # 步驟一
...
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14) # 步驟二
plt.xlabel("x軸", fontproperties=font) # 步驟三
plt.ylabel("y軸", fontproperties=font)
plt.title("標題", fontproperties=font)
plt.show()
程式

建立圖形,有x,y軸,有數字標識的正方體形式,此時沒有設定字型,不能顯示中文,並且終端報警告,沒有字型

 x,y軸加字型屬性,這樣圖片中 就顯示中文了

修改字型,就報錯了,

 雖然simsun.ttc檔案在本地也找不到,但是就是能用

 

 

 這個目錄下有很多字型,不知道咋用

在方法上直接加引數宋體,黑體。fontproperties

matplotlib模組詳解
import matplotlib.pyplot as plt
# ...
plt.xlabel("x軸")
plt.ylabel("y軸", fontproperties="SimSun") # 步驟一  (宋體)
plt.title("標題", fontproperties="SimHei") #     (黑體)
plt.show()
程式

 靈活,另一個優點:不汙染全域性字型設定

 rcParams

matplotlib模組詳解
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步驟一(替換sans-serif字型)
plt.rcParams['axes.unicode_minus'] = False  # 步驟二(解決座標軸負數的負號顯示問題)
#...
plt.xlabel("x軸")
plt.ylabel("y軸")
plt.title("標題")
plt.show()
程式
 直接給所有的加字型了

 

 簡潔的用法。缺點:汙染全域性字型設定。(所以需要第二步驟)

 一行那裡改不存在的字型不可以顯示,這裡的2行那裡有沒有,圖片貌似都沒變化

 

還是字型的

rc的方法

matplotlib模組詳解
import matplotlib.pyplot as plt
font = {'family' : 'SimHei',
    'weight' : 'bold',
    'size'  : '16'}
plt.rc('font', **font)        # 步驟一(設定字型的更多屬性)
plt.rc('axes', unicode_minus=False) # 步驟二(解決座標軸負數的負號顯示問題)
#...
plt.xlabel("x軸")
plt.ylabel("y軸")
plt.title("標題")
plt.show()
程式

 

 靈活的用法。缺點:影響全域性字型(所以需要第二步驟)

 

總結

 

方式二用時才設定,且不會汙染全域性字型設定,更靈活
方式三、方式四不需要對字型路徑硬編碼,而且一次設定,多次使用,更方便。

 

使用案例

 

matplotlib模組詳解
import numpy as np
import matplotlib.pyplot as plt
font = {'family' : 'DFKai-SB',
    'weight' : 'bold',
    'size'  : '16'}
plt.rc('font', **font) # pass in the font dict as kwargs
plt.rc('axes',unicode_minus=False)
x = np.linspace(0, 10, 1000)
y = np.sin(x)
z = np.cos(x**2)
plt.figure(figsize=(8,4))
plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b--",label="$cos(x^2)$")
plt.xlabel("x軸")
plt.ylabel("y軸")
plt.title("標題")
plt.ylim(-1.2,1.2)
plt.legend()
plt.show()
程式

一些中文字型英文名字

 

宋體 SimSun
黑體 SimHei
微軟雅黑 Microsoft YaHei
微軟正黑體 Microsoft JhengHei
新宋體 NSimSun
新細明體 PMingLiU
細明體 MingLiU
標楷體 DFKai-SB
仿宋 FangSong
楷體 KaiTi
隸書 LiSu
幼圓 YouYuan
華文細黑 STXihei
華文楷體 STKaiti
華文宋體 STSong
華文中宋 STZhongsong
華文仿宋 STFangsong
方正舒體 FZShuTi
方正姚體 FZYaoti
華文彩雲 STCaiyun
華文琥珀 STHupo
華文隸書 STLiti
華文行楷 STXingkai
華文新魏 STXinwei

 

 旋轉餅圖和突出顯示

matplotlib模組詳解
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
election_data = {'Biden': 290, 'Trump': 214, 'Others': 538 - 290 - 214}
candidate = [key for key in election_data]
votes = [value for value in election_data.values()]
plt.figure(figsize=(10, 10), dpi=100)
explode = (0.1, 0, 0)
plt.pie(votes, labels=candidate, autopct="%1.2f%%", colors=['c', 'm', 'y'], textprops={'fontsize': 24},
        labeldistance=1.05, explode=explode, startangle=90, shadow=True)
plt.legend(loc='upper right', fontsize=16)
plt.title("2020年A國大選票數佔比", fontsize=24)
plt.axis('equal')
plt.show()
程式
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #設定字型
election_data = {'Biden': 290, 'Trump': 214, 'Others': 538 - 290 - 214} #定義字典資料來源
candidate = [key for key in election_data] #定義標籤
votes = [value for value in election_data.values()] #定義數值
plt.figure(figsize=(10, 10), dpi=100) #新建畫圖視窗,視窗長和高。dpi 為設定圖形每英寸的點數
explode = (0.1, 0, 0)#設定各部分突出
plt.pie(votes, labels=candidate, autopct="%1.2f%%", colors=['c', 'm', 'y'], textprops={'fontsize': 24},
        labeldistance=1.05, explode=explode, startangle=90, shadow=True)
plt.legend(loc='upper right', fontsize=16) #plt.legend()函式主要的作用就是給圖加上圖例,plt.legend([x,y,z])裡面的引數使用的是list的的形式將圖表的的名稱餵給這和函式
plt.title("2020年A國大選票數佔比", fontsize=24)
# plt.axis('equal')
plt.show()
#plt.axis()用法詳解:https://www.cnblogs.com/shuaishuaidefeizhu/p/14034415.html
#plt.figure(1)是新建一個名叫 Figure1的畫圖視窗,
# plt.plot(x,c)是在畫圖視窗裡具體繪製橫軸為x 縱軸為c的曲線
#參考設定圖形大小和dpi  https://www.cnblogs.com/lijunjie9502/p/10327151.html

 

在繪製餅圖的pie()函式中,explode引數用於設定每個扇形到圓心的距離,傳入一個與資料列表長度相等的列表,預設每個扇形到圓心的距離都是0,將想要分離展示的扇形距離設定成一個適合的值,如0.1,即可將該部分突出展示。為了展示效果更好,可以使用startangle引數對餅圖進行旋轉(如將分離的扇形旋轉到左側),給startangle引數傳入一個角度,將餅圖逆時針旋轉對應的角度,startangle參數列示的是餅圖的起始角度,預設為正右方向,即傳統的x軸正方形,此方向表示0度,設定起始角度後可以實現旋轉的效果。對扇形進行分離展示後,將shadow引數設定為True,給餅圖新增陰影,使餅圖更立體,餅圖切分的效果會更好。

在對餅圖進行分離後,餅圖的佈局會發生變化,為了控制餅圖佔用的區域是一個正方形,且避免餅圖變成橢圓形,使用axis('equal')函式,傳入'equal'引數。

在上一張餅圖的基礎上,經過設定後,將獲勝者Biden的得票率突出顯示,可以更突出地展示獲勝者的得票佔比。

 繪製環形餅圖

matplotlib模組詳解
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
election_data = {'Biden': 290, 'Trump': 214, 'Others': 538 - 290 - 214}
candidate = [key for key in election_data]
votes = [value for value in election_data.values()]
plt.figure(figsize=(10, 10), dpi=100)
explode = (0, 0, 0)
plt.pie(votes, labels=candidate, explode=explode, autopct="%1.2f%%", colors=['c', 'm', 'y'],
        textprops={'fontsize': 24}, labeldistance=1.05, pctdistance=0.85, startangle=90)
plt.pie([1], radius=0.7, colors='w')
plt.legend(loc='upper right', fontsize=16)
plt.title("2020年A國大選票數佔比", fontsize=24)
plt.axis('equal')
plt.show()
程式

 

要繪製環形的餅圖,在繪製出餅圖後,再次呼叫pie()函式繪製一個更小的純白餅圖即可,先後順序不能相反。

在繪製純白的餅圖時,傳入只有一個資料的列表,一條資料會佔滿整個餅圖,佔比100%,顏色設定為colors='w'。radius引數預設為1,如果第一張餅圖的radius引數是1,設定白色餅圖的radius引數小於1,得到的白色餅圖就會小於第一張餅圖。此外不需要設定其他引數,白色餅圖不需要顯示百分比,不需要顯示標籤等。

繪製完成小的白色餅圖,環形效果就實現了,還需要調整第一張餅圖的百分比的顯示位置。在pie()函式中,pctdistance引數用於設定百分比顯示離圓心的距離,預設值是0.6,設定環形效果時,可以將pctdistance引數增大,使百分比顯示在環形的中間。同時,因為環形餅圖是通過遮擋實現的,陰影展示不完全,看起來比較彆扭,所以不設定shadow引數,去掉陰影。

柱形圖

 1、基本柱形圖

matplotlib模組詳解
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

num_list = [1.5, 0.6, 7.8, 6]
plt.bar(range(len(num_list)), num_list)
plt.show()
程式

柱形圖

2、設定柱形圖顏色

 

matplotlib模組詳解
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

num_list = [1.5, 0.6, 7.8, 6]
plt.bar(range(len(num_list)), num_list, fc='r')
plt.show()
程式

加上引數fc改變為單一顏色

 加上顏色引數也可以

matplotlib模組詳解
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

num_list = [1.5, 0.6, 7.8, 6]
plt.bar(range(len(num_list)), num_list, color='rgb')
plt.show()
程式

 3、新增橫座標的標籤

matplotlib模組詳解
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

name_list = ['Monday', 'Tuesday', 'Friday', 'Sunday']
num_list = [1.5, 0.6, 7.8, 6]
plt.bar(range(len(num_list)), num_list, color='rgb', tick_label=name_list)
plt.show()
程式

 

 4、堆疊柱狀圖

matplotlib模組詳解
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

name_list = ['Monday', 'Tuesday', 'Friday', 'Sunday']
num_list = [1.5, 0.6, 7.8, 6]
num_list1 = [1, 2, 3, 1]
plt.bar(range(len(num_list)), num_list, label='boy', fc='y')
plt.bar(range(len(num_list)), num_list1, bottom=num_list, label='girl', tick_label=name_list, fc='r')
plt.legend()
plt.show()
程式

適用於如下課程表類似的結構。根據時間或者某個序列,對一種或多類物件的數值,顯示每個序列中這幾類的數值和佔比情況

 

 

 

 5、並列柱形圖

 還是適用上圖的情況

matplotlib模組詳解
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

name_list = ['Monday' ,'Tuesday' ,'Friday' ,'Sunday']
num_list = [1.5 ,0.6 ,7.8 ,6]
num_list1 = [1 ,2 ,3 ,1]
x =list(range(len(num_list)))
total_width, n = 0.8, 2
width = total_width / n

plt.bar(x, num_list, width=width, label='boy', fc='y')
for i in range(len(x)):
    x[i] = x[i] + width
plt.bar(x, num_list1, width=width, label='girl', tick_label=name_list, fc='r')
plt.legend()
plt.show()
程式

 

 

 6、條形柱形圖

matplotlib模組詳解
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

name_list = ['Monday', 'Tuesday', 'Friday', 'Sunday']
num_list = [1.5, 0.6, 7.8, 6]
plt.barh(range(len(num_list)), num_list, tick_label=name_list)
plt.show()
程式

 

 

 
 
 
 
 
 
 
中文字型:https://www.jb51.net/article/134546.htm
https://www.cnblogs.com/bainianminguo/p/10952586.html
餅圖:https://blog.csdn.net/weixin_43790276/article/details/109684441
cpu圖:https://www.it610.com/article/1304777370737086464.htm
動態cpu:http://www.zzvips.com/article/145005.html
展示圖片在html頁面:https://www.cnblogs.com/amize/p/15060978.html
繪圖知識點:https://www.cnblogs.com/zhizhan/p/5615947.html
菜鳥教程:https://www.runoob.com/matplotlib/matplotlib-pie.html
matplotlib柱形圖:https://blog.csdn.net/qq_29721419/article/details/71638912
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt

name_list = ['Monday', 'Tuesday', 'Friday', 'Sunday']
num_list = [1.5, 0.6, 7.8, 6]
plt.bar(range(len(num_list)), num_list, color='rgb', tick_label=name_list)
plt.show()

相關文章