6 種 Python 數據可視化工具
(點擊
上方公眾號
,可快速關注)
英文:
Chris Moffitt
,編譯:伯樂在線/李加慶
簡介
在 Python 中,將數據可視化有多種選擇,正是因為這種多樣性,何時選用何種方案才變得極具挑戰性。本文包含了一些較為流行的工具以及如何使用它們來創建簡單的條形圖,我將使用下面幾種工具來完成繪圖示例:
Pandas
Seaborn
ggplot
Bokeh
pygal
Plotly
在示例中,我將使用 pandas 處理數據並將數據可視化。大多數案例中,使用上述工具時無需結合 pandas,但我認為 pandas 與可視化工具結合是非常普遍的現象,所以以這種方式開啟本文是很棒的。
什麼是 Matplotlib?
Matplotlib 是眾多 Python 可視化包的鼻祖。其功能非常強大,同時也非常複雜。你可以使用 Matplotlib 去做任何你想做的事情,但是想要搞明白卻並非易事。我不打算展示原生的 Matplotlib 例子,因為很多工具(特別是 Pandas 和 Seaborn)是基於 Matplotlib 的輕量級封裝,如果你想了解更多關於 Matplotlib 的東西,在我的這篇文章— 《simple graphing》中有幾個例子可供參考(http://pbpython.com/simple-graphing-pandas.html)。
Matplotlib 令我最不滿的地方是它花費太多工作來獲得目視合理的圖表,但是在本文的某些示例中,我發現無需太多代碼就可以輕鬆獲得漂亮的可視化圖表。關於 Matplotlib 冗長特點的示例,可以參考這篇文章《ggplot》中的平面圖示例(http://blog.yhat.com/posts/ggplot-for-python.html)。
方法論
簡要說一下本文的方法論。我堅信只要讀者開始閱讀本文,他們將會指出使用這些工具的更好方法。我的目標並非在每個例子中創造出完全相同的圖表,而是花費大致相同的時間探索方法,從而在每個例子中以大體相同的方法將數據可視化。
在這個過程中,我所面臨的最大挑戰是格式化 x 軸和 y 軸以及基於某些大的標籤讓數據看起來合理,弄明白每種工具是如何格式化數據的也花費了我不少精力,我搞懂這些之後,剩餘的部分就相對簡單了。
另外還需要注意的一點是,條形圖可能是製作起來相對更簡單的圖表,使用這些工具可以製作出多種類型的圖表,但是我的示例更加側重的是簡易的格式化,而不是創新式的可視化。另外,由於標籤眾多,導致一些圖表佔據了很多空間,所以我就擅自移除了它們,以保證文章長度可控。最後,我又調整了圖片尺寸,所以圖片的任何模糊現象都是縮放導致的問題,並不代表真實圖像的質量。
最後一點,我以一種嘗試使用 Excel 另外一款替代品的心態來實現示例。我認為我的示例在報告、展示、郵件或者靜態網頁中都更具說服力。如果你正在評估用於實時可視化數據的工具,亦或是通過其他途徑去分享,那麼其中的部分工具會提供很多我還未涉獵到的功能。
數據集
之前的文章(http://pbpython.com/web-scraping-mn-budget.html)描述了我們要處理的數據,我從每一類中抽取了更深一層的樣例,並選用了更詳細的元素。這份數據集包含了125行,但是為了保持簡潔,我只選用了前10行,完整的數據集可以在這裡(http://pbpython.com/extras/mn-budget-detail-2014.csv)找到。
Pandas
我打算先使用 pandas
DataFrame
來繪圖。幸運地是,pandas 確實提供了內建的繪圖功能,此功能是基於 matplotlib,接下來我將以它作為開始。首先,導入模塊並將數據讀入
budget DataFrame
,將數據排序並取前10條。
import
pandas
as
pd
budget
=
pd
.
read_csv
(
"mn-budget-detail-2014.csv"
)
budget
=
budget
.
sort
(
"amount"
,
ascending
=
False
)[
:
10
]
我們將在所有示例中使用相同的 budget 數據,下面是其中5條:
現在,調整展示風格為更美觀的默認設置,並創建圖表:
pd
.
options
.
display
.
mpl_style
=
"default"
budget_plot
=
budget
.
plot
(
kind
=
"bar"
,
x
=
budget
[
"detail"
],
title
=
"MN Capital Budget - 2014"
,
legend
=
False
)
上述代碼使用 detail 列的數據完成了創建圖表的主要工作,同時展示了 title並移除了 legend 。
下面是將圖表存為 png 格式的代碼:
fig
=
budget_plot
.
get_figure
()
fig
.
savefig
(
"2014-mn-capital-budget.png"
)
圖表如下圖所示(截取了部分以使文章長度可控):
基礎圖表看起來不錯,理想情況下,我想對 y 軸再做一些格式化,但是這樣做需要使用 matplotlib 的一些功能。雖然現在的圖表已是完美可用的可視化圖表了,但是僅僅通過 pandas 是不可能完成更多定製的。
Seaborn
Seaborn 是一個基於 matplotlib 的可視化庫。它旨在使默認的數據可視化更加悅目。它還旨在簡化複雜圖表的創建,可以與 pandas 很好地集成。
本例中並未明顯將 seaborn 區別於其他其他工具(譯者註:並未展示一些 seaborn 獨有或者特色的功能),我非常喜歡 seaborn 多樣的內置風格,可以快速地修改調色板以使圖表看起來更美觀。其他方面,在創建這個簡易圖表時,並未使用 seaborn 做太多工作。
標準導包及讀取數據:
sns
.
set_style
(
"darkgrid"
)
bar_plot
=
sns
.
barplot
(
x
=
budget
[
"detail"
],
y
=
budget
[
"amount"
],
palette
=
"muted"
,
x_order
=
budget
[
"detail"
].
tolist
())
plt
.
xticks
(
rotation
=
90
)
plt
.
show
()
正如你所看到的,我必修使用 matplotlib 旋轉 x 軸的標題以便可以正常地閱讀。從外觀上看,圖表看起來不錯。理想情況下,我想格式化 y 軸上的刻度,但我不知道在不使用 matplotlib 中的 plt.yticks 的情況下,如何實現格式化。
ggplot
ggplot 與 Seaborn 類似,也是基於 matplotlib 並旨在以簡單的方式提高 matplotlib 可視化的視覺感染力。它不同於 seaborn 是因為它是 ggplot2 為 R 語言準備的一個埠。基於這個目標,一些 API 的介面雖然不是很 pythonic 但是功能很強大。
我之前沒有在 R 中使用過 ggplot,所以可能有一個學習曲線,但是我可以感受到 ggplot 的吸引力。該庫正在積極發展,我也希望它可以繼續成長、成熟。我認為它會是一個非常強大的工具。學習過程中,我也曾多次努力去弄清楚如何實現一些功能,在查閱代碼並在 Google 搜索之後,我基本上搞明白了大部分。
繼續導包並讀取數據:
import
pandas
as
pd
from
ggplot
import
*
budget
=
pd
.
read_csv
(
"mn-budget-detail-2014.csv"
)
budget
=
budget
.
sort
(
"amount"
,
ascending
=
False
)[
:
10
]
現在讓我們通過連接幾條 ggplot 命令來構造圖表:
p
=
ggplot
(
budget
,
aes
(
x
=
"detail"
,
y
=
"amount"
))
+
geom_bar
(
stat
=
"bar"
,
labels
=
budget
[
"detail"
].
tolist
())
+
ggtitle
(
"MN Capital Budget - 2014"
)
+
xlab
(
"Spending Detail"
)
+
ylab
(
"Amount"
)
+
scale_y_continuous
(
labels
=
"millions"
)
+
theme
(
axis_text_x
=
element_text
(
angle
=
90
))
p
這似乎看起來有些奇怪 – 尤其是使用 print p 來顯示圖表。但是,我發現這樣相對簡單明了。
要弄清楚如何將文本旋轉 90 度以及如何將 x 軸上的標籤排序,確實要做些深入的挖掘。
我發現最酷的功能是 scale_y_continous, 它可以使標籤更美觀。
如果你想將圖表保存為圖片,使用 ggsave可以很輕鬆地辦到:
ggsave(p, "mn-budget-capital-ggplot.png")
下圖是最終的圖片,我知道灰色可能有點多,但是毫不費時就可以給它添些色彩。
Bokeh
Bokeh 不同於之前的3個庫,它不依賴於 matplotlib 並且實現的是面向現代瀏覽器的可視化。它的目標是實現互動式的 web 可視化,所以我的例子非常簡單。
導包並讀入數據:
import
pandas
as
pd
from
bokeh
.
charts
import
Bar
budget
=
pd
.
read_csv
(
"mn-budget-detail-2014.csv"
)
budget
=
budget
.
sort
(
"amount"
,
ascending
=
False
)[
:
10
]
bokeh 不同的一方面是我需要明確列出我繪圖需要的值。
details
=
budget
[
"detail"
].
values
.
tolist
()
amount
=
list
(
budget
[
"amount"
].
astype
(
float
).
values
)
現在我們可以繪圖了。下面的代碼將會實現在瀏覽器中展示包含圖表的 HTML 頁面,如果想用作其他展示,可以保存其 png 格式的副本。
bar
=
Bar
(
amount
,
details
,
filename
=
"bar.html"
)
bar
.
title
(
"MN Capital Budget - 2014"
).
xlabel
(
"Detail"
).
ylabel
(
"Amount"
)
bar
.
show
()
下面是 png 格式的圖片:
正如你所看到的,圖表是非常乾淨的。我沒有找到一種更簡單的方式來格式化 y 軸。Bokeh 有很多功能,但在本例中我並未深入探索。
Pygal
Pygal 用於創建 svg 格式的圖表,如果安裝了正確的依賴,也可以保存為 png 格式。svg 文件在創建互動式圖表時非常有用,同時我也發現,使用此工具可以非常容易地創建獨特而又極具視覺感染力的圖表。
導包及讀取數據:
import
pandas
as
pd
import
pygal
from
pygal
.
style
import
LightStyle
budget
=
pd
.
read_csv
(
"mn-budget-detail-2014.csv"
)
budget
=
budget
.
sort
(
"amount"
,
ascending
=
False
)[
:
10
]
我們需要創建圖表類型並做一些基礎設置:
bar_chart
=
pygal
.
Bar
(
style
=
LightStyle
,
width
=
800
,
height
=
600
,
legend_at_bottom
=
True
,
human_readable
=
True
,
title
=
"MN Capital Budget - 2014"
)
有趣的一點是 human_readable ,它可以很好地格式化數據,所以大多數情況下,這個功能「很管用」。
現在我們需要向圖表中添加數據,這是與 pandas 集成地不是很緊湊的地方,但是就本次的小數據集來說,可以直接添加數據。數據量很大時,性能可能會是一個問題。
for
index
,
row
in
budget
.
iterrows
()
:
bar_chart
.
add
(
row
[
"detail"
],
row
[
"amount"
])
接下來,將文件渲染為 svg 和 png 格式:
bar_chart
.
render_to_file
(
"budget.svg"
)
bar_chart
.
render_to_png
(
"budget.png"
)
我覺得 svg 的展示效果確實很好,我很喜歡看起來獨特且賞心悅目的風格。同時我也發現,我們可以相對容易地弄清楚使用此工具時,哪些可以實現,哪些不能實現。我鼓勵大家下載 svg 文件,並在瀏覽器中感受圖表的互動效果。
Plot.ly
Plot.ly 區別於其他工具,是分析和可視化的在線工具。它具有強大的 API 並包含一個 Python 版本。基於 Plot.ly,瀏覽網站時,你會看到豐富的互動式圖表。得益於優秀的文檔,創建條形圖會相對簡單。
你需要參考文檔設置 API 秘鑰,一旦設置完成,看起來所有工作就可以無縫對接了。需要警告的一點是,所有通過 Plot.ly 所做的東西都會發布到網上,所有請確保你可以接受這一點,當然你也可以圖表設為私有。
Plotly 與 pandas 可以無縫集成。在這裡我也要對他們的認真負責並及時地回復我的問題深表感謝。
導包並讀取數據:
import
plotly
.
plotly
as
py
import
pandas
as
pd
from
plotly
.
graph_objs
import
*
budget
=
pd
.
read_csv
(
"mn-budget-detail-2014.csv"
)
budget
.
sort
(
"amount"
,
ascending
=
False
,
inplace
=
True
)
budget
=
budget
[
:
10
]
為 plotly 設置數據及圖標類型:
data
=
Data
([
Bar
(
x
=
budget
[
"detail"
],
y
=
budget
[
"amount"
]
)
])
我決定再添加些額外的布局信息:
layout
=
Layout
(
title
=
"2014 MN Capital Budget"
,
font
=
Font
(
family
=
"Raleway, sans-serif"
),
showlegend
=
False
,
xaxis
=
XAxis
(
tickangle
=-
45
),
bargap
=
0.05
)
最後,繪製數據。這將會打開瀏覽器,並展示繪製好的圖標。起初我並未注意到,但是你可以使用 py.image.save_as,來保存一個本地的副本,這是一個非常酷的功能。你可以得到基於網路的豐富的互動式報告以及用於嵌套在文檔中的本地圖表副本。
fig
=
Figure
(
data
=
data
,
layout
=
layout
)
plot_url
=
py
.
plot
(
data
,
filename
=
"MN Capital Budget - 2014"
)
py
.
image
.
save_as
(
fig
,
"mn-14-budget.png"
)
也可以查看完整版本(https://plot.ly/~chris1610/12/),你可以在他們的網站上看到很多強大的例子。
Plot.ly 繪製出的圖表非常吸引人並且具有高度互動性。由於其優秀的文檔和 Python API 以及入門和運行都很簡單,所以我最喜歡 Plot.ly 這款產品。
總結
在 Python 生態系統中繪製數據是一件好事也是一件壞事。繪製數據的工具有很多可供選擇既是一件好事也是一件壞事,儘力搞清楚哪一個工具適合你取決於你要實現什麼。在一定程度上,你需要嘗試各種工具老弄清哪種工具適合你,我覺得沒有哪一個工具是最好或最壞。
下面是我的一些見解:
Pandas 對於簡單的圖表繪製時非常方便的,但是你需要學習 matplotlib 來實現定製。
Seaborn 可以支持一些更複雜的可視化方法,但仍需要 matplotlib 的知識來調整。顏色方案是一個不錯的功能。
ggplot 很有前景,但它仍在努力成長中。
如果你想建立自己的可視化伺服器,bokeh 將是一個強大的工具。但是對於一些簡單的腳本,使用 bokeh 就像殺雞用牛刀一樣。
pygal 在創建互動使 SVG 圖表和 PNG 文件方面是獨一無二的。它不如基於matplotlib 的解決方案靈活。
Plotly 可以創建最具互動性的圖表。你可以離線保存,並創建非常豐富的基於網路的可視化圖表。
目前的情況是,我將持續關注 ggplot 的發展,並在需要互動性的地方使用pygal 和 plotly。
歡迎在評論中提供反饋。我相信,大家有很多關於這一主題的問題和意見。如果我錯過了什麼或者有其他的選擇,請告訴我。
看完本文有收穫?請轉
發分享給更多人
關注「P
ython開發者」,提升Python技能
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
※小 200 行 Python 代碼做了一個換臉程序
※5 種使用 Python 代碼輕鬆實現數據可視化的方法
TAG:Python開發者 |