8.5 簡單的散點圖
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
本節(jié)是《Python 數(shù)據(jù)科學(xué)手冊》(Python Data Science Handbook)的摘錄。
另一種常用的繪圖類型是簡單的散點圖,是折線圖的近親。這里的點并不由線連接,而是單獨表示的點,圓或其他形狀。我們首先為繪圖配置筆記本,并導(dǎo)入我們將使用的函數(shù):
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np
散點圖和plt.plot
在上一節(jié)中,我們查看了生成折線圖的plt.plot /ax.plot。事實證明,同樣的函數(shù)也可以生成散點圖:
x = np.linspace(0, 10, 30)
y = np.sin(x)
plt.plot(x, y, 'o', color='black');

函數(shù)調(diào)用中的第三個參數(shù)是一個字符,表示用于繪圖的符號類型。正如你可以指定選項,例如'-','--'`來控制線條樣式,標(biāo)記樣式有自己的一組短字符串代碼。完整的可用符號列表,可以在plt.plot``的文檔中找到,或者在Matplotlib 的在線文檔中看到。大多數(shù)選項非常直觀,我們將在這里展示一些更常見的:
rng = np.random.RandomState(0)
for marker in ['o', '.', ',', 'x', '+', 'v', '^', '<', '>', 's', 'd']:
plt.plot(rng.rand(5), rng.rand(5), marker,
label="marker='{0}'".format(marker))
plt.legend(numpoints=1)
plt.xlim(0, 1.8);

為了獲得更多選項,這些字符代碼可以與線條和顏色代碼一起使用,來繪制點以及連接它們的線:
plt.plot(x, y, '-ok');

plt.plot的附加關(guān)鍵字參數(shù),指定了線條和標(biāo)記的各種屬性:
plt.plot(x, y, '-p', color='gray',
markersize=15, linewidth=4,
markerfacecolor='white',
markeredgecolor='gray',
markeredgewidth=2)
plt.ylim(-1.2, 1.2);

plt.plot函數(shù)的這種靈活性支持各種可能的可視化選項??捎眠x項的完整說明,請參閱plt.plot文檔。
散點圖和plt.scatter
第二種更強大的創(chuàng)建散點圖的方法是plt.scatter函數(shù),它的用法與plt.plot函數(shù)非常相似:
plt.scatter(x, y, marker='o');

plt.scatter與plt.plot的主要區(qū)別是,它可用于創(chuàng)建散點圖,其中每個單獨的點的屬性(大小,填充顏色,邊緣顏色等)可以單獨控制,或映射到數(shù)據(jù)。
讓我們通過創(chuàng)建一個隨機散點圖,包含多種顏色和大小的點,來展示它。為了更好地查看重疊結(jié)果,我們還將使用alpha關(guān)鍵字來調(diào)整透明度:
rng = 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,
cmap='viridis')
plt.colorbar(); # show color scale

請注意,顏色參數(shù)自動映射到顏色標(biāo)度(此處由colorbar()命令顯示),size參數(shù)以像素為單位。通過這種方式,點的顏色和大小可用于在可視化中傳達信息,以便可視化多維數(shù)據(jù)。
例如,我們可能會使用來自 Scikit-Learn 的 Iris 數(shù)據(jù),其中每個樣本是三種類型的花朵中的一種,其花瓣和萼片的大小是仔細(xì)測量的:
from sklearn.datasets import load_iris
iris = load_iris()
features = iris.data.T
plt.scatter(features[0], features[1], alpha=0.2,
s=100*features[3], c=iris.target, cmap='viridis')
plt.xlabel(iris.feature_names[0])
plt.ylabel(iris.feature_names[1]);

我們可以看到,這個散點圖使我們能夠同時探索數(shù)據(jù)的四個不同維度:每個點的(x, y)位置對應(yīng)于萼片的長度和寬度,該點的大小與花瓣寬度有關(guān),并且顏色與花的特定種類有關(guān)。像這樣的多顏色和多特征散點圖,對于數(shù)據(jù)探索和展示都是有用的。
plot VS scatter:效率的注解
除了plt.plot和plt.scatter中提供的不同功能之外,為什么你選擇使用一個而不是另一個? 雖然對于少量數(shù)據(jù)而言并不重要,因為數(shù)據(jù)集大于幾千個點,plt.plot可能比plt.scatter明顯更高效。原因是plt.scatter能夠為每個點渲染不同的大小和/或顏色,因此渲染器必須執(zhí)行單獨構(gòu)建每個點的額外工作。
另一方面,在plt.plot中,點基本上總是彼此的克隆,因此確定點的外觀的工作,僅對整個數(shù)據(jù)集執(zhí)行一次。對于大型數(shù)據(jù)集,這兩者之間的差異可能會使性能大不相同,因此,對于大型數(shù)據(jù)集,plt.plot應(yīng)優(yōu)于plt.scatter。