1. 程式人生 > >使用Seaborn繪圖

使用Seaborn繪圖

今天,總結Seaborn畫圖,其實直接網上搜索Seaborn畫圖的部落格有很多,但是很多都是直接把說明文件羅列一下,
我這裡舉個例子說明下我使用Seaborn要解決的一個具體問題。
(先列下提綱,以後補充~)

問題描述

有100樣本,每個樣本8個屬性的資料,如下圖:

我需要畫出這些資料。

Seaborn函式的標籤與API規律

檢視Seaborn官網的API,可以看到整個Seaborn畫圖的實際繪畫模組只有
以下七個標籤:

  • Axis grids
  • Categorical plots
  • Distribution plots
  • Regression plots
  • Matrix plots
  • Timeseries plots
  • Miscellaneous plots

而且每個標籤裡面的子函式傳入引數非常類似,只要掌握一個,其他的直接改下函式名字即可畫出來,因此實際
學習Seaborn畫圖只要看七個函式說明即可!

我畫圖時主要用到了其中的Categorical plots模組下的函式。下面主要以seaborn.stripplot函式為例子說明如下:

seaborn.stripplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, jitter=False, dodge=False, orient=None, color=None, palette=None, size=5, edgecolor='gray', linewidth=0, ax=None, **kwargs)

這個函式的最關鍵的引數就是前4個引數,後面的引數都是微調的問題。

  • x引數代表繪圖的橫座標的資料標籤項
  • y引數代表繪圖的縱座標的資料標籤項
  • hue引數代表同一個x下多標籤的資料標籤項
  • data引數代表輸入資料,一般格式都是DataFrame的形式。

我們可以看一個Seaborn自帶的例子,將資料讀取,然後儲存成excel檔案並開啟觀察
(這裡順便吐槽一下,DataFrame資料結構實在是太好用、太方便了,可以讀取/儲存成各種資料格式,
並且操作資料非常方便,下週週末要總結一下!),程式碼如下:

    import seaborn as sns
    import pandas as
pd import matplotlib.pyplot as plt tips = sns.load_dataset("tips") #讀取seaborn自帶的一個測試資料 tips.to_excel('tips.xlsx') #儲存成excel檔案,進行觀察

得到的資料如下圖:

Seaborn資料tips的例子圖片

可以看到這是一個典型的打了標籤的資料集,這個資料僅僅輸入一句程式碼:

sns.stripplot(x="sex", y="total_bill", hue="day",data=tips)

即可得到如下圖所示的資料散點圖:

Seaborn例子圖片

我們仔細觀察圖片,發現該圖實際上橫座標是sex標籤,縱座標是total_bill標籤,而圖示是根據day標籤進行分類繪製的。
但是我們在實際操作資料時,一般原始資料都沒有打標籤,就像是我一開始給出的資料集那樣,每個屬性都是一個數值,但是我們想要看每個屬性的分佈圖,即:x軸上是屬性標籤,這時我們就需要簡單處理一下我們的資料了。

進行資料預處理

對於給出的資料,我們只需要寫一個簡單的函式即可:

    data = [];
    for j in range(df.iloc[:,0].size):
        LineSeries = df.iloc[j]  #得到行的序列
        for k in range(LineSeries.size):
            data.append((LineSeries[k],LineSeries.index[k]))
            #下面一行絕對不要用,DataFrame絕對不要動態加行列!!!!
#            Drawdf.loc[Drawdf.iloc[:,0].size] = [LineSeries[k],LineSeries.index[k],strList[i]]
    DataToDraw = pd.DataFrame(columns=('value','property'),data =data)
    return DataToDraw

這樣,我們根據函式返回的資料,即可直接帶入Seaborn相關的函式進行繪圖。

呼叫函式並得到結果

我們可以直接呼叫多個函式,裡面的引數都是一樣的

    df = pd.read_excel("test.xlsx")
    dfToDraw = generateDrawDF(df)
    plt.figure()
    sns.boxplot(x='property',y='value',data = dfToDraw) #繪製不同屬性分佈的箱圖
    plt.figure()
    sns.violinplot(x='property',y='value',data = dfToDraw) #繪製不同屬性小提琴圖

比如箱圖和小提琴圖(小提琴是箱線圖和密度分佈的一個組合),圖如下所示:

繪製箱圖的例子

繪製小提琴圖的例子

最後,本篇的全部程式碼在下面這個網頁可以下載: