給妹子講python-S02E06matplotlib散點圖、頻次直方圖與誤差線圖
python,不管你懂沒懂,反正妹子是搞懂了
轉載請註明:知乎專欄《給妹子講python》--醬油哥
【要點搶先看】
1.散點圖的畫法舉例2.頻次直方圖的畫法舉例3.誤差線圖的畫法舉例
【妹子說】今天我們繼續學習matplotlib繪圖的相關內容嘛~
對,在這一集,我們介紹在數據分析中使用非常高頻的幾種圖的形式。
首先說散點圖,散點圖和線形圖最大的區別,顧名思義就是這種圖形不再由線段進行連接,而是由一個一個獨立的點、圓圈或者其他指定的形狀構成:
import numpy as npimport matplotlib.pyplot as pltx = np.linspace(0,10,100)plt.scatter(x, np.sin(x), marker=o)plt.grid()plt.show()

【妹子說】如果我們使用上一集中介紹的線形圖的繪製方法,在指定線型的情況下,一樣可以畫出這個圖來,那為什麼要單獨再學一個新的函數呢?
這個問題問的好,因為我這個例子舉的過於簡單,沒能體現其優勢。實質上,使用plt.sactter相比plt.plot在創建散點圖時的優勢是具有更高的靈活性,他可以單獨控制每一個散點的不同屬性(顏色、大小等),這樣就可以通過(坐標位置、顏色、大小)這些多維信息,來表徵更多的數據特徵,並進行更精細的控制。
我們來繪製這樣一組散點圖,每個點的位置坐標(x,y)是服從標準正態分布的隨機值,點的顏色灰度值是位於(0,1)空間中的隨機樣本,點的大小是隨機值得1000倍,單位是像素。這樣通過位置、大小、顏色等多維信息,就能更豐富的表現出散點數據背後所蘊含的多重信息了。
import numpy as npimport matplotlib.pyplot as pltrng = np.random.RandomState(0)x = rng.randn(100)y = rng.randn(100)colors = rng.rand(100)sizes = 1000 * rng.rand(100)plt.scatter(x,y,c=colors,s=sizes,alpha=0.3)plt.colorbar()plt.grid(True)plt.show()

從圖中,我們可以直觀看出散點的大小所對應的數量信息,右側添加的顏色條,同來指示顏色所對應的數值信息。這類多顏色與多特徵的散點圖在探索與演示數據時非常有用。
第二類我們要說的圖形類型是頻次直方圖。
我們先畫一個最簡單的頻次直方圖,生成1000個服從標準正態分布的隨機變數,然後觀察他們在每個點的出現次數。
import numpy as npimport matplotlib.pyplot as pltdata = np.random.randn(1000)ret = plt.hist(data)print(ret)plt.show()(array([ 15., 39., 88., 188., 216., 200., 123., 84., 36., 11.]), array([-2.68292233, -2.1248507 , -1.56677908, -1.00870746, -0.45063583, 0.10743579, 0.66550742, 1.22357904, 1.78165067, 2.33972229, 2.89779391]), <a list of 10 Patch objects>)

仔細琢磨一下其實會有一些疑問,這個圖裡面只有10個數據條,但是很顯然1000個隨機變數的取值顯然不止10個。在默認情況下,hist函數會將所有的隨機變數取值劃分為10個取值範圍,然後統計每個取值範圍內的變數數,並繪就此圖。
我們可以從程序結果看出,hist函數是有返回值的,返回的是一個2元元組,元組第一個ndarray對象是數據條的高度序列,元組第二個ndarray對象是每個數據條的邊緣橫坐標。
其實如果我們只想得到上述返回數據,而並不想畫圖,那麼可以用下面的方法即可。
import numpy as npimport matplotlib.pyplot as pltdata = np.random.randn(1000)ret = np.histogram(data)print(ret)plt.show()(array([ 11, 36, 81, 179, 216, 209, 164, 71, 27, 6], dtype=int64), array([-2.83330638, -2.25443586, -1.67556534, -1.09669482, -0.5178243 , 0.06104622, 0.63991674, 1.21878726, 1.79765778, 2.3765283 , 2.95539882]))
那麼我們可以通過指定hist函數中的一些參數,來個性化的調整頻次直方圖的顯示效果。
通過bins參數可以指定數據條的個數;normed可以指定是否將頻數進行標準化,alpha指定透明度;還有histtype、color、edgecolor等線性、顏色等參數
import numpy as npimport matplotlib.pyplot as pltdata = np.random.randn(1000)plt.hist(data, bins=40, normed=True, alpha=0.5, histtype=stepfilled,color=steelblue)plt.grid(True)plt.show()

結合頻次直方圖中的透明度這個參數,我們再來多做做文章,比如,我們想對不同均值、方差分布特徵的正態分布隨機變數進行對比,那該怎麼做?顯然我們想到的是把不同的幾個正態分布圖畫在一張圖裡進行比較。
import numpy as npimport matplotlib.pyplot as pltdata1 = np.random.normal(0, 0.8, 1000)data2 = np.random.normal(-2, 1, 1000)data3 = np.random.normal(3, 2, 1000)plt.grid(True)kwargs = dict(histtype=stepfilled, alpha=0.5, normed=True, bins=40)plt.hist(data1, **kwargs)plt.hist(data2, **kwargs)plt.hist(data3, **kwargs)plt.show()

最後我們來介紹基本誤差線圖
我們在圖上畫50個散點,然後每個點的誤差設定為一個隨機值,滿足標準正態分布。同時作為對照,我們在另一個圖中設置每個點的誤差值為一個標量常數而非隨機數組。當然這個例子可能沒有什麼物理意義,只是來演示一下這種圖怎麼畫
import numpy as npimport matplotlib.pyplot as pltx = np.linspace(0, 10, 50)dy = np.random.normal(0, 1, 50)y = np.sin(x) + dy*np.random.randn(50)plt.subplot(211)plt.errorbar(x, y, yerr=dy, fmt=.k)plt.grid(True)plt.subplot(212)plt.errorbar(x, y, yerr=0.8, fmt=o)plt.grid(True)plt.show()

【妹子說】這兩集,我確實學到了幾種基本的繪圖方法,但是印象中我之前所見到的很多數據可視化圖表貌似比這還要更複雜一些呢~
說的沒錯,不過也別著急,在下一集,我們再深入到一些常用的繪圖細節中一探究竟,進一步豐富我們的繪圖技巧。
推薦閱讀:
※阿里數據招人啦
※Numpy和Pandas---數據分析的梯子
※大數據時代的小人物
※python入門第一課——安裝python和編譯器
※R語言實戰第三四章內容學習及心得
