更新時間:2017年12月18日15時37分 來源:傳智播客 瀏覽次數(shù):
在 Python 中,將數(shù)據(jù)可視化有多種選擇,正是因為這種多樣性,何時選用何種方案才變得極具挑戰(zhàn)性。本文包含了一些較為流行的工具以及如何使用它們來創(chuàng)建簡單的條形圖,我將使用下面幾種工具來完成繪圖示例:
· Pandas
· Seaborn
· ggplot
· Bokeh
· pygal
什么是 Matplotlib?
Matplotlib 是眾多 Python 可視化包的鼻祖。其功能非常強大,同時也非常復(fù)雜。你可以使用 Matplotlib 去做任何你想做的事情,但是想要搞明白卻并非易事。我不打算展示原生的 Matplotlib 例子,因為很多工具(特別是 Pandas 和 Seaborn)是基于 Matplotlib 的輕量級封裝。
Pandas
首先,導(dǎo)入模塊并將數(shù)據(jù)讀入 budget DataFrame,將數(shù)據(jù)排序并取前10條。
import pandas as pd
budget = pd.read_csv("mn-budget-detail-2014.csv")
budget = budget.sort('amount',ascending=False)[:10]
我們將在所有示例中使用相同的 budget 數(shù)據(jù),下面是其中5條:
現(xiàn)在,調(diào)整展示風(fēng)格為更美觀的默認(rèn)設(shè)置,并創(chuàng)建圖表:
pd.options.display.mpl_style = 'default'
budget_plot = budget.plot(kind="bar",x=budget["detail"],
title="MN Capital Budget - 2014",
legend=False)
上述代碼使用 detail 列的數(shù)據(jù)完成了創(chuàng)建圖表的主要工作,同時展示了 title并移除了 legend 。
下面是將圖表存為 png 格式的代碼:
fig = budget_plot.get_figure()
fig.savefig("2014-mn-capital-budget.png")
基礎(chǔ)圖表看起來不錯,理想情況下,我想對 y 軸再做一些格式化,但是這樣做需要使用 matplotlib 的一些功能。雖然現(xiàn)在的圖表已是完美可用的可視化圖表了,但是僅僅通過 pandas 是不可能完成更多定制的。
Seaborn
Seaborn 是一個基于 matplotlib 的可視化庫。它旨在使默認(rèn)的數(shù)據(jù)可視化更加悅目。它還旨在簡化復(fù)雜圖表的創(chuàng)建,可以與 pandas 很好地集成。
標(biāo)準(zhǔn)導(dǎo)包及讀取數(shù)據(jù):
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 旋轉(zhuǎn) x 軸的標(biāo)題以便可以正常地閱讀。從外觀上看,圖表看起來不錯。理想情況下,我想格式化 y 軸上的刻度,但我不知道在不使用 matplotlib 中的 plt.yticks 的情況下,如何實現(xiàn)格式化。
ggplot
ggplot 與 Seaborn 類似,也是基于 matplotlib 并旨在以簡單的方式提高 matplotlib 可視化的視覺感染力。它不同于 seaborn 是因為它是 ggplot2 為 R 語言準(zhǔn)備的一個端口?;谶@個目標(biāo),一些 API 的接口雖然不是很 pythonic 但是功能很強大。
繼續(xù)導(dǎo)包并讀取數(shù)據(jù):
import pandas as pd
from ggplot import *
budget = pd.read_csv("mn-budget-detail-2014.csv")
budget = budget.sort('amount',ascending=False)[:10]
現(xiàn)在讓我們通過連接幾條 ggplot 命令來構(gòu)造圖表:
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))
print p
這似乎看起來有些奇怪 – 尤其是使用 print p 來顯示圖表。但是,我發(fā)現(xiàn)這樣相對簡單明了。
要弄清楚如何將文本旋轉(zhuǎn) 90 度以及如何將 x 軸上的標(biāo)簽排序,確實要做些深入的挖掘。
我發(fā)現(xiàn)最酷的功能是 scale_y_continous, 它可以使標(biāo)簽更美觀。
如果你想將圖表保存為圖片,使用 ggsave可以很輕松地辦到:
ggsave(p, "mn-budget-capital-ggplot.png")
下圖是最終的圖片,我知道灰色可能有點多,但是毫不費時就可以給它添些色彩。
Bokeh
Bokeh 不同于之前的3個庫,它不依賴于 matplotlib 并且實現(xiàn)的是面向現(xiàn)代瀏覽器的可視化。它的目標(biāo)是實現(xiàn)交互式的 web 可視化,所以我的例子非常簡單。
導(dǎo)包并讀入數(shù)據(jù):
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)
現(xiàn)在我們可以繪圖了。下面的代碼將會實現(xiàn)在瀏覽器中展示包含圖表的 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 用于創(chuàng)建 svg 格式的圖表,如果安裝了正確的依賴,也可以保存為 png 格式。svg 文件在創(chuàng)建交互式圖表時非常有用,同時我也發(fā)現(xiàn),使用此工具可以非常容易地創(chuàng)建獨特而又極具視覺感染力的圖表。
導(dǎo)包及讀取數(shù)據(jù):
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]
我們需要創(chuàng)建圖表類型并做一些基礎(chǔ)設(shè)置:
bar_chart = pygal.Bar(style=LightStyle, width=800, height=600,
legend_at_bottom=True, human_readable=True,
title='MN Capital Budget - 2014')
有趣的一點是 human_readable ,它可以很好地格式化數(shù)據(jù),所以大多數(shù)情況下,這個功能“很管用”。
現(xiàn)在我們需要向圖表中添加數(shù)據(jù),這是與 pandas 集成地不是很緊湊的地方,但是就本次的小數(shù)據(jù)集來說,可以直接添加數(shù)據(jù)。數(shù)據(jù)量很大時,性能可能會是一個問題。
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 的展示效果確實很好,我很喜歡看起來獨特且賞心悅目的風(fēng)格。同時我也發(fā)現(xiàn),我們可以相對容易地弄清楚使用此工具時,哪些可以實現(xiàn),哪些不能實現(xiàn)。我鼓勵大家下載 svg 文件,并在瀏覽器中感受圖表的互動效果。
· Pandas 對于簡單的圖表繪制時非常方便的,但是你需要學(xué)習(xí) matplotlib 來實現(xiàn)定制。
· Seaborn 可以支持一些更復(fù)雜的可視化方法,但仍需要 matplotlib 的知識來調(diào)整。顏色方案是一個不錯的功能。
· ggplot 很有前景,但它仍在努力成長中。
· 如果你想建立自己的可視化服務(wù)器,bokeh 將是一個強大的工具。但是對于一些簡單的腳本,使用 bokeh 就像殺雞用牛刀一樣。
· pygal 在創(chuàng)建互動使 SVG 圖表和 PNG 文件方面是獨一無二的。它不如基于matplotlib 的解決方案靈活。