參考書籍 《利用Python進行數據分析(原書第2版)》9.1 簡明matplotlib API入門
導入慣例 -> import matplotlib.pyplot as plt
9.1.1 圖片與子圖
【例】創建一個圖片對象,包含2x2個子圖
In [1]: import matplotlib.pyplot as plt
In [2]: import numpy as np
In [3]: import pandas as pd
In [4]: matplotlib
Using matplotlib backend: TkAgg
In [5]: fig = plt.figure()
In [6]: ax1 = fig.add_subplot(2,2,1)
In [7]: ax2 = fig.add_subplot(2,2,2)
In [8]: ax3 = fig.add_subplot(2,2,3)
說明:
In [4] 在Jupyter中運行%matplotlib notebook(或在IPython中運行%matplotlib)
In [5] matplotlib所繪製的圖位於圖片(Figure)對象中,使用plt.figure生成一個新的圖片
In [6] 不能使用空白的圖片進行繪圖,需要使用add_subplot創建一個或多個子圖(subplot)
該行代碼表示圖片應該是2×2的(最多四個圖形),並且我們選擇了四個圖形中的第一個(序號從1開始)
In [51] 當你輸入繪圖命令plt.plot(), matplotlib會在最後一個圖片和子圖(如果需要的話就創建一個)上進行繪製
注意:如果一開始沒有執行matplotlib,圖片不顯示可以使用命令plt.show(),如果希望圖片自動彈出則執行plt.ion()。如果一開始執行了matplotlib,再執行plt.ioff()圖片也不會自動彈出。
參考 : 在使用ipython的時候matplotlib無法自動顯示圖片 https://blog.csdn.net/u013613428/article/details/89133495
matplotlib包含了一個便捷方法plt.subplots -> 創建一個新的圖片,返回包含了已生成子圖對象的NumPy數組
In [11]: fig, axes = plt.subplots(2,3) => 回車後彈出圖片
In [12]: axes
Out[12]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000013F66247F48>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000013F6AA10E48>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000013F6AA4B308>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x0000013F6AA7BE88>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000013F6AAB1948>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000013F6AAE7648>]],
dtype=object)
@調整子圖周圍的間距(subplots_adjust方法)
可以用作圖對象上的方法、也可以用作頂層函數
subplots_adjust(left=None, bottom=None, right=None, top=None,wspace=None, hspace=None)
wspace和hspace分別控制的是圖片的寬度和高度百分比,以用作子圖間的間距。
【例】關注參數sharex和sharey,wspace和hspace
fig, axes = plt.subplots(2, 2, sharex=True, sharey=True)
for i in range(2):
for j in range(2):
axes[i, j].hist(np.random.randn(500), bins=50, color='k', alpha=0.5)
plt.subplots_adjust(wspace=0, hspace=0)
說明:sharex、sharey設置爲True會共享軸刻度數據;wspace、hspace設置爲0四個圖會貼在一起
接着將wspace、hspace設置爲1(100%)->橫向間距100%圖片寬度,縱向間距100%圖片高度
fig, axes = plt.subplots(2, 2, sharex=True, sharey=True)
for i in range(2):
for j in range(2):
axes[i, j].hist(np.random.randn(500), bins=50, color='k', alpha=0.5)
plt.subplots_adjust(wspace=1, hspace=1)
再看看將sharex、sharey設置爲False -> 每個子圖有獨立的座標軸
將wspace、hspace設置爲0.5(50%) -> 橫向間距50%圖片寬度,縱向間距50%圖片高度
fig, axes = plt.subplots(2, 2, sharex=False, sharey=False)
for i in range(2):
for j in range(2):
axes[i, j].hist(np.random.randn(500), bins=50, color='k', alpha=0.5)
plt.subplots_adjust(wspace=0.5, hspace=0.5)
9.1.2 顏色、標記和線類型
以下兩種表達等價
ax.plot(x, y, 'g--')
ax.plot(x, y, linestyle='--', color='g')
說明:有很多顏色縮寫被用於常用顏色,也可以通過指定十六進制顏色代碼的方式來指定顏色(例如’#CECECE')
參考plot函數的文檔字符串可以看到全部的線類型(在IPython或Jupyter中使用 plt.plot? )
【例】
In [20]: from numpy.random import randn
In [21]: plt.plot(randn(30).cumsum(), 'ko--')
Out[21]: [<matplotlib.lines.Line2D at 0x13f70fe3288>]
上面的代碼可以寫得更爲顯式:
plot(randn(30).cumsum(), color='k', linestyle='dashed', marker='o')
說明:標記可以用來突顯線圖的實際數據點。樣式字符串中線類型、標記類型必須跟在顏色後面。
9.1.3 刻度、標籤和圖例
pyplot接口設計爲交互式使用,包含了像xlim、xticks和xticklabels等方法。分別控制了繪圖範圍、刻度位置以及刻度標籤。
我們可以在兩種方式中使用:
- 在沒有函數參數的情況下調用,返回當前的參數值(例如plt.xlim()返回當前的x軸繪圖範圍)
- 傳入參數的情況下調用,並設置參數值(例如plt.xlim([0, 10])會將x軸的範圍設置爲0到10)
所有的這些方法都會在當前活動的或最近創建的AxesSubplot上生效。這些方法中的每一個對應於子圖自身的兩個方法。比如xlim對應於ax.get_lim和ax.set_lim。
@設置標題、軸標籤、刻度和刻度標籤
【例】隨機漫步
In [24]: fig = plt.figure()
In [25]: ax = fig.add_subplot(1, 1, 1)
In [26]: ax.plot(np.random.randn(1000).cumsum())
Out[26]: [<matplotlib.lines.Line2D at 0x13f6ec47108>]
使用set_xticks和set_xticklabels可以改變x軸刻度。
set_xticks表示在數據範圍內設定刻度的位置,默認情況下,這些刻度也有標籤。
ticks = ax.set_xticks([0, 250, 500, 750, 1000]) =>
使用set_xticklabels爲標籤賦值:labels = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'],rotation=30, fontsize='small')
說明:rotation選項會將x軸刻度標籤旋轉30度
使用set_xlabel給x軸一個名稱,使用set_titel給子圖一個標題 =>
ax.set_title('My first matplotlib plot')
ax.set_xlabel('Stages')
修改y軸座標是相同過程,將上面示例中的x替換成y即可。
軸的類型擁有一個set方法,允許批量設置繪圖屬性。
In [43]: props = {
...: 'title': 'My first matplotlib plot update',
...: 'ylabel': 'Distance'
...: }
...: ax.set(**props)
Out[43]:
[Text(35.347222222222214, 0.5, 'Distance'),
Text(0.5, 1.0, 'My first matplotlib plot update')]
@添加圖例
圖例是用來區分繪圖元素的另一個重要內容,有多種方式可以添加圖例。
最簡單的方式是在添加每個圖表時傳遞label參數:
In [9]: fig,ax = plt.subplots(1, 1)
In [10]: ax.plot(randn(1000).cumsum(), 'k', label='one')
Out[10]: [<matplotlib.lines.Line2D at 0x27ce056ec88>]
In [11]: ax.plot(randn(1000).cumsum(), 'k--', label='two')
Out[11]: [<matplotlib.lines.Line2D at 0x27ce05a7cc8>]
In [12]: ax.plot(randn(1000).cumsum(), 'k.', label='three')
Out[12]: [<matplotlib.lines.Line2D at 0x27ce05c5148>]
In [13]: ax.legend(loc='best')
Out[13]: <matplotlib.legend.Legend at 0x27ce05c1288>
說明:調用ax.legend()或plt.legend自動生成圖例。
loc參數告訴matplotlib在哪裏放置圖表。'best'會自動選擇最合適的位置。
如果取消圖例中的元素,不要傳入label參數或者傳入label='_nolegend_'。
關於legend方法位置參數loc,使用ax.legend? 查看更多信息。
9.1.4 註釋與子圖加工
可以使用text、arrow和annote方法來添加註釋和文本。
text在圖表上給定的座標(x, y),根據可選的定製樣式繪製文本。
註釋可以同時繪製文本和箭頭,ax.annotate方法可以在指定的x和y座標上繪製標籤。
matplotlib含有表示多種常見圖形的對象,這些對象的引用是patches。
想在圖表中添加圖形時,你需要生成patch對象shp,並調用ax.add_patch(shp)將它加入到子圖中。
【例】繪製矩形、圓、三角形
矩形:左下頂點(0.2,0.75),長0.5,高0.15
圓:圓心(0.2,0.75),半徑0.15
三角形:給出三個頂點的位置
alpha代表不透明度(0-> 透明,1-> 不透明)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
rect = plt.Rectangle((0.2, 0.75), 0.4, 0.15, color='k', alpha=0.3)
circ = plt.Circle((0.7, 0.2), 0.15, color='b', alpha=0.3)
pgon = plt.Polygon([[0.2, 0.2], [0.4, 0.4], [0.3, 0.6]],color='g', alpha=0.5)
ax.add_patch(rect)
ax.add_patch(circ)
ax.add_patch(pgon)
9.1.5 將圖片保存到文件
可以使用plt.savefig將活動圖片保存到文件。這個方法等價於圖片對象的savefig實例方法。
【例】將圖片保存爲SVG => plt.savefig('figpath.svg')
說明:
1.文件類型是從文件擴展名中推斷出來的。
2.一些選項
dpi -> 控制每英寸點數的分辨率
bbox_inches -> 修剪實際圖形的空白
爲了得到同樣一個PNG圖片,且使用最小的空白,擁有400 DPI =>
plt.savefig('figpath.png', dpi=400, bbox_inches='tight')