1. 程式人生 > 其它 >【學習筆記】 第9章 繪圖和視覺化

【學習筆記】 第9章 繪圖和視覺化

前言

本篇學習matplotlib,一個創建出版質量圖表的桌面繪圖包,其目的是為Python構建一個MATLAB式的繪圖介面。
說人話就是,可以把你的資料視覺化

matplotlib API入門

matplotlib的通常引入約定是:
import matplotlib.pyplot as plt

問題###

使用Matplotlib,這是

In [1]: import matplotlib.pyplot as plt
In [2]: import numpy as np
In [3]: data = np.arange(10)
In [4]: plt.plot(data)

我在ipython中得到的輸出只有
Out[4]: [<matplotlib.lines.Line2D at 0x2c8c70acd90>]


並沒有彈出圖片
經過百度,得知在預設配置中,需要告訴matplotlib進行渲染,需要
plt.show()
才能看到圖片
與此同時還得知如果需要儲存圖片可以使用plt.savefig('圖片名字.格式')來儲存

Figure和Subplot

matplotlib的影象都位於Figure物件中。你可以用plt.figure建立一個新的Figure:
In [16]: fig = plt.figure()其實可以理解為新建了一張畫布
而且不能通過空Figure繪圖。必須用add_subplot建立一個或多個subplot才行
In [17]: ax1 = fig.add_subplot(2, 2, 1)


這句的意思是,我可以建立一個2*2的圖象數母,最後一個傳入的1指的是當前選中的是4個subplot中的第一個

fig = plt.figure()
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)

執行如上命令,matplotlib就會在最後一個用過的subplot(如果沒有則建立一個)上進行繪製,隱藏建立figure和subplot的過程
例如plt.plot(np.random.randn(50).cumsum(), 'k--')
這裡程式碼解釋是:使用randn功能產生標準正態分佈的隨機數50個,並用cumsum計算累加和,而"k--"是一個線型選項,用於告訴matplotlib繪製黑色虛線圖。

由於上傳影象有點麻煩,就用書中的圖了

而plt.subplots,它可以建立一個新的Figure,並返回一個含有已建立的subplot物件的NumPy陣列
fig, axes = plt.subplots(2, 3)這裡會產生2*3個畫布

調整subplot周圍的間距

利用Figure的subplots_adjust方法可以輕而易舉地修改間距
plt.subplots_adjust(wspace=0, hspace=0)
這裡會把行間距和列間距均變為0

顏色、標記和線型

常用的顏色可以使用顏色縮寫,也可以指定顏色碼,可以通過檢視plot的文件字串檢視所有線型的合集。
線圖可以使用標記強調資料點。因為matplotlib可以建立連續線圖,在點之間進行插值,因此有時可能不太容易看出真實資料點的位置。標記也可以放到格式字串中,但標記型別和線型必須放在顏色後面
marker='o'可以讓數值處的點更明顯
drawstyle='steps-post'圖片不再是以線性插值

設定標題、軸標籤、刻度以及刻度標籤

要改變x軸刻度,最簡單的辦法是使用set_xticks和set_xticklabels。前者告訴matplotlib要將刻度放在資料範圍中的哪些位置,預設情況下,這些位置也就是刻度標籤。但我們可以通過set_xticklabels將任何其他的值用作標籤

set_xticks([0, 250, 500, 750, 1000])

set_xticklabels(['one', 'two', 'three', 'four', 'five'],
                         rotation=30, fontsize='small')

rotation代表間距
Y軸的修改方式與此類似,只需將上述程式碼中的x替換為y即可。

新增圖例

圖例(legend)是另一種用於標識圖表元素的重要工具。新增圖例的方式有多種。最簡單的是在新增subplot的時候傳入label引數
ax.plot(randn(1000).cumsum(), 'k', label='one')

註解以及在Subplot上繪圖

ax.annotate方法可以在指定的x和y座標軸繪製標籤。
ax.set_title新增圖示標題

from datetime import datetime

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

data = pd.read_csv('examples/spx.csv', index_col=0, parse_dates=True)
spx = data['SPX']

spx.plot(ax=ax, style='k-')

crisis_data = [
    (datetime(2007, 10, 11), 'Peak of bull market'),
    (datetime(2008, 3, 12), 'Bear Stearns Fails'),
    (datetime(2008, 9, 15), 'Lehman Bankruptcy')
]

for date, label in crisis_data:
    ax.annotate(label, xy=(date, spx.asof(date) + 75),
                xytext=(date, spx.asof(date) + 225),
                arrowprops=dict(facecolor='black', headwidth=4, width=2,
                                headlength=4),
                horizontalalignment='left', verticalalignment='top')

# Zoom in on 2007-2010
ax.set_xlim(['1/1/2007', '1/1/2011'])
ax.set_ylim([600, 1800])

ax.set_title('Important dates in the 2008-2009 financial crisis')

將圖表儲存到檔案

使用pandas和seaborn繪圖

matplotlib實際上是一種比較低階的工具。要繪製一張圖表,組裝一些基本元件就行:資料展示(即圖表型別:線型圖、柱狀圖、盒形圖、散佈圖、等值線圖等)、圖例、標題、刻度標籤以及其他註解型資訊。
在pandas中,我們有多列資料,還有行和列標籤。pandas自身就有內建的方法,用於簡化從DataFrame和Series繪製圖形。另一個庫seaborn(https://seaborn.pydata.org/),由Michael Waskom建立的靜態圖形庫。Seaborn簡化了許多常見可視型別的建立。

線型圖

Series和DataFrame都有一個用於生成各類圖表的plot方法。預設情況下,它們所生成的是線型圖
plot引數的完整列表請參見表

DataFrame的plot方法會在一個subplot中為各列繪製一條線,並自動建立圖例

柱狀圖

plot.bar()和plot.barh()分別繪製水平和垂直的柱狀圖。這時,Series和DataFrame的索引將會被用作X(bar)或Y(barh)刻度

直方圖和密度圖

直方圖(histogram)是一種可以對值頻率進行離散化顯示的柱狀圖。資料點被拆分到離散的、間隔均勻的面元中,繪製的是各面元中資料點的數量。通過在Series使用plot.hist方法,我們可以生成一張直方圖
與此相關的一種圖表型別是密度圖,它是通過計算“可能會產生觀測資料的連續概率分佈的估計”而產生的。一般的過程是將該分佈近似為一組核(即諸如正態分佈之類的較為簡單的分佈)。因此,密度圖也被稱作KDE(Kernel Density Estimate,核密度估計)圖。使用plot.kde和標準混合正態分佈估計即可生成一張密度圖
tips['tip_pct'].plot.hist(bins=50)
tips['tip_pct'].plot.density()

小結

還有很多關於繪圖的細節,時間原因沒有一一細看,具體需要學習的時候再反過頭來閱讀吧

pandas的大部分繪圖方法都有一個可選的ax引數,它可以是一個matplotlib的subplot物件。這使你能夠在網格佈局中更為靈活地處理subplot的位置