當可視化一個DataFrame時,選擇使用哪個視覺化庫確實是一個頭疼的事情,本文將透過專注於幾個具體的屬性來評價一個視覺化工具的優缺點。
來源:菜鳥學Python
如果你是Python視覺化的新手,一些流行的視覺化庫包括Matplotlib、Seaborn、Plotly、Bokeh、Altair和Folium,以及大量的庫和例子可能會讓你感到不知所措。
當可視化一個DataFrame時,選擇使用哪個視覺化庫確實是一個頭疼的事情。
這篇文章將和大家一起學習每個庫的優點和缺點。到最後,對它們的不同特點有更好的瞭解,在合適的時候更容易選擇合適的庫。
將透過專注於幾個具體的屬性來評價一個視覺化工具的優缺點:
- 互動性
你想要互動式視覺化嗎?像Altair、Bokeh和Plotly這樣的庫允許你建立互動式圖表,使用者可以探索和互動。
另外,一些庫(如Matplotlib)將視覺化渲染成靜態影象,使其適合在論文、幻燈片或演示中解釋概念。
- 語法和靈活性
不同庫的語法有什麼不同?低級別的庫,如Matplotlib,提供了廣泛的靈活性,可以完成幾乎任何事情。然而,API也是很複雜的。
像Altair這樣的宣告式庫簡化了資料到視覺化的對映,提供了一個更直觀的語法。
- 資料型別和視覺化
是否在處理專門的用例,如地理圖或大資料集?考慮一個特定的庫是否支援繪圖型別或有效處理大型資料集。
資料
為了探索每幅圖表,將使用GitHub使用者的資料:
import pandas as pd
new_profile = pd.read_csv('https://gist.githubusercontent.com/khuyentran1401/98658198f0ef0cb12abb34b4f2361fd8/raw/ece16eb32e1b41f5f20c894fb72a4c198e86a5ea/github_users.csv')
new_profile
Matplotlib
Matplotlib可能是最常見的用於視覺化資料的Python庫。幾乎所有對資料科學感興趣的人都可能至少使用過一次Matplotlib。
優點
♦易於解釋的資料屬性
在分析資料時,快速瞭解資料分佈情況往往非常有用的。
例如,如果你想檢查擁有最多粉絲的前100名使用者的分佈情況,通常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)
plt.show()
儘管Matplotlib的X軸表示方法並不理想,但該圖可以讓人清楚地瞭解資料的分佈。
♦多樣性
Matplotlib的功能非常全面,能夠生成各種型別的圖形。Matplotlib的網站提供了全面的文件和各種圖形的相簿,使得它很容易找到幾乎任何型別的繪圖的教程。
fig = plt.figure()
plt.text(
0.6,
0.7,
"learning",
size=40,
rotation=20.0,
ha="center",
va="center",
bbox=dict(
boxstyle="round",
ec=(1.0, 0.5, 0.5),
fc=(1.0, 0.8, 0.8),
),
)
plt.text(
0.55,
0.6,
"machine",
size=40,
rotation=-25.0,
ha="right",
va="top",
bbox=dict(
boxstyle="square",
ec=(1.0, 0.5, 0.5),
fc=(1.0, 0.8, 0.8),
),
)
plt.show()
缺點
雖然Matplotlib幾乎可以繪製任何東西,但生成非基本的圖或為審美目的調整圖可能很複雜。
如果你打算向他人展示你的資料,定製X軸、Y軸和其他繪圖元素可能需要大量的努力。這是由於Matplotlib的低階介面造成的。
num_features = new_profile.select_dtypes("int64")
correlation = num_features.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")
plt.show()
經驗之談:Matplotlib 能夠製作任何繪圖,但與其他庫相比,建立複雜的繪圖往往需要更多的程式碼。
Seaborn
Seaborn是一個建立在Matplotlib之上的Python資料視覺化庫。它提供了一個更高層次的介面,簡化了建立具有視覺吸引力的圖的過程。
優點
♦減少的程式碼
Seaborn提供了一個更高層次的介面來生成與Matplotlib類似的圖。這意味著你可以用更少的程式碼和更漂亮的視覺設計來實現類似的視覺化。
例如,使用與之前相同的資料,我們可以建立一個熱圖,而無需明確設定x和y標籤:
correlation = new_profile.corr()
sns.heatmap(correlation, annot=True)
這使得熱圖在視覺上更有吸引力,而不需要額外的配置。
♦改善普通圖表的美感
Seaborn是常見繪圖型別的熱門選擇,如柱狀圖、箱形圖、計數圖和直方圖。Seaborn不僅需要較少的程式碼來生成這些圖,而且它們還具有增強的視覺美感。
在下面的例子中,由於Seaborn的預設設定,計數圖在視覺上顯得更加吸引人:
sns.set(style="darkgrid")
titanic = sns.load_dataset("titanic")
ax = sns.countplot(x="class", data=titanic)
缺點
Seaborn儘管有其優勢,但並不像Matplotlib那樣擁有廣泛的繪圖型別集合。雖然它在流行的繪圖型別方面表現出色,但對於更專業或定製的繪圖,它可能無法提供同樣廣泛的選項。
經驗之談:Seaborn 是Matplotlib的一個高階版本。儘管它沒有像Matplotlib那樣廣泛的集合,但Seaborn可以用更少的程式碼使流行的繪圖,如柱狀圖、盒狀圖、熱圖等看起來更漂亮。
Plotly
Plotly圖形庫提供了一種毫不費力的方式來建立互動式和高質量的圖形。它提供了一系列類似於Matplotlib和Seaborn的圖表型別,包括線圖、散點圖、面積圖、條形圖等等。
優點
♦與R相似
如果你熟悉在R中建立繪圖,並在使用Python時懷念它的功能,Plotly是一個很好的選擇。它允許你用Python實現同樣水平的高質量繪圖。
Plotly Express尤其突出,因為它只用一行Python程式碼就能建立令人印象深刻的圖表。比如說:
import plotly.express as px
fig = px.scatter(
new_profile[:100],
x="followers",
y="total_stars",
color="forks",
size="contribution",
)
fig.show()
♦互動式圖表建立
Plotly擅長建立互動式圖表,這不僅增強了視覺吸引力,而且使觀眾能夠更詳細地探索資料。
讓我們考慮一下前面的用Matplotlib建立的條形圖例子。下面是如何用Plotly實現的:
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()
透過類似的程式碼,Plotly可以生成一個互動式的圖表,使用者可以將滑鼠懸停在每個條形圖上,檢視相應的使用者和關注者數量。這種互動性使你的視覺化的消費者有能力自己去探索資料。
♦複雜地塊中的簡單性
Plotly簡化了複雜圖的建立,這在其他庫中可能是個挑戰。
例如,如果我們想在地圖上視覺化GitHub使用者的位置,我們可以獲得他們的經緯度,並據此繪製:
location_df = pd.read_csv(
"https://gist.githubusercontent.com/khuyentran1401/ce61bbad3bc636bf2548d70d197a0e3f/raw/ab1b1a832c6f3e01590a16231ba25ca5a3d761f3/location_df.csv",
index_col=0,
)
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()
只需幾行程式碼,Plotly就能在地圖上漂亮地表示使用者的位置。氣泡的顏色代表分叉的數量,而大小則與星星的總數相對應。
經驗之談:Plotly 是一個很好的選擇,可以用最少的程式碼來建立互動式和出版質量的圖表。它提供了廣泛的視覺化功能,並簡化了建立複雜圖表的過程。
Altair
Altair是一個強大的Python宣告式統計視覺化庫,基於Vega-Lite。它在建立需要大量統計轉換的圖表時大放異彩。
優點
♦簡單的視覺化語法
Altair利用直觀的語法來建立視覺化。你只需要指定資料列和編碼通道之間的聯絡,其餘的繪圖工作都是自動處理的。這種簡單性使得資訊的視覺化變得快速而直觀。
例如,使用泰坦尼克號的資料集來計算每個班級的人數:
import seaborn as sns
import altair as alt
titanic = sns.load_dataset("titanic")
alt.Chart(titanic).mark_bar().encode(alt.X("class"), y="count()")
Altair簡潔的語法允許你專注於資料和它的關係,從而產生高效和富有表現力的視覺化。
♦易於資料轉換
Altair使其在建立圖表時毫不費力地進行資料轉換。
例如,如果你想在泰坦尼克號資料集中找到每個性別的平均年齡,你可以在程式碼本身中進行轉換:
hireable = (
alt.Chart(titanic)
.mark_bar()
.encode(x="sex:N", y="mean_age:Q")
.transform_aggregate(mean_age="mean(age)", groupby=["sex"])
)
hireable
Altair的transform_aggregate()函式使你能夠在飛行中彙總資料,並在你的視覺化中使用這些結果。
你也可以使用 :N
或 :Q
符號指定資料型別,如名義(沒有任何順序的分類資料)或定量(數值的衡量)。
♦連結圖表
Altair提供了令人印象深刻的將多個地塊連線在一起的能力。你可以根據使用者的互動,使用選擇來過濾所附圖塊的內容。
例如,在散點圖上直觀地顯示所選區間內每個階層的人數:
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
當你在散點圖中選擇一個區間時,柱狀圖會動態更新以反映過濾後的資料。Altair連線圖的能力允許高度互動的視覺化和即時計算,不需要執行Python伺服器。
缺點
Altair的簡單圖表,如柱狀圖,可能看起來不像Seaborn或Plotly等庫中的圖表那樣有風格,除非你指定自定義風格。
Altair建議在處理超過5000個樣本的資料集時,在視覺化之前對資料進行彙總。處理更大的資料集可能需要額外的步驟來管理資料大小和複雜性。
經驗之談:Altair 是建立複雜統計圖表的絕佳選擇。雖然它可能缺乏一些預設的樣式選項,並且在處理大型資料集時有侷限性,但Altair的簡單性、資料轉換能力和連結圖使其成為統計視覺化的強大工具。
Bokeh
Bokeh是一個高度靈活的互動式視覺化庫,專為網路瀏覽器設計。
優點
♦Matplotlib的互動式版本
在互動式視覺化方面,Bokeh作為與Matplotlib最相似的庫脫穎而出。Matplotlib是一個低級別的視覺化庫,而Bokeh同時提供了高階和低級別的介面。使用Bokeh,你可以建立類似於Matplotlib的複雜圖,但程式碼行數更少,解析度更高。
例如,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()
……可以透過使用虛化技術實現更好的解析度和更大的效用:
from bokeh.io import show, output_notebook
from bokeh.models import Circle
from bokeh.plotting import figure
output_notebook()
plot = figure(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)
♦圖表之間的聯絡
Bokeh使建立地塊之間的聯絡變得非常容易。應用於一個圖的變化可以自動反映在另一個具有類似變數的圖中。這個功能允許探索多個地塊之間的關係。
例如,如果你建立了三個並排的圖形,並想觀察它們的關係,你可以利用連結刷:
from bokeh.layouts import gridplot
from bokeh.models import ColumnDataSource
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, title=None, tools=TOOLS)
s1.circle(x="followers", y="following", source=source)
s2 = figure(tooltips=TOOLTIPS, title=None, tools=TOOLS)
s2.circle(x="followers", y="forks", source=source)
s3 = figure(tooltips=TOOLTIPS, title=None, tools=TOOLS)
s3.circle(x="followers", y="contribution", source=source)
p = gridplot([[s1, s2, s3]])
show(p)
透過利用ColumnDataSource,資料可以在繪圖之間共享。因此,當一個情節發生變化時,其他情節也會相應地自動更新。
缺點:
作為一個具有某種中間層次介面的庫,Bokeh通常需要更多的程式碼來產生與Seaborn、Altair或Plotly相同的圖。雖然Bokeh需要的程式碼比Matplotlib少,但與其他庫相比,它可能需要額外的程式碼行來實現類似的質量輸出。
例如,使用泰坦尼克號資料建立同樣的計數圖,除了需要提前轉換資料外,如果我們想讓圖表看起來漂亮,還需要設定條形圖的寬度和顏色。
如果我們不為條形圖增加寬度,圖表會是這樣的:
from bokeh.transform import factor_cmap
from bokeh.palettes import Spectral6
titanic_groupby = titanic.groupby("class")["survived"].sum().reset_index()
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)
from bokeh.transform import factor_cmap
from bokeh.palettes import Spectral6
titanic_groupby = titanic.groupby("class")["survived"].sum().reset_index()
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)
因此,我們需要手動調整尺寸以使繪圖更美觀:
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)
經驗之談:Bokeh 的獨特優勢在於它能夠提供一系列的介面,從低到高,從而能夠建立多功能的、具有視覺吸引力的圖形。然而,與其他庫相比,在追求類似的情節質量時,這種靈活性往往導致需要更多的程式碼。
Folium
Folium簡化了在互動式小冊子地圖上實現資料視覺化的過程。這個庫提供了來自OpenStreetMap、Mapbox和Stamen的內建瓦片集。
優點:
♦易於建立一個帶有標記的地圖
與Plotly、Altair和Bokeh等其他選項相比,Folium透過利用開放的街道地圖提供了一種更直接的方法。這給人一種類似於谷歌地圖的體驗,而且程式碼最少。
還記得我們用Plotly建立的視覺化Github使用者位置的地圖嗎?有了Folium,我們可以進一步增強地圖的外觀。
import folium
# 在一個列表中儲存緯度、經度和地點的名稱*
lats = location_df["緯度"]
lons = location_df["經度"]
names = location_df["location"]
# 用一個初始位置建立一個地圖*
m = folium.Map(location=[lats[0], lons[0]] )
for lat, lon, name in zip(lats, lons, names):
# 用其他位置建立標記*
folium.Marker(
location=[lat, lon], popup=name, icon=folium.Icon(color="green")
).add_to(m)
m
只用幾行程式碼,我們就建立了一個顯示使用者位置的真實地圖。
♦新增地點
Folium透過允許加入標記,可以很容易地新增其他使用者的潛在位置。
# 啟用在地圖中新增更多的位置
m = m.add_child(folium.ClickForMarker(popup="Potential Location"))
在地圖上點選,就在你點選的地方生成一個新的位置標記。
♦外掛
Folium提供各種外掛,可以與你的地圖一起利用,包括Altair的外掛。例如,如果我們想將全球Github使用者的總星數熱圖視覺化,並識別出擁有大量頂級使用者和星數的地區,Folium熱圖外掛就可以實現這一目的。
# heatmap
# 強烈推薦關注@公眾號:資料STUDIO,更多優質內容等你~
from folium.plugins import HeatMap
m = folium.Map(location=[lats[0], lons[0]])
HeatMap(data=location_df[["latitude", "longitude", "total_stars"]]).add_to(m)
m
經驗之談:Folium 只需幾行程式碼就能建立互動地圖。它提供了類似於谷歌地圖的使用者體驗。
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。各位也可以關注我的Facebook,按讚我的臉書並私訊「10」,送你十週入門數據分析電子書唷!期待你與我互動起來~
文章推薦
◆跟資料打交道的人都得會的這8種資料模型,滿足工作中95%的需求
回顧十週入門數據分析系列文:
關注數據君的臉書:
我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。按贊我的臉書,會有豐富資料包贈送唷!