Python數據分析 筆記4(matplotlib庫)

參考書籍 《利用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')

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章