今天我來給你講講Python的可視化技術。
可視化視圖都有哪些?
按照數據之間的關系,我們可以把可視化視圖划分為4類,它們分別是比較、聯系、構成和分布。我來簡單介紹下這四種關系的特點:
比較:比較數據間各類別的關系,或者是它們隨着時間的變化趨勢,比如折線圖;
聯系:查看兩個或兩個以上變量之間的關系,比如散點圖;
構成:每個部分占整體的百分比,或者是隨着時間的百分比變化,比如餅圖;
分布:關注單個變量,或者多個變量的分布情況,比如直方圖。
同樣,按照變量的個數,我們可以把可視化視圖划分為單變量分析和多變量分析。
-
單變量分析指的是一次只關注一個變量。比如我們只關注“身高”這個變量,來看身高的取值分布,而暫時忽略其他變量。
-
多變量分析可以讓你在一張圖上可以查看兩個以上變量的關系。比如“身高”和“年齡”,你可以理解是同一個人的兩個參數,這樣在同一張圖中可以看到每個人的“身高”和“年齡”的取值,從而分析出來這兩個變量之間是否存在某種聯系。
可視化的視圖可以說是分門別類,多種多樣,今天我主要介紹常用的10種視圖,包括了散點圖、折線圖、直方圖、條形圖、箱線圖、餅圖、熱力圖、蜘蛛圖、二元變量分布、成對關系。
散點圖
散點圖的英文叫做scatter plot,它將兩個變量的值顯示在二維坐標中,非常適合展示兩個變量之間的關系。當然,除了二維的散點圖,我們還有三維的散點圖。
我在上一講中給你簡單介紹了下Matplotlib這個工具,在Matplotlib中,我們經常會用到pyplot這個工具包,它包括了很多繪圖函數,類似Matlab的繪圖框架。在使用前你需要進行引用:
import matplotlib.pyplot as plt
在工具包引用后,畫散點圖,需要使用plt.scatter(x, y, marker=None)函數。x、y 是坐標,marker代表了標記的符號。比如“x”、“>”或者“o”。選擇不同的marker,呈現出來的符號樣式也會不同,你可以自己試一下。
下面三張圖分別對應“x”“>”和“o”。



除了Matplotlib外,你也可以使用Seaborn進行散點圖的繪制。在使用Seaborn前,也需要進行包引用:
import seaborn as sns
在引用seaborn工具包之后,就可以使用seaborn工具包的函數了。如果想要做散點圖,可以直接使用sns.jointplot(x, y, data=None, kind='scatter')函數。其中x、y是data中的下標。data就是我們要傳入的數據,一般是DataFrame類型。kind這類我們取scatter,代表散點的意思。當然kind還可以取其他值,這個我在后面的視圖中會講到,不同的kind代表不同的視圖繪制方式。
好了,讓我們來模擬下,假設我們的數據是隨機的1000個點。
# 數據准備
N = 1000
x = np.random.randn(N)
y = np.random.randn(N)
# 用Matplotlib畫散點圖
plt.scatter(x, y,marker='x')
plt.show()
# 用Seaborn畫散點圖
df = pd.DataFrame({'x': x, 'y': y})
sns.jointplot(x="x", y="y", data=df, kind='scatter');
plt.show()
我們運行一下這個代碼,就可以看到下面的視圖(第一張圖為Matplotlib繪制的,第二張圖為Seaborn繪制的)。其實你能看到Matplotlib和Seaborn的視圖呈現還是有差別的。Matplotlib默認情況下呈現出來的是個長方形。而Seaborn呈現的是個正方形,而且不僅顯示出了散點圖,還給了這兩個變量的分布情況。
Matplotlib繪制:

Seaborn繪制:

折線圖
折線圖可以用來表示數據隨着時間變化的趨勢。
在Matplotlib中,我們可以直接使用plt.plot()函數,當然需要提前把數據按照X軸的大小進行排序,要不畫出來的折線圖就無法按照X軸遞增的順序展示。
在Seaborn中,我們使用sns.lineplot (x, y, data=None)函數。其中x、y是data中的下標。data就是我們要傳入的數據,一般是DataFrame類型。
這里我們設置了x、y的數組。x數組代表時間(年),y數組我們隨便設置幾個取值。下面是詳細的代碼。
# 數據准備
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]
y = [5, 3, 6, 20, 17, 16, 19, 30, 32, 35]
# 使用Matplotlib畫折線圖
plt.plot(x, y)
plt.show()
# 使用Seaborn畫折線圖
df = pd.DataFrame({'x': x, 'y': y})
sns.lineplot(x="x", y="y", data=df)
plt.show()
然后我們分別用Matplotlib和Seaborn進行畫圖,可以得到下面的圖示。你可以看出這兩個圖示的結果是完全一樣的,只是在seaborn中標記了x和y軸的含義。


直方圖
直方圖是比較常見的視圖,它是把橫坐標等分成了一定數量的小區間,這個小區間也叫作“箱子”,然后在每個“箱子”內用矩形條(bars)展示該箱子的箱子數(也就是y值),這樣就完成了對數據集的直方圖分布的可視化。
在Matplotlib中,我們使用plt.hist(x, bins=10)函數,其中參數x是一維數組,bins代表直方圖中的箱子數量,默認是10。
在Seaborn中,我們使用sns.distplot(x, bins=10, kde=True)函數。其中參數x是一維數組,bins代表直方圖中的箱子數量,kde代表顯示核密度估計,默認是True,我們也可以把kde設置為False,不進行顯示。核密度估計是通過核函數幫我們來估計概率密度的方法。
這是一段繪制直方圖的代碼。
# 數據准備
a = np.random.randn(100)
s = pd.Series(a)
# 用Matplotlib畫直方圖
plt.hist(s)
plt.show()
# 用Seaborn畫直方圖
sns.distplot(s, kde=False)
plt.show()
sns.distplot(s, kde=True)
plt.show()
我們創建一個隨機的一維數組,然后分別用Matplotlib和Seaborn進行直方圖的顯示,結果如下,你可以看出,沒有任何差別,其中最后一張圖就是kde默認為Ture時的顯示情況。



熱力圖
熱力圖,英文叫heat map,是一種矩陣表示方法,其中矩陣中的元素值用顏色來代表,不同的顏色代表不同大小的值。通過顏色就能直觀地知道某個位置上數值的大小。另外你也可以將這個位置上的顏色,與數據集中的其他位置顏色進行比較。
熱力圖是一種非常直觀的多元變量分析方法。
我們一般使用Seaborn中的sns.heatmap(data)函數,其中data代表需要繪制的熱力圖數據。
這里我們使用Seaborn中自帶的數據集flights,該數據集記錄了1949年到1960年期間,每個月的航班乘客的數量。
# 數據准備
flights = sns.load_dataset("flights")
data=flights.pivot('year','month','passengers')
# 用Seaborn畫熱力圖
sns.heatmap(data)
plt.show()
通過seaborn的heatmap函數,我們可以觀察到不同年份,不同月份的乘客數量變化情況,其中顏色越淺的代表乘客數量越多,如下圖所示:

成對關系
如果想要探索數據集中的多個成對雙變量的分布,可以直接采用sns.pairplot()函數。它會同時展示出DataFrame中每對變量的關系,另外在對角線上,你能看到每個變量自身作為單變量的分布情況。它可以說是探索性分析中的常用函數,可以很快幫我們理解變量對之間的關系。
pairplot函數的使用,就好像我們對DataFrame使用describe()函數一樣方便,是數據探索中的常用函數。
這里我們使用Seaborn中自帶的iris數據集,這個數據集也叫鳶尾花數據集。鳶尾花可以分成Setosa、Versicolour和Virginica三個品種,在這個數據集中,針對每一個品種,都有50個數據,每個數據中包括了4個屬性,分別是花萼長度、花萼寬度、花瓣長度和花瓣寬度。通過這些數據,需要你來預測鳶尾花卉屬於三個品種中的哪一種。
# 數據准備
iris = sns.load_dataset('iris')
# 用Seaborn畫成對關系
sns.pairplot(iris)
plt.show()
這里我們用seaborn中的pairplot函數來對數據集中的多個雙變量的關系進行探索,如下圖所示。從圖上你能看出,一共有sepal_length、sepal_width、petal_length和petal_width4個變量,它們分別是花萼長度、花萼寬度、花瓣長度和花瓣寬度。

