python數(shù)據(jù)可視化Seaborn繪制山脊圖
1. 引言
山脊圖一般由垂直堆疊的折線圖組成,這些折線圖中的折線區(qū)域間彼此重疊,此外它們還共享相同的x軸.
山脊圖經(jīng)常以一種相對不常見且非常適合吸引大家注意力的緊湊圖的形式表現(xiàn)。觀察上圖,我們給其起名叫Ridge plot是
非常恰當(dāng)?shù)?因?yàn)樯鲜鰣D表看起來確實(shí)很像山的脊背.此外,上述圖像還有另一個稱呼叫做Joy Plots–這主要是因?yàn)?code>Joy Division樂隊在如下專輯封面上采用了這種可視化形式.
2. 舉個栗子
在介紹完山脊圖的由來背景后,現(xiàn)在讓我們來舉個例子。我們使用以下數(shù)據(jù)集,主要包含 Netflix
的作品及對應(yīng)的 IMDB
分?jǐn)?shù)。
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
運(yùn)行結(jié)果如下:
上表中從左往右,依次為ID,電影名稱,電影類型,首映日期,電影長度,IMDB評分,以及電影語種.
接下來我們首先使用 Seaborns FacetGrid
庫來為每個語言類別的電影創(chuàng)建不同IMDB下的概率密度分布曲線圖。實(shí)現(xiàn)這個功能很簡單,僅需要對數(shù)據(jù)表中相應(yīng)名稱字段來按值進(jìn)行分組統(tǒng)計即可。
代碼如下:
sns.set_theme(style="white") g = sns.FacetGrid(df_filtered, row="Language") g.map_dataframe(sns.kdeplot, x="IMDB Score") g.set(ylabel="")
結(jié)果如下:
上述實(shí)現(xiàn)采用的為默認(rèn)的參數(shù)配置,橫軸表示IMDB
分?jǐn)?shù),縱軸表示對應(yīng)不同語種電影在不同IMDB得分下的概率. 從上述圖例中可以看出單個語種電影評分的概率密度分布,但是很難查看不同語種間的對比分布。
接著我們嘗試來改進(jìn)顯示效果,我們通過設(shè)置FacetGrid
函數(shù)中相應(yīng)的參數(shù)來讓圖表變得更寬更短。
代碼如下:
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="")
結(jié)果如下:
上述改進(jìn)雖然可以讓數(shù)據(jù)間的對比變得明顯一些,但是這個可視化從視覺效果上看并沒有太大的吸引力。
觀察上圖,我們其實(shí)并沒有多少人去關(guān)注左側(cè)的Y軸信息,我們更關(guān)注的是數(shù)據(jù)的形狀.這就意味著我們這里可以刪除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)
運(yùn)行結(jié)果如下:
3.山脊圖
經(jīng)過我們的優(yōu)化,上述不同語種電影的IMDB
得分概率密度分布還是不夠直觀.
接下來我們一步一步來介紹我們的終結(jié)法寶–山脊圖.
首先,我們需要確保背景是透明的。
sns.set_theme(style="white", rc={"axes.facecolor": (0, 0, 0, 0)})
接著,我們需要填充線條的內(nèi)部區(qū)域。
g.map_dataframe(sns.kdeplot, x="IMDB Score", fill=True, alpha=1)
上述操作后,不同語種間的區(qū)域會出現(xiàn)重疊,這時我們還需要區(qū)分重疊部分。
我們通過以下代碼進(jìn)行區(qū)分:
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)
運(yùn)行結(jié)果如下:
到目前位置,我們實(shí)現(xiàn)了我們第一版的山脊圖,接著我們可以根據(jù)需要來自定義擴(kuò)展它。FacetGrid
函數(shù)非常適合創(chuàng)建多個可視化圖例,并且 .map 和 .map_dataframe
方法可以讓我們與所有子圖進(jìn)行交互。
代碼如下:
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)
運(yùn)行結(jié)果如下:
4.擴(kuò)展
最后,我們可以使用下面代碼來復(fù)制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')
運(yùn)行結(jié)果如下:
5.結(jié)論
總的來說,山脊圖非常適合關(guān)注數(shù)據(jù)的分布對比。山脊圖以吸引人的美學(xué)可以引起觀眾的共鳴,使它們成為向用戶介紹數(shù)據(jù)分布對比分析時的絕佳選擇。
到此這篇關(guān)于python數(shù)據(jù)可視化Seaborn繪制山脊圖的文章就介紹到這了,更多相關(guān)Seaborn繪制山脊圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas使用fillna函數(shù)填充NaN值的代碼實(shí)例
最近在工作中遇到一個問題,pandas讀取的數(shù)據(jù)中nan在保存后變成空字符串,所以下面這篇文章主要給大家介紹了關(guān)于pandas使用fillna函數(shù)填充NaN值的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07Python進(jìn)階之利用+和*進(jìn)行列表拼接
在我們學(xué)習(xí)python的過程中,有一個非常常見的語法,那就是利用+和*進(jìn)行序列的拼接以及其他操作。今天就帶大家從使用+和*進(jìn)行拼接出發(fā)認(rèn)識一個大家非常容易犯的代碼錯誤。話不多說我們開始吧2023-04-04pytorch常用函數(shù)定義及resnet模型修改實(shí)例
這篇文章主要為大家介紹了pytorch常用函數(shù)定義及resnet模型修改實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Python Web開發(fā)模板引擎優(yōu)缺點(diǎn)總結(jié)
這篇文章主要介紹了Python Web開發(fā)模板引擎優(yōu)缺點(diǎn)總結(jié),需要的朋友可以參考下2014-05-05Django項目中使用JWT的實(shí)現(xiàn)代碼
這篇文章主要介紹了Django項目中使用JWT的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Python統(tǒng)計字符串中英文字母、空格、數(shù)字和其它字符的個數(shù)
這篇文章主要給大家介紹了關(guān)于Python統(tǒng)計字符串中英文字母、空格、數(shù)字和其它字符的個數(shù)的相關(guān)資料,本文實(shí)例講述了python統(tǒng)計字符串中指定字符出現(xiàn)次數(shù)的方法,需要的朋友可以參考下2023-06-06詳解python數(shù)據(jù)結(jié)構(gòu)之隊列Queue
這篇文章主要介紹了python數(shù)據(jù)結(jié)構(gòu)之隊列Queue,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05python光學(xué)仿真實(shí)現(xiàn)光線追跡之空間關(guān)系
這篇文章主要介紹了python光學(xué)仿真中實(shí)現(xiàn)光線追跡的空間關(guān)系示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10