簡單繪圖,折線圖,並儲存為圖片
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中能展示出來
餅圖繪製
# 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國大選的票數佔比情況,可以一目瞭然地看到候選人的得票佔比情況。如果需要突出顯示某位候選人的得票佔比,可以對餅圖進行分離展示。
中文字型顯示和繪圖方框
新增字型變數,其它方法上引用變數
# 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
import matplotlib.pyplot as plt # ... plt.xlabel("x軸") plt.ylabel("y軸", fontproperties="SimSun") # 步驟一 (宋體) plt.title("標題", fontproperties="SimHei") # (黑體) plt.show()
靈活,另一個優點:不汙染全域性字型設定
rcParams
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()
簡潔的用法。缺點:汙染全域性字型設定。(所以需要第二步驟)
還是字型的
rc的方法
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()
靈活的用法。缺點:影響全域性字型(所以需要第二步驟)
總結
方式二用時才設定,且不會汙染全域性字型設定,更靈活
方式三、方式四不需要對字型路徑硬編碼,而且一次設定,多次使用,更方便。
使用案例
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 |
旋轉餅圖和突出顯示
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的得票率突出顯示,可以更突出地展示獲勝者的得票佔比。
繪製環形餅圖
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、基本柱形圖
# -*- 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、設定柱形圖顏色
# -*- 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改變為單一顏色
加上顏色引數也可以
# -*- 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、新增橫座標的標籤
# -*- 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、堆疊柱狀圖
# -*- 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、並列柱形圖
還是適用上圖的情況
# -*- 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、條形柱形圖
# -*- 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()
# -*- 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()