python數據可視化Seaborn繪制山脊圖
1. 引言
山脊圖一般由垂直堆疊的折線圖組成,這些折線圖中的折線區域間彼此重疊,此外它們還共享相同的x軸.
山脊圖經常以一種相對不常見且非常適合吸引大傢註意力的緊湊圖的形式表現。觀察上圖,我們給其起名叫Ridge plot是
非常恰當的,因為上述圖表看起來確實很像山的脊背.此外,上述圖像還有另一個稱呼叫做Joy Plots–這主要是因為Joy Division
樂隊在如下專輯封面上采用瞭這種可視化形式.
2. 舉個栗子
在介紹完山脊圖的由來背景後,現在讓我們來舉個例子。我們使用以下數據集,主要包含 Netflix
的作品及對應的 IMDB
分數。
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd df = pd.read_csv('./data/film.csv') languages = ['English', 'Hindi', 'Spanish', 'French', 'Italian', 'Portuguese'] df_filtered = df[df['Language'].isin(languages)] df_filtered
運行結果如下:
上表中從左往右,依次為ID,電影名稱,電影類型,首映日期,電影長度,IMDB評分,以及電影語種.
接下來我們首先使用 Seaborns FacetGrid
庫來為每個語言類別的電影創建不同IMDB下的概率密度分佈曲線圖。實現這個功能很簡單,僅需要對數據表中相應名稱字段來按值進行分組統計即可。
代碼如下:
sns.set_theme(style="white") g = sns.FacetGrid(df_filtered, row="Language") g.map_dataframe(sns.kdeplot, x="IMDB Score") g.set(ylabel="")
結果如下:
上述實現采用的為默認的參數配置,橫軸表示IMDB
分數,縱軸表示對應不同語種電影在不同IMDB得分下的概率. 從上述圖例中可以看出單個語種電影評分的概率密度分佈,但是很難查看不同語種間的對比分佈。
接著我們嘗試來改進顯示效果,我們通過設置FacetGrid
函數中相應的參數來讓圖表變得更寬更短。
代碼如下:
sns.set_theme(style="white") g = sns.FacetGrid(df_filtered, row="Language", aspect=9, height=1.2) g.map_dataframe(sns.kdeplot, x="IMDB Score") g.set(ylabel="")
結果如下:
上述改進雖然可以讓數據間的對比變得明顯一些,但是這個可視化從視覺效果上看並沒有太大的吸引力。
觀察上圖,我們其實並沒有多少人去關註左側的Y軸信息,我們更關註的是數據的形狀.這就意味著我們這裡可以刪除Y軸.
代碼如下:
sns.set_theme(style="white") g = sns.FacetGrid(df_filtered, row="Language", aspect=9, height=1.2) g.map_dataframe(sns.kdeplot, x="IMDB Score") g.set_titles("") g.set(yticks=[],ylabel="") g.despine(left=True)
運行結果如下:
3.山脊圖
經過我們的優化,上述不同語種電影的IMDB
得分概率密度分佈還是不夠直觀.
接下來我們一步一步來介紹我們的終結法寶–山脊圖.
首先,我們需要確保背景是透明的。
sns.set_theme(style="white", rc={"axes.facecolor": (0, 0, 0, 0)})
接著,我們需要填充線條的內部區域。
g.map_dataframe(sns.kdeplot, x="IMDB Score", fill=True, alpha=1)
上述操作後,不同語種間的區域會出現重疊,這時我們還需要區分重疊部分。
我們通過以下代碼進行區分:
sns.set_theme(style="white", rc={"axes.facecolor": (0, 0, 0, 0)}) g = sns.FacetGrid(df_filtered, row="Language", aspect=9, height=1.2) g.map_dataframe(sns.kdeplot, x="IMDB Score", fill=True, alpha=1) g.map_dataframe(sns.kdeplot, x="IMDB Score", color='black') g.fig.subplots_adjust(hspace=-.5) g.set_titles("") g.set(yticks=[]) g.despine(left=True)
運行結果如下:
到目前位置,我們實現瞭我們第一版的山脊圖,接著我們可以根據需要來自定義擴展它。FacetGrid
函數非常適合創建多個可視化圖例,並且 .map 和 .map_dataframe
方法可以讓我們與所有子圖進行交互。
代碼如下:
sns.set_theme(style="white", rc={"axes.facecolor": (0, 0, 0, 0), 'axes.linewidth':2}) palette = sns.color_palette("Set2", 12) g = sns.FacetGrid(df_filtered, palette=palette, row="Language", hue="Language", aspect=9, height=1.2) g.map_dataframe(sns.kdeplot, x="IMDB Score", fill=True, alpha=1) g.map_dataframe(sns.kdeplot, x="IMDB Score", color='black') def label(x, color, label): ax = plt.gca() ax.text(0, .2, label, color='black', fontsize=13, ha="left", va="center", transform=ax.transAxes) g.map(label, "Language") g.fig.subplots_adjust(hspace=-.5) g.set_titles("") g.set(yticks=[], xlabel="IMDB Score") g.despine( left=True) plt.suptitle('Netflix Originals - IMDB Scores by Language', y=0.98)
運行結果如下:
4.擴展
最後,我們可以使用下面代碼來復制Joy Division
專輯封面的可視化效果。
代碼如下:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt if __name__ == "__main__": url = "./data/pulsar.csv" df = pd.read_csv(url, header=None) df = df.stack().reset_index() df.columns = ['idx', 'x', 'y'] sns.set_theme(rc={"axes.facecolor": (0, 0, 0, 0), 'figure.facecolor':'#000000', 'axes.grid':False}) g = sns.FacetGrid(df, row='idx', aspect=50, height=0.4) # Draw the densities in a few steps g.map(sns.lineplot, 'x', 'y', clip_on=False, alpha=1, linewidth=1.5) g.map(plt.fill_between, 'x', 'y', color='#000000') g.map(sns.lineplot, 'x', 'y', clip_on=False, color='#ffffff', lw=2) # Set the subplots to overlap g.fig.subplots_adjust(hspace=-0.95) g.set_titles("") g.set(yticks=[], xticks=[], ylabel="", xlabel="") g.despine(bottom=True, left=True) plt.savefig('joy.png', facecolor='#000000')
運行結果如下:
5.結論
總的來說,山脊圖非常適合關註數據的分佈對比。山脊圖以吸引人的美學可以引起觀眾的共鳴,使它們成為向用戶介紹數據分佈對比分析時的絕佳選擇。
到此這篇關於python數據可視化Seaborn繪制山脊圖的文章就介紹到這瞭,更多相關Seaborn繪制山脊圖內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python的Matplotlib庫圖像復現學習
- python可視化分析的實現(matplotlib、seaborn、ggplot2)
- python matplotlib各種畫圖
- Python利用Seaborn繪制多標簽的混淆矩陣
- python 利用matplotlib在3D空間中繪制平面的案例