前言
眾所周知,通過數據繪圖,我們可以將枯燥的數字轉換成容易被人們接受的圖表,從而讓人留下更加深刻的印象。而大多數編程語言都有自己的繪圖工具,matplotlib就是基於Python的繪圖工具包,使用它我們可以僅僅使用幾行代碼就生成 餅圖、直方圖、功率譜、條形圖、錯誤圖、散點圖、氣泡圖,甚至生成動態圖型也都很輕松。而且它的繪圖方法豐富,可以在各種交互式環境中運行,且生成的圖像質量高、兼容各種硬拷貝格式。

博主也是在測試一個算法的時候,為了更直觀的呈現數據走向,學習了它的相關用法,這篇博客大部分內容是在此過程中的學習筆記。
matplotlib的官網地址是https://matplotlib.org/gallery,下面這些是他們官網的一些示例圖形。



安裝
pip安裝
Matplotlib的安裝比較容易,可以直接通過pip安裝,也可以通過下載安裝包的方式安裝。博主使用的是python3,相關的安裝命令如下:
pip3 install matplotlib
安裝包安裝
如果你的Python3可以直接點擊下面的py3鏈接下載進行安裝,則點擊可以點擊其他python版本下載對應Python版本進行安裝
matplotlib-1.4.3.win-amd64-py3
柱狀圖
主要方法
用python畫柱狀圖很容易,主要的方法是:
atplotlib.pyplot.bar(left, height, width=0.8, bottom=None, hold=None, data=None, **kwargs)
參數說明
- left: 每一個柱形左側的X坐標
- height:每一個柱形的高度
- width: 柱形之間的寬度
- bottom: 柱形的Y坐標
- color: 柱形的顏色
示例代碼
import matplotlib.pyplot as plt
import time
source_data = {'mock_verify': 369, 'mock_notify': 192, 'mock_sale': 517} # 設置原始數據
for a, b in source_data.items():
plt.text(a, b + 0.05, '%.0f' % b, ha='center', va='bottom', fontsize=11) # ha 文字指定在柱體中間, va指定文字位置 fontsize指定文字體大小
# 設置X軸Y軸數據,兩者都可以是list或者tuple
x_axis = tuple(source_data.keys())
y_axis = tuple(source_data.values())
plt.bar(x_axis, y_axis, color='rgb') # 如果不指定color,所有的柱體都會是一個顏色
plt.xlabel(u"渠道名") # 指定x軸描述信息
plt.ylabel(u"訪問量") # 指定y軸描述信息
plt.title("渠道訪問量統計表") # 指定圖表描述信息
plt.ylim(0, 600) # 指定Y軸的高度
plt.savefig('{}.png'.format(time.strftime('%Y%m%d%H%M%S'))) # 保存為圖片
plt.show()
效果圖

解決中文顯示問題
從上面的圖片看到,matplotlib繪制圖像顯示中文時,中文會變成小方格子。搜了很多資料,最佳的解決方法是動態設置參數,添加下面的代碼。
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默認字體
mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負號'-'顯示為方塊的問題
修改后的圖片

餅狀圖
主要方法
用python畫柱狀圖的主要方法如下:
plt.pie(x=fracs, labels=labels, explode=explode, autopct='%3.1f %%',shadow=False, labeldistance=1.1, startangle=0, pctdistance=0.8)
示例代碼
相關的參數已在注釋中說明
import matplotlib.pyplot as plt
data = {'8516464': 106, '8085460': 704, '7593813': 491, '8709362': 24, '8707829': 6, '8684658': 23, '8679301': 11,
'8665923': 29, '8660909': 23, '8652968': 31, '8631727': 31, '8622935': 24, '8620593': 18, '8521737': 33,
'8605441': 49, '8495205': 82, '8477276': 57,'8474489': 71, '8456502': 50, '8446529': 68, '8433830': 136,
'8254158': 103, '8176029': 88, '8081724': 58, '7922592': 185, '7850099': 62,'7617723': 61, '7615562': 90,
'7615052': 57, '7604151': 102, '7511294': 59,'6951654': 27, '6946388': 142, '6945373': 159, '6937716': 347,
'7460176': 64, '7246377': 87, '7240621': 145, '7204707': 645, '7028401': 671}
source_data = sorted(data.items(), key=lambda x: x[1], reverse=True)
print(source_data)
labels = [source_data[i][0][:4] for i in range(len(source_data))] # 設置標簽
fracs = [source_data[i][1] for i in range(len(source_data))]
explode = [x * 0.01 for x in range(len(source_data))] # 與labels一一對應,數值越大離中心區越遠
plt.axes(aspect=1) # 設置X軸 Y軸比例
# labeldistance標簽離中心距離 pctdistance百分百數據離中心區距離 autopct 百分比的格式 shadow陰影
plt.pie(x=fracs, labels=labels, explode=explode, autopct='%3.1f %%',
shadow=False, labeldistance=1.1, startangle=0, pctdistance=0.8, center=(-1, 0))
# 控制位置:bbox_to_anchor數組中,前者控制左右移動,后者控制上下。ncol控制 圖例所列的列數。默認值為1。fancybox 圓邊
plt.legend(loc=7, bbox_to_anchor=(1.2, 0.80), ncol=3, fancybox=True, shadow=True, fontsize=8)
plt.show()
效果圖

動態圖
主要方法
用python畫動態圖的主要方法如下:
ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
init_func=init, blit=True)
動態圖官方使用介紹
可以訪問下面的鏈接查看它官網的使用介紹
示例代碼
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import time
# Fixing random state for reproducibility
np.random.seed(196)
# 初始數據繪圖
dis = np.zeros(40)
dis2 = dis
fig, ax = plt.subplots()
line, = ax.plot(dis)
ax.set_ylim(-1, 1)
plt.grid(True)
ax.set_ylabel("distance: m")
ax.set_xlabel("time")
def update(frame):
global dis
global dis2
global line
# 讀入模擬
a = np.random.rand() * 2 - 1
time.sleep(np.random.rand() / 10)
# 繪圖數據生成
dis[0:-1] = dis2[1:]
dis[-1] = a
dis2 = dis
# 繪圖
line.set_ydata(dis)
# 顏色設置
plt.setp(line, 'color', 'c', 'linewidth', 2.0)
ani = animation.FuncAnimation(fig, update, frames=None, interval=100)
plt.show()
效果圖:

顏色設置
matplotlib中對顯示的字體和顏色都可以進行定制:
內建顏色
| 內建顏色 | 藍色 | 綠色 | 紅色 | 青色 | 品紅 | 黃色 | 黑色 |
|---|---|---|---|---|---|---|---|
| 對應字符 | 'b' | 'g' | 'r' | 'c' | 'm' | 'y' | 'k' |
其他顏色
其他的顏色使用可以參考下面這篇博客
字體設置
| 字體 | 對應字體 |
|---|---|
| 黑體 | SimHei |
| 微軟雅黑 | Microsoft YaHei |
| 微軟正黑體 | Microsoft JhengHei |
| 新宋體 | NSimSun |
| 新細明體 | PMingLiU |
| 細明體 | MingLiU |
| 標楷體 | DFKai-SB |
| 仿宋 | FangSong |
| 楷體 | KaiTi |
| 仿宋_GB2312 | FangSong_GB2312 |
| 楷體_GB2312 | KaiTi_GB2312 |
參考資料:
