首頁 > 軟體

Python如何實現視覺化

2021-05-18 10:30:24

說到視覺化,可能第一印象想到的是Tableau。不過Python和Tableau是兩種完全不同的資料視覺化的工具。同時,Python有自己的一定優勢,本身具備強大的視覺化功能。

Python是一種計算機程式設計語言,由吉多·範羅蘇姆創造,第一版釋出於1991年。

Python提供了高效的高階資料結構,還能簡單有效地面向物件程式設計。其直譯器易於擴展,可以使用C或C++擴展新的功能和資料類型,也可用於可定製化軟體中的擴展程式語言。

Python是一種程式語言,裡面有很多可以呼叫的資料視覺化的包,這些包生成的圖表可以嵌入到網頁上,就成了我們平時在網上看到的各種資料圖。這些圖後面的資料通常都是高度計算整合後的資料,資料量比較少。

通常把原始資料匯入Python之後,是需要在Python裡面做很多資料處理和分析的,分析完的結果才會利用這些視覺化的包給呈現出來。在Python裡面做分析其實主要還是前期的資料處理和準備,視覺化只是最後一環,當然也不排除中途利用一些圖表來輔助分析。而且做出來這些圖表之後,也需要把這些圖表整合來呈現一個整體的結論。

Python裡面常用的視覺化的包有:

MatplotlibSeabornggplotPlotlyGeoplotlib資料視覺化是資料處理工作中的一個重要部分,在項目早期階段,我們常常需要做很多資料分析來深入瞭解資料。創建資料視覺化能幫我們更清楚和容易的理解資料集,特別是高維度資料集。

Matplotlib 是一個很受歡迎的 Python 程式庫,用它可以很容易的創建資料視覺化。不過,每次開展新項目時我們都要設定資料、參數、圖表和繪圖等,這會非常麻煩和混亂。

我們會討論 5 種數字視覺化方式,用 Python 的 Matplotlib 程式庫為其寫一些快速又容易的函數。

散點圖

散點圖很適合顯示兩個變數之間的關係,因為你可以直接看到資料的初始分佈。你也可以將資料群組進行彩色編碼來檢視不同資料群組之間的關係,如下面第一幅圖所示。想要視覺化三個變數之間的關係?沒問題!只需利用其它參數,比如點尺寸,對第三個變數進行編碼。

現在講講程式碼部分。我們首先用命令別名「plt」匯入 Matplotlib 的 pyplot。我們呼叫 plt.subplots() 來創建一個新的圖表。我們向函數輸入 X 軸和 Y 軸資料,然後將它們傳入 ax.scatter() 中來繪出散點圖。我們同樣也可以設定點尺寸、點顏色和阿爾法透明處理。你甚至可以設定 Y 軸來獲得對數尺度,然後為圖形詳細設定名稱和軸標籤。可以看到用函數點對點地創建散點圖非常容易!

importmatplotlib.pyplotaspltimportnumpyasnpdefscatterplot(x_data,y_data,x_label="",y_label="",title="",color="r",yscale_log=False):# Create the plot object_,ax=plt.subplots()# Plot the data, set the size (s), color and transparency (alpha)# of the pointsax.scatter(x_data,y_data,s=10,color=color,alpha=0.75)ifyscale_log==True:ax.set_yscale('log')# Label the axes and provide a titleax.set_title(title)ax.set_xlabel(x_label)ax.set_ylabel(y_label)

線條圖

線條圖用起來非常方便,因為你可以清楚得看到兩個變數之間的巨大差異,也就是說它們有很高的協方差。我們可以清晰得看到所有的專業在各個時間段內所佔百分比有著巨大差異。如果將它們繪成散點圖,結果會非常混亂,這樣就很難理解資料。而線條圖很適合這種情況,因為能讓我們快速總結出兩個變數之間的協方差(百分比和時間點)。這裡我們仍可以通過彩色編碼進行分組。

下面是繪製線條圖的程式碼,和上面繪製散點圖的程式碼比較像,只是在變數上略微有些變動:

deflineplot(x_data,y_data,x_label="",y_label="",title=""):# Create the plot object_,ax=plt.subplots()# Plot the best fit line, set the linewidth (lw), color and# transparency (alpha) of the lineax.plot(x_data,y_data,lw=2,color='#539caf',alpha=1)# Label the axes and provide a titleax.set_title(title)ax.set_xlabel(x_label)ax.set_ylabel(y_label)

直方圖

直方圖非常有助於我們檢視(或發現)資料點的分佈。使用條形(不用其它方式,比如散點)能讓我們清晰得看到每個 bin 的頻率之間的相對差異,利用 bin(也就是數值離散化)能幫助我們看清「資料全局」,而如果我們沒有用 bin 將所有資料點進行離散處理,那麼視覺化後的資料中會存在很多噪聲,後續的資料處理工作會無從下手。

利用 Matplotlib 繪製直方圖的程式碼如下所示,這裡要注意兩個參數。第一個,參數 n_bins 決定我們在直方圖中使用多少個 bin,而 bin 的數目越多,我們獲取的資料資訊質量也就越好,但也有可能帶來噪聲,從而讓我們無法縱覽全局。第二個,參數 cumulative 是一個布爾值,能讓我們決定直方圖是否是累計直方圖,這基本上是在選擇概率密度函數(PDF)還是累積密度函數(CDF)。

defhistogram(data,n_bins,cumulative=False,x_label="",y_label="",title=""):_,ax=plt.subplots()ax.hist(data,n_bins=n_bins,cumulative=cumulative,color='#539caf')ax.set_ylabel(y_label)ax.set_xlabel(x_label)ax.set_title(title)

假如我們想比較資料中兩個變數的分佈狀況。可能有人會想,我們得做兩個獨立的直方圖,將它們放在一起進行比較。但是還有個更好的方式:我們可以用不同的透明度將兩個直方圖相互重疊。

在將直方圖相互重疊時,需要在程式碼中做些設定。首先我們設定水平距離以適應變數分佈。根據設定的範圍和理想數目的 bin,我們就可以計算每個 bin 的寬度。最後,我們可以在同一個圖中繪出這兩個直方圖,其中一個有著略高的透明度。

# Overlay 2 histograms to compare themdefoverlaid_histogram(data1,data2,n_bins=0,data1_name="",data1_color="#539caf",data2_name="",data2_color="#7663b0",x_label="",y_label="",title=""):# Set the bounds for the bins so that the two distributions are fairly comparedmax_nbins=10data_range=[min(min(data1),min(data2)),max(max(data1),max(data2))]binwidth=(data_range[1]-data_range[0])/max_nbinsifn_bins==0bins=np.arange(data_range[0],data_range[1]+binwidth,binwidth)else:bins=n_bins# Create the plot_,ax=plt.subplots()ax.hist(data1,bins=bins,color=data1_color,alpha=1,label=data1_name)ax.hist(data2,bins=bins,color=data2_color,alpha=0.75,label=data2_name)ax.set_ylabel(y_label)ax.set_xlabel(x_label)ax.set_title(title)ax.legend(loc='best')

柱狀圖

假如你想視覺化類別較少的分類資料(比如少於 10 個類別),柱狀圖是最有效的方式。不過,如果資料類別過多,會造成圖表中的條形非常混亂,這樣就無法理解資料。

之所以說柱狀圖適用於處理分類資料,是因為我們可以很容易的根據條形的大小看出各個類別之間的不同,而且資料類別也很容易區分和進行彩色編碼。我們一般會用到三種不同類型柱狀圖:常規柱狀圖、分組柱狀圖、堆積柱狀圖。下面我們依次看看這三種柱狀圖。

接著是分組柱狀圖,它能讓我們比較多個分組變數。如下面第二幅圖,我們正在比較的第一個變數是分數在每個組的變化狀況。我們也可以用彩色編碼比較性別。在程式碼中,y_data_list 變數當前實際上是一列列表,每個子列表表示一個數據組。然後我們在每個組中迴圈,對於每個組,我們在 X 軸上畫出和 ticker 對應的條形,並將每個組進行彩色編碼。

堆積柱狀圖很適合視覺化不同變數的分類組合。下面第三張圖即是堆積柱狀圖,我們比較了每天的伺服器載荷。將彩色編碼後的柱狀圖進行堆積,我們可以很容易得看到和理解每天哪些伺服器載荷最大,同所有時間段內的其它伺服器相比載荷如何。我們在每個組內迴圈,只是這次我們是在原來的圖形上方而不是邊繪製新的圖形。

本文我們用 Python 程式庫 Matplotlib 實現了幾種簡單迅速的資料視覺化。將抽象資料具體為程式設計函數會讓程式碼更容易閱讀和使用!希望本文能幫助你學會如何用 Python 進行高效的資料視覺化處理。


IT145.com E-mail:sddin#qq.com