6個(gè)優(yōu)秀可視化Python庫(kù)
對(duì)使用哪個(gè)可視化工具感到困惑? 我為您分解了每個(gè)庫(kù)的優(yōu)缺點(diǎn)
動(dòng)機(jī)
如果您剛開(kāi)始使用Python可視化,可能會(huì)不知所措的庫(kù)和示例數(shù)量眾多:
- Matplotlib
- Seaborn
- Plotly
- Bokeh
- Altair
- Folium
如果您有一個(gè)等待可視化的DataFrame,應(yīng)該選擇哪一個(gè)? 在某些情況下,某些庫(kù)可能比其他庫(kù)更好。 本文將展示每種方法的優(yōu)缺點(diǎn)。 到本文結(jié)尾,您應(yīng)該能夠區(qū)分每個(gè)庫(kù)的不同功能,并可以更輕松地選擇優(yōu)秀庫(kù)。
我們將通過(guò)使用樣本數(shù)據(jù)集并使用每個(gè)庫(kù)對(duì)其進(jìn)行研究,著重于一些特定的屬性:
互動(dòng)性
您是否希望可視化是交互式的?
一些庫(kù)(例如Matplotlib)將可視化效果呈現(xiàn)為圖像。 因此,它們非常適合于解釋概念(在紙質(zhì),幻燈片或演示文稿中)。
另一方面,像Altair,Bokeh和Plotly這樣的庫(kù)可讓您創(chuàng)建交互式圖形,以便用戶(hù)可以深入并自己探索
語(yǔ)法和靈活性
每個(gè)庫(kù)的語(yǔ)法有何不同? Matplotlib等較低級(jí)的庫(kù)使您可以做想想得到的一切,但要付出更復(fù)雜的API的代價(jià)。 諸如Altair之類(lèi)的某些庫(kù)是非常聲明性的,這使映射到您的數(shù)據(jù)更加容易。
數(shù)據(jù)類(lèi)型和可視化
您是在處理特殊的用例,例如地理圖,具有大數(shù)據(jù)還是使用僅由特定庫(kù)支持的圖類(lèi)型?
數(shù)據(jù)
為了便于比較,我將使用本文從Github抓取的真實(shí)數(shù)據(jù):
我爬取了超過(guò)1k的優(yōu)秀機(jī)器學(xué)習(xí)Github配置文件,這就是我發(fā)現(xiàn)的
從Github上的優(yōu)秀機(jī)器學(xué)習(xí)資料中獲取見(jiàn)解
或從Datapane Blob獲取直接數(shù)據(jù)。
- import datapane as dp
- dp.Blob.get(name='github_data', owner='khuyentran1401').download_df()
如果要使用Blob,請(qǐng)記住預(yù)先使用令牌登錄Datapane。 此過(guò)程應(yīng)少于1分鐘
Matplotlib
Matplotlib可能是最常見(jiàn)的用于可視化數(shù)據(jù)的Python庫(kù)。 每個(gè)對(duì)數(shù)據(jù)科學(xué)感興趣的人都可能至少使用過(guò)Matplotlib。
優(yōu)點(diǎn)
1.容易看到數(shù)據(jù)的屬性
分析數(shù)據(jù)時(shí),快速查看分布可能是理想的。
例如,如果我想快速了解關(guān)注者最多的前100個(gè)用戶(hù)的分布,通常使用Matplotlib就足夠了。
- import matplotlib.pyplot as plt
- top_followers = new_profile.sort_values(by='followers', axis=0, ascending=False)[:100]
- fig = plt.figure()
- plt.bar(top_followers.user_name,
- top_followers.followers)
即使Matplotlib的x軸看起來(lái)不太好,通過(guò)查看圖表,我們也可以更好地理解數(shù)據(jù)的分布。
2.可以畫(huà)任何東西
Matplotlib具有多種用途,這意味著它可以繪制您可以想象的任何圖形。 Matplotlib的網(wǎng)站上包含非常全面的文檔和圖庫(kù)中的各種圖形,這使您可以輕松找到任何您能想到的瘋狂情節(jié)的教程。
像這樣的一些文字:
- fig = plt.figure()
- plt.text(0.6, 0.7, "learning", size=40, rotation=20.,
- ha="center", va="center",
- bbox=dict(boxstyle="round",
- ec=(1., 0.5, 0.5),
- fc=(1., 0.8, 0.8),
- )
- )
- plt.text(0.55, 0.6, "machine", size=40, rotation=-25.,
- ha="right", va="top",
- bbox=dict(boxstyle="square",
- ec=(1., 0.5, 0.5),
- fc=(1., 0.8, 0.8),
- )
- )
- plt.show()
缺點(diǎn)
Matplotlib可以繪制任何內(nèi)容,但繪制非基本圖或調(diào)整圖的外觀可能會(huì)很復(fù)雜。
- correlation = new_profile.corr()
- fig, ax = plt.subplots()
- im = plt.imshow(correlation)
- ax.set_xticklabels(correlation.columns)
- ax.set_yticklabels(correlation.columns)
- plt.setp(ax.get_xticklabels(), rotation=45, ha="right",
- rotation_mode="anchor")
即使該圖足以使分布可視化,但如果您想將數(shù)據(jù)表示給其他人,您仍需要固定x軸,y軸,這需要很多工作。 這是因?yàn)镸atplotlib具有非常低級(jí)的接口。
總結(jié):Matplotlib可以繪制任何東西,但是復(fù)雜的繪圖可能比其他庫(kù)需要更多的代碼
Seaborn
Seaborn是基于Matplotlib的Python數(shù)據(jù)可視化庫(kù)。 它在庫(kù)上提供了更高級(jí)別的包裝器,使其更易于使用。
優(yōu)點(diǎn)
1.更少的代碼
它為類(lèi)似的圖提供了更高級(jí)別的界面。 換句話說(shuō),seaborn通常提供與matplotlib類(lèi)似的圖,但是用更少的代碼和更好的設(shè)計(jì)。
我們使用與以前相同的數(shù)據(jù)來(lái)繪制圖的相似熱圖。
- correlation = new_profile.corr()
- sns.heatmap(correlation, annot=True)
我們無(wú)需設(shè)置x和y標(biāo)簽就可以獲得更好的熱圖!
2.使常用地塊更漂亮
當(dāng)涉及流行圖(例如條形圖,箱形圖,計(jì)數(shù)圖,直方圖等)時(shí),許多人選擇seaborn不僅是因?yàn)榭梢杂酶俚拇a來(lái)創(chuàng)建它們,而且它們看起來(lái)也更漂亮。 正如我們?cè)谏厦娴氖纠锌吹降?,顏色看起?lái)也比Matplotlib的默認(rèn)顏色更好。
- sns.set(style="darkgrid")
- titanic = sns.load_dataset("titanic")
- ax = sns.countplot(x="class", data=titanic)
缺點(diǎn)
Seaborn受到更多限制,并且沒(méi)有matplotlib那樣廣泛的集合
要點(diǎn):Seaborn是Matplotlib的更高版本。 盡管Seaborn并不像Matplotlib那樣具有廣泛的集合,但是它們卻可以用更少的代碼來(lái)使條形圖,箱形圖,熱圖等流行圖看起來(lái)很漂亮。
Plotly
Plotly的Python圖形庫(kù)使創(chuàng)建交互式,具有出版物質(zhì)量的圖形變得容易。 它還可以創(chuàng)建類(lèi)似于Matplotlib和seaborn的圖表,例如折線圖,散點(diǎn)圖,面積圖,條形圖等。
優(yōu)點(diǎn)
1. 像R
如果您喜歡R中的繪圖,并且在切換到Python時(shí)錯(cuò)過(guò)了它的功能,那么Plotly使用Python可以提供相同質(zhì)量的繪圖!
我最喜歡的是Plotly Express,因?yàn)樗娴暮苋菀?,而且用單行Python創(chuàng)建更好的圖甚至更快。
- fig = px.scatter(new_profile[:100],
- x='followers',
- y='total_stars',
- color='forks',
- size='contribution')
- fig.show()
2.易于創(chuàng)建交互式圖
使用Plotly還可以輕松創(chuàng)建交互式繪圖。 交互式繪圖不僅美觀,而且還使查看者更容易查看每個(gè)數(shù)據(jù)點(diǎn)。
還記得我們之前使用matplotlib制作的條形圖嗎? 讓我們看看Plotly的結(jié)果
- import plotly.express as px
- top_followers = new_profile.sort_values(by='followers', axis=0, ascending=False)[:100]
- fig = px.bar(top_followers,
- x='user_name',
- y='followers',
- )
- fig.show()
使用大約相同的代碼行,我們生成一個(gè)交互式繪圖,我們可以將鼠標(biāo)懸停在每個(gè)欄上,以查看該欄所代表的用戶(hù)和關(guān)注者數(shù)量。 這意味著可視化的使用者可以自己進(jìn)行瀏覽。
3.復(fù)雜的地塊變得容易
使用Plotly,可以輕松創(chuàng)建一些通常很難創(chuàng)建的圖。
例如,如果我們想創(chuàng)建一個(gè)地圖以可視化Github用戶(hù)的位置,我們可以找到他們的經(jīng)度和緯度,如下所示,然后使用該數(shù)據(jù)在地圖上發(fā)現(xiàn)用戶(hù)的位置,如下所示
- import plotly.express as px
- import datapane as dp
- location_df = dp.Blob.get(name='location_df', owner='khuyentran1401').download_df()
- m = px.scatter_geo(location_df, lat='latitude', lon='longitude',
- color='total_stars', size='forks',
- hover_data=['user_name','followers'],
- title='Locations of Top Users')
- m.show()
只需幾行代碼,所有用戶(hù)的位置就可以在地圖上精美呈現(xiàn)。 氣泡的顏色代表叉子的數(shù)量,大小代表星星的總數(shù)
缺點(diǎn)
盡管Plotly支持各種圖,但仍然缺少一些常見(jiàn)圖
例如,雖然seaborn具有sns.countplot()來(lái)計(jì)算數(shù)據(jù)中某個(gè)類(lèi)別的出現(xiàn)次數(shù),但Plotly沒(méi)有計(jì)數(shù)圖。 因此,我們需要預(yù)先執(zhí)行g(shù)roupby以便按類(lèi)對(duì)數(shù)據(jù)進(jìn)行分組。
- titanic = sns.load_dataset("titanic")
- # Group data by class
- titanic_groupby = titanic.groupby(by='class').count()
- fig = px.bar(titanic_groupby,
- y='survived',
- labels={'survived':'count'})
- fig.show()
我們需要更多代碼來(lái)創(chuàng)建計(jì)數(shù)圖,并且該圖不會(huì)像seaborn那樣自動(dòng)顯示出來(lái)。
要點(diǎn):Plotly非常適合用很少的代碼創(chuàng)建交互式且具有出版質(zhì)量的圖形。 但是,對(duì)于一些簡(jiǎn)單的圖(例如計(jì)數(shù)圖),使用seaborn會(huì)更簡(jiǎn)單
Altar
Altair是基于vega-lite的用于Python的聲明式統(tǒng)計(jì)可視化庫(kù),非常適合需要大量統(tǒng)計(jì)轉(zhuǎn)換的繪圖。
優(yōu)點(diǎn)
1.簡(jiǎn)單的可視化語(yǔ)法
用于創(chuàng)建可視化的語(yǔ)法很容易理解。 它僅需提及數(shù)據(jù)列與編碼通道之間的鏈接,其余繪圖將自動(dòng)處理。 這聽(tīng)起來(lái)很抽象,但是在您處理數(shù)據(jù)時(shí)非常重要,它使信息可視化變得非常快速和直觀。
例如,使用上面的泰坦尼克號(hào)數(shù)據(jù),我們想計(jì)算每個(gè)班級(jí)的人數(shù),我們所需要的只是在y_axis中使用count()
- import seaborn as sns
- import altair as alt
- titanic = sns.load_dataset("titanic")
- alt.Chart(titanic).mark_bar().encode(
- alt.X('class'),
- y='count()'
- )
2.易于轉(zhuǎn)換數(shù)據(jù)
Altair還使創(chuàng)建圖表時(shí)轉(zhuǎn)換數(shù)據(jù)變得非常容易
例如,如果我們想找到泰坦尼克號(hào)中每個(gè)性別的平均年齡,而不是像Plotly那樣預(yù)先進(jìn)行轉(zhuǎn)換,我們可以在代碼中執(zhí)行轉(zhuǎn)換以創(chuàng)建圖表。
- hireable = alt.Chart(titanic).mark_bar().encode(
- x='sex:N',
- y='mean_age:Q'
- ).transform_aggregate(
- mean_age='mean(age)',
- groupby=['sex'])
- hireable
這里的邏輯是使用transform_aggregate()來(lái)獲取義數(shù)據(jù)(沒(méi)有任何順序的類(lèi)別數(shù)據(jù)),或者使用:Q來(lái)確保mean_age是定量數(shù)據(jù)(值的度量,例如數(shù)字)
3.易于鏈接的圖
Altair還允許您在圖之間進(jìn)行一些令人印象深刻的鏈接,例如使用間隔選擇來(lái)過(guò)濾附加直方圖的內(nèi)容。
例如,如果我們想在間隔內(nèi)可視化每個(gè)班級(jí)的人數(shù),我們可以選擇年齡和票價(jià)之間的一個(gè)點(diǎn)狀圖,我們可以這樣做。
- brush = alt.selection(type='interval')
- points = alt.Chart(titanic).mark_point().encode(
- x='age:Q',
- y='fare:Q',
- color=alt.condition(brush, 'class:N', alt.value('lightgray'))
- ).add_selection(
- brush
- )
- bars = alt.Chart(titanic).mark_bar().encode(
- y='class:N',
- color='class:N',
- x = 'count(class):Q'
- ).transform_filter(
- brush
- )
- points & bars
當(dāng)我們拖動(dòng)鼠標(biāo)以選擇散點(diǎn)圖中的間隔時(shí),我們可以在下面的條形圖中看到變化。 當(dāng)與早期的轉(zhuǎn)換和計(jì)算結(jié)合使用時(shí),這意味著您可以創(chuàng)建一些非?;?dòng)的圖,這些圖可以進(jìn)行即時(shí)計(jì)算-甚至不需要運(yùn)行的Python服務(wù)器!
缺點(diǎn)
除非您指定自定義樣式,否則簡(jiǎn)單的圖表(如條形圖)看起來(lái)不會(huì)像seaborn或Plotly。 Altair還不建議使用5000個(gè)以上樣本的數(shù)據(jù)集,而是建議您在可視化之前匯總數(shù)據(jù)。
要點(diǎn):Altair是復(fù)雜圖表顯示統(tǒng)計(jì)數(shù)據(jù)的理想選擇。 Altair無(wú)法處理超過(guò)5000個(gè)樣本的數(shù)據(jù),并且與Plotly或Seaborn相比,某些簡(jiǎn)單圖表的樣式看起來(lái)不一樣。
Bokeh
Bokeh是一個(gè)靈活的交互式可視化庫(kù),以Web瀏覽器為代表。
優(yōu)點(diǎn)
- Matplotlib的交互式版本
如果我們將在上述交互式可視化庫(kù)中排名,那么Bokeh在與Matplotlib的相似性方面可能排名第一。
Matplotlib可以創(chuàng)建任何繪圖,因?yàn)樗且粋€(gè)低級(jí)的可視化庫(kù)。 Bokeh可以用作高級(jí)或低級(jí)接口; 因此,它可以創(chuàng)建Matplotlib創(chuàng)建的許多復(fù)雜圖,但是用更少的代碼行和更高的分辨率。
例如,Matplotlib的圓圖
- import matplotlib.pyplot as plt
- fig, ax = plt.subplots()
- x = [1, 2, 3, 4, 5]
- y = [2, 5, 8, 2, 7]
- for x,y in zip(x,y):
- ax.add_patch(plt.Circle((x, y), 0.5, edgecolor = "#f03b20",facecolor='#9ebcda', alpha=0.8))
- #Use adjustable='box-forced' to make the plot area square-shaped as well.
- ax.set_aspect('equal', adjustable='datalim')
- ax.set_xbound(3, 4)
- ax.plot() #Causes an autoscale update.
- plt.show()
也可以使用Bokeh以更好的分辨率和更多實(shí)用性創(chuàng)建
- from bokeh.io import output_file, show
- from bokeh.models import Circle
- from bokeh.plotting import figure
- reset_output()
- output_notebook()
- plot = figure(plot_width=400, plot_height=400, tools="tap", title="Select a circle")
- renderer = plot.circle([1, 2, 3, 4, 5], [2, 5, 8, 2, 7], size=50)
- selected_circle = Circle(fill_alpha=1, fill_color="firebrick", line_color=None)
- nonselected_circle = Circle(fill_alpha=0.2, fill_color="blue", line_color="firebrick")
- renderer.selection_glyph = selected_circle
- renderer.nonselection_glyph = nonselected_circle
- show(plot)
2.地塊之間的聯(lián)系
散景還可以使情節(jié)之間的鏈接變得非常容易。 在一個(gè)繪圖中應(yīng)用的更改將應(yīng)用于具有類(lèi)似變量的另一繪圖。
例如,如果我們并排創(chuàng)建3個(gè)圖形并想要觀察它們之間的關(guān)系,則可以使用鏈接的筆刷
- from bokeh.layouts import gridplot, row
- from bokeh.models import ColumnDataSource
- reset_output()
- output_notebook()
- source = ColumnDataSource(new_profile)
- TOOLS = "box_select,lasso_select,help"
- TOOLTIPS = [('user', '@user_name'),
- ('followers', '@followers'),
- ('following', '@following'),
- ('forks', '@forks'),
- ('contribution', '@contribution')]
- s1 = figure(tooltips=TOOLTIPS, plot_width=300, plot_height=300, title=None, tools=TOOLS)
- s1.circle(x='followers', y='following', source=source)
- s2 = figure(tooltips=TOOLTIPS, plot_width=300, plot_height=300, title=None, tools=TOOLS)
- s2.circle(x='followers', y='forks', source=source)
- s3 = figure(tooltips=TOOLTIPS, plot_width=300, plot_height=300, title=None, tools=TOOLS)
- s3.circle(x='followers', y='contribution', source=source)
- p = gridplot([[s1,s2,s3]])
- show(p)
ColumnDataSource使數(shù)據(jù)可以在繪圖之間共享。 因此,當(dāng)我們將更改應(yīng)用于一個(gè)圖時(shí),其他圖也將相應(yīng)地更改。
缺點(diǎn)
由于Bokeh是一個(gè)具有中級(jí)接口的庫(kù),因此與Matplotlib相比,它通?;ㄙM(fèi)較少的代碼,但產(chǎn)生與Seaborn,Altair或Plotly相同的圖將花費(fèi)更多的代碼。
例如,要使用泰坦尼克號(hào)數(shù)據(jù)創(chuàng)建相同的計(jì)數(shù)圖,除了需要預(yù)先轉(zhuǎn)換數(shù)據(jù)外,如果我們希望圖形看起來(lái)更漂亮,我們還需要設(shè)置條形和顏色的寬度
- from bokeh.transform import factor_cmap
- from bokeh.palettes import Spectral6
- p = figure(x_range=list(titanic_groupby['class']))
- p.vbar(x='class', top='survived', source = titanic_groupby,
- fill_color=factor_cmap('class', palette=Spectral6, factors=list(titanic_groupby['class'])
- ))
- show(p)如果我們不為條形圖添加寬度,則條形圖將看起來(lái)像這樣
因此,我們需要手動(dòng)調(diào)整尺寸以使圖更好
- from bokeh.transform import factor_cmap
- from bokeh.palettes import Spectral6
- p = figure(x_range=list(titanic_groupby['class']))
- p.vbar(x='class', top='survived', width=0.9, source = titanic_groupby,
- fill_color=factor_cmap('class', palette=Spectral6, factors=list(titanic_groupby['class'])
- ))
- show(p)
如果要用更少的代碼創(chuàng)建漂亮的條形圖,與其他庫(kù)相比,Bokeh可能就是缺點(diǎn)
要點(diǎn):Bokeh是唯一一個(gè)界面范圍從低到高的庫(kù),這使得生成通用和精美的圖形變得容易。 但是,這樣做的代價(jià)是,Bokeh通常需要更多代碼來(lái)創(chuàng)建質(zhì)量與其他庫(kù)相似的圖。
Folium
Folium使在交互式傳單地圖上的數(shù)據(jù)可視化變得容易。 該庫(kù)具有來(lái)自O(shè)penStreetMap,Mapbox和Stamen的許多內(nèi)置磁貼集
優(yōu)點(diǎn)
1.輕松創(chuàng)建帶有標(biāo)記的地圖
盡管Plotly,Altair和Bokeh也使我們能夠創(chuàng)建地圖,但Folium使用開(kāi)放的街道地圖,以最少的代碼使您更接近Google Map
還記得我們?nèi)绾蝿?chuàng)建地圖以使用Plotly可視化Github用戶(hù)的位置嗎? 我們可以用Folium使地圖看起來(lái)更好
- import folium
- # Load data
- location_df = dp.Blob.get(name='location_df', owner='khuyentran1401').download_df()
- # Save latitudes, longitudes, and locations' names in a list
- lats = location_df['latitude']
- lons = location_df['longitude']
- names = location_df['location']
- # Create a map with an initial location
- m = folium.Map(location=[lats[0], lons[0]])
- for lat, lon, name in zip(lats, lons, names):
- # Create marker with other locations
- folium.Marker(location=[lat, lon],
- popup= name,
- icon=folium.Icon(color='green')
- ).add_to(m)
- m
最初的地點(diǎn)在紐約布魯克林。 縮小以查看地圖上的其他位置。 通過(guò)一些代碼行,我們創(chuàng)建了一個(gè)真實(shí)的地圖,顯示了用戶(hù)的位置。
2.添加潛在的位置
如果我們想添加其他用戶(hù)的潛在位置,F(xiàn)olium可以通過(guò)允許用戶(hù)添加標(biāo)記來(lái)簡(jiǎn)化操作
- # Code to generate map here
- #....
- # Enable adding more locations in the map
- m = m.add_child(folium.ClickForMarker(popup='Potential Location'))
點(diǎn)擊地圖,查看您點(diǎn)擊生成的新位置。
3.插件
Folium有許多可與地圖一起使用的插件,包括Altair的插件。 如果我們想查看全球Github用戶(hù)總星數(shù)的熱點(diǎn)圖,以找出哪里有大量Github用戶(hù)數(shù)最多,總星數(shù)很多的情況? Folium插件中的熱圖使您可以做到這一點(diǎn)。
- from folium.plugins import HeatMap
- m = folium.Map(location=[lats[0], lons[0]])
- HeatMap(data=location_df[['latitude', 'longitude', 'total_stars']]).add_to(m)
縮小以查看完整的熱圖。
總結(jié):Folium允許您使用幾行代碼創(chuàng)建一個(gè)交互式地圖。 它為您提供了接近Google Map的體驗(yàn)。
結(jié)論
恭喜你! 您剛剛了解了用于可視化的六個(gè)不同的可視化工具。 我希望本文能使您了解每個(gè)庫(kù)的功能以及何時(shí)使用。 掌握每個(gè)庫(kù)的關(guān)鍵功能將使您更快地根據(jù)需要提取正確的庫(kù)。
如果您仍然對(duì)要使用哪個(gè)庫(kù)來(lái)處理數(shù)據(jù)感到困惑,只需選擇一個(gè)您認(rèn)為足夠好的庫(kù)即可。 然后,如果代碼太長(zhǎng)或圖形的顯示效果不如您想象的那樣,請(qǐng)嘗試使用另一個(gè)庫(kù)!