1. 程式人生 > >從零開始學習Matplotlib(三)

從零開始學習Matplotlib(三)

文章目錄


有深度學習需求的小夥伴請點選原文連結【教程】第三章:圖例各類圖形,線上除錯程式碼,玩轉資料分析!

本章節是教程中最為重要的章節,本節我們將開始講述各種不同的plot的方式。之前我們講到了如何plot線,今天我們講述如何畫出散點圖、柱狀圖、等高線圖和image圖片。學完本章之後,小夥伴們就基本能夠應對工作和學習中大部分的畫圖場景啦。

本章知識點歸納如下:

1.散點圖:plt.scatter()

2.柱狀圖:plt.bar()

3.等高線圖:plt.contourf()

4.在等高線圖中增加label:plt.clabel()

5.矩陣畫圖:plt.imshow()

6.在隨機矩陣圖中增加colorbar:plt.colorbar()

散點圖

首先,先引入matplotlib.pyplot簡寫作plt,再引入模組numpy用來產生一些隨機資料。

import matplotlib.pyplot as plt
import numpy as np

n = 1024    # data size
X = np.random.normal(0, 1, n) # 每一個點的X值
Y = np.random.normal(0, 1, n) # 每一個點的Y值
T = np.arctan2(Y,X) # for color value

1.資料生成

生成1024個呈標準正態分佈的二維資料組 (平均數是0,方差為1) 作為一個數據集,並影象化這個資料集。每一個點的顏色值用T來表示:

2.畫圖:
資料集生成完畢,現在來用 plt.scatter 畫出這個點集,輸入X和Y作為location,size=75,顏色為T,color map用預設值,透明度alpha 為 50%。 x軸顯示範圍定位(-1.5,1.5),並向xtick()函式傳入空集()來隱藏x座標軸,y軸同理:

plt.scatter(X, Y, s=75, c=T, alpha=.5)

plt.xlim(-1.5, 1.5)
plt.xticks(())  # ignore xticks
plt.ylim(-1.5, 1.5)
plt.yticks(())  # ignore yticks

plt.show()

在這裡插入圖片描述

柱狀圖

柱狀圖是在資料分析過程中最為常用的圖表,折線圖和餅圖能夠表達的資訊,柱狀圖都能夠表達。在學術報告或工作場景下,大家應儘量使用柱狀圖來代替折線圖與餅圖。下面,我們就開始吧~

1.資料生成:
首先生成畫圖資料,向上向下分別生成2組資料,X為0到11的整數 ,Y是相應的均勻分佈的隨機資料。

2.畫圖:
使用的函式是plt.bar,引數為X和Y,X代表橫座標,即柱形的位置,Y代表縱座標,即柱形的高度。

import matplotlib.pyplot as plt
import numpy as np

n = 12
X = np.arange(n)
Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)

plt.bar(X, +Y1)
plt.bar(X, -Y2)

plt.xlim(-.5, n)
plt.xticks(())
plt.ylim(-1.25, 1.25)
plt.yticks(())

plt.show()

在這裡插入圖片描述
3.修改顏色和資料標籤
如果小夥伴們想要改變柱狀圖的顏色,並且希望每個柱形上方能夠顯示該項數值該怎麼做呢?我們可以用 plt.bar 函式中的facecolor引數設定柱狀圖主體顏色,用edgecolor引數設定邊框顏色;而函式 plt.text 可以幫助我們在柱體上方(下方)加上數值:用%.2f保留兩位小數,用ha='center’設定橫向居中對齊,用va='bottom’設定縱向底部(頂部)對齊。

plt.bar(X, +Y1, facecolor='#FFCCCC', edgecolor='white')
plt.bar(X, -Y2, facecolor='#6699CC', edgecolor='white')

for x, y in zip(X, Y1):
    # ha: horizontal alignment
    # va: vertical alignment
    plt.text(x, y , '%.2f' % y, ha='center', va='bottom')

for x, y in zip(X, Y2):
    # ha: horizontal alignment
    # va: vertical alignment
    plt.text(x, -y , '%.2f' % y, ha='center', va='top')

在這裡插入圖片描述

等高線圖

1.資料生成
資料集即三維點 (x,y) 和對應的高度值,共有256個點。高度值使用一個 height function f(x,y) 生成。 x, y 分別是在區間 [-3,3] 中均勻分佈的256個值,並用meshgrid在二維平面中將每一個x和每一個y分別對應起來,編織成柵格:

def f(x,y):
    # the height function
    return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 -y**2)

n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X,Y = np.meshgrid(x, y)

2.畫圖:
接下來進行顏色填充。使用函式plt.contourf把顏色加進去,位置引數分別為:X, Y, f(X,Y)。8代表等高線的密集程度,這裡被分為10個部分。如果是0,則影象被一分為二。透明度為0.75,並將 f(X,Y) 的值對應到color map的RdBu組中尋找對應顏色。大家可能並不能直觀理解 colormap ,它可以將顏色和數字進行對映。如果暫時不能理解的話也沒有關係,我們可以將其想象成matplotlib為我們提供的配色方案,大家可以檢視此連結選擇自己喜歡的配色方案應用在自己的圖上。

# use plt.contourf to filling contours
# X, Y and value for (X,Y) point
plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.RdBu)

在這裡插入圖片描述
接下來進行等高線繪製。使用plt.contour函式劃線。位置引數為:X, Y, f(X,Y)。顏色選黑色,線條寬度選0.5。現在的結果如下圖所示,只有顏色和線條,還沒有數值Label:

# use plt.contour to add contour lines
plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.RdBu)
C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=.5)

在這裡插入圖片描述
3.新增高度數字:
最後我們要通過 plt.clabel() 在等高線上加入高度數值,即加入Label,其中引數 inline 控制是否將 Label 畫線上裡面,fontsize 設定字型大小為10。並將座標軸隱藏:

plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.RdBu)
C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=.5)
plt.clabel(C, inline=True, fontsize=10)
plt.xticks(())
plt.yticks(())

在這裡插入圖片描述

隨機矩陣畫圖

這一節我們講解怎樣在matplotlib中打印出影象。這裡我們打印出的是純粹的數字,而非自然影象。

1.資料生成
首先生成一個 3x3 的 2D-array ,也就是三行三列的格子,array 中的每個值經過colormap與一個顏色對應並填充在格子中

a = np.array([0.313660827978, 0.365348418405, 0.423733120134,
              0.365348418405, 0.439599930621, 0.525083754405,
              0.423733120134, 0.525083754405, 0.651536351379]).reshape(3,3)

2.畫圖:
我們之前選cmap的引數時用的是:cmap=plt.cmap.RdBu,而現在,我們可以直接用單引號傳入引數。 origin='lower’代表的就是選擇的原點的位置。而 interpolation 表示畫圖方式,從該連結可看到matplotlib官網上對於內插法的不同方法的描述。這裡我們使用的是內插法中的 Nearest-neighbor 的方法,其他的方式也都可以隨意取選。

plt.imshow(a, interpolation='nearest', cmap='RdBu', origin='lower')

在這裡插入圖片描述
3.增加colorbar
下面我們新增一個colorbar ,它可以為我們顯示不同顏色的區塊所對應的具體數值。其中shrink引數可以用來調整 colorbar 的長度,這裡我們使colorbar的長度變短為原來的92%,這樣我們2D影象就建立完畢了:

plt.imshow(a, interpolation='nearest', cmap='RdBu', origin='lower')
plt.colorbar(shrink=.92)

plt.xticks(())
plt.yticks(())
plt.show()

在這裡插入圖片描述

練一練

現在,小夥伴們可以嘗試用上述方法對豆瓣電影資料集進行分析。請根據資料集中的表格’電影影評.csv’畫出電影星級分佈圖。橫座標為電影的評分星級,分別為1,2,3,4,5;縱座標為該星級下的電影數量。 提示:使用value_counts()函式對不同星級的電影數量進行計算

#答案:
import pandas as pd
data = pd.read_csv('/home/kesci/input/movie_douban/電影影評.csv')
data = data[data['星級']<=5]
data_distri = data['星級'].value_counts()
plt.figure(figsize=(6,4))
plt.bar(data_distri.index, data_distri.values)
plt.ylim(0, 60000)
#設定數值標籤
x = np.array(list(data_distri.index))
y = np.array(list(data_distri.values))
for a,b in zip(x,y):
    plt.text(a, b+500, '%.0f' % b, ha='center', va= 'bottom',fontsize=10)

在這裡插入圖片描述
上述文中所有程式碼部分都可以使用線上資料分析協作工具K-Lab復現,點選連結一鍵直達~

K-Lab提供基於Jupyter Notebook的線上資料分析服務,涵蓋Python&R等主流程式語言,可滿足資料科學家、人工智慧工程師、商業分析師等資料工作者線上完成資料處理、模型搭建、程式碼除錯、撰寫分析報告等資料分析全過程。