您好,登錄后才能下訂單哦!
這篇文章給大家介紹Python中怎么利用Altair實現數據制圖,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
繪圖流程
我通過繪制同一個多柱狀圖比較了多個 Python 繪圖庫的差異。正式開始之前,你需要將你的 Python 環境調整到能運行下面代碼的狀態。具體就是:
安裝最新版的 Python( Linux、Mac 和 Windows 系統下的安裝方法)
確認該版本 Python 可以運行本教程所使用的庫
演示用數據可從網絡下載,并且可以用 pandas 直接導入:
import pandas as pddf = pd.read_csv('https://anvil.works/blog/img/plotting-in-python/uk-election-results.csv')
準備開始吧。為了做個比較,先看下面這個用 Matplotlib 做的圖:
Matplotlib UK election results
使用 Matplotlib 需要 16 行代碼,圖柱的位置需要自己計算。
使用 Altair 繪制相似的圖,代碼如下:
import altair as alt chart = alt.Chart(df).mark_bar().encode( x='party', y='seats', column='year', color='party', ) chart.save('altair-elections.html')
真是簡潔多了!與 Seaborn 類似,Altair 所用數據的組織形式是每個變量一列(即 數據列 )。這種方式下可以將每個變量映射到圖的一個屬性上 —— Altair 稱之為“通道”。在上例中,我們期望每個 “黨派” 在 x
軸上顯示為一組圖柱, 其 “席位” 顯示在 y
軸,且將圖柱按照 “年份” 分開為 “列”。我們還想根據 “黨派” 給圖柱使用不同的 “顏色”。用語言表述需求的話就是上面這個樣子,而這也正是代碼所要表述的!
現在把圖畫出來:
Altair plot with default styling
這和我們期待的效果有點接近了。與 Matplotlib 方案相比,主要區別在于 Altair 方案中,每個 year
組顯示的時候,內部之間都有個小空白 —— 這不是問題,這只是 Altair 多柱狀圖顯示的一個特性。
所以說呢,還需要對顯示樣式再做一些改進。
兩個不是整數的年份名稱(Feb 1974
和 Oct 1974
)顯示為 NaN
了。這可以通過將年份數值 year
轉換為字符串來解決:
df['year'] = df['year'].astype(str)
還需要讓 Altair 知道如何對數據進行排序。Altair 允許通過傳給它一個 Column
對象,來設定 Column
通道的更多細節。現在讓 Altair 按照數據在數據集中出現的順序排列:
chart = alt.Chart(df).mark_bar().encode( # ... column=alt.Column('year', sort=list(df['year']), title=None), # ... )
我們通過設置 title=None
移除了圖頂的 "year" 標簽。下面再一處每列數據的 "party" 標簽:
chart = alt.Chart(df).mark_bar().encode( x=alt.X('party', title=None), # ... )
最后,我們還想自己指定圖柱的顏色。Altair 允許建立 domain
中數值與 range
中顏色的映射來實現所需功能,太貼心了:
cmap = { 'Conservative': '#0343df', 'Labour': '#e50000', 'Liberal': '#ffff14', 'Others': '#929591', } chart = alt.Chart(df).mark_bar().encode( # ... color=alt.Color('party', scale=alt.Scale(domain=list(cmap.keys()), range=list(cmap.values()))) )
應用上述樣式調整之后,代碼看起來不那么悅目了,但我們仍然是用聲明的方式實現的,這正是 Altair 如此有彈性的原因所在。實現過程中,仍然是使用的異于顯示數據的獨立變量來分離圖中不同屬性的,而不是像在 Matplotlib 中那樣直接對顯示數據做復雜的操作。唯一的不同是,我們的變量名字封裝在類似 alt.X()
的對象中,從而實現對顯示效果的控制:
import altair as alt from votes import long as df cmap = { 'Conservative': '#0343df', 'Labour': '#e50000', 'Liberal': '#ffff14', 'Others': '#929591', } df['year'] = df['year'].astype(str) # We're still assigning, e.g. 'party' to x, but now we've wrapped it # in alt.X in order to specify its styling chart = alt.Chart(df).mark_bar().encode( x=alt.X('party', title=None), y='seats', column=alt.Column('year', sort=list(df['year']), title=None), color=alt.Color('party', scale=alt.Scale(domain=list(cmap.keys()), range=list(cmap.values()))) ) chart.save('altair-elections.html')
現在與 Matplotlib 方案扯平了,代碼數量達到了 16 行!
下圖是使用我們的樣式調整方案之后的 Altair 效果圖:
關于Python中怎么利用Altair實現數據制圖就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。