更新時(shí)間:2017-12-18 來(lái)源:黑馬程序員 瀏覽量:
在 Python 中,將數(shù)據(jù)可視化有多種選擇,正是因?yàn)檫@種多樣性,何時(shí)選用何種方案才變得極具挑戰(zhàn)性。本文包含了一些較為流行的工具以及如何使用它們來(lái)創(chuàng)建簡(jiǎn)單的條形圖,我將使用下面幾種工具來(lái)完成繪圖示例:
· Pandas
· Seaborn
· ggplot
· Bokeh
· pygal
什么是 Matplotlib?
Matplotlib 是眾多 Python 可視化包的鼻祖。其功能非常強(qiáng)大,同時(shí)也非常復(fù)雜。你可以使用 Matplotlib 去做任何你想做的事情,但是想要搞明白卻并非易事。我不打算展示原生的 Matplotlib 例子,因?yàn)楹芏喙ぞ?特別是 Pandas 和 Seaborn)是基于 Matplotlib 的輕量級(jí)封裝。
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)建圖表的主要工作,同時(shí)展示了 title并移除了 legend 。
下面是將圖表存為 png 格式的代碼:
fig = budget_plot.get_figure()
fig.savefig("2014-mn-capital-budget.png")
基礎(chǔ)圖表看起來(lái)不錯(cuò),理想情況下,我想對(duì) y 軸再做一些格式化,但是這樣做需要使用 matplotlib 的一些功能。雖然現(xiàn)在的圖表已是完美可用的可視化圖表了,但是僅僅通過(guò) pandas 是不可能完成更多定制的。
Seaborn
Seaborn 是一個(gè)基于 matplotlib 的可視化庫(kù)。它旨在使默認(rèn)的數(shù)據(jù)可視化更加悅目。它還旨在簡(jiǎn)化復(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)題以便可以正常地閱讀。從外觀上看,圖表看起來(lái)不錯(cuò)。理想情況下,我想格式化 y 軸上的刻度,但我不知道在不使用 matplotlib 中的 plt.yticks 的情況下,如何實(shí)現(xiàn)格式化。
ggplot
ggplot 與 Seaborn 類(lèi)似,也是基于 matplotlib 并旨在以簡(jiǎn)單的方式提高 matplotlib 可視化的視覺(jué)感染力。它不同于 seaborn 是因?yàn)樗?ggplot2 為 R 語(yǔ)言準(zhǔn)備的一個(gè)端口?;谶@個(gè)目標(biāo),一些 API 的接口雖然不是很 pythonic 但是功能很強(qiáng)大。
繼續(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)在讓我們通過(guò)連接幾條 ggplot 命令來(lái)構(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
這似乎看起來(lái)有些奇怪 – 尤其是使用 print p 來(lái)顯示圖表。但是,我發(fā)現(xiàn)這樣相對(duì)簡(jiǎn)單明了。
要弄清楚如何將文本旋轉(zhuǎn) 90 度以及如何將 x 軸上的標(biāo)簽排序,確實(shí)要做些深入的挖掘。
我發(fā)現(xiàn)最酷的功能是 scale_y_continous, 它可以使標(biāo)簽更美觀。
如果你想將圖表保存為圖片,使用 ggsave可以很輕松地辦到:
ggsave(p, "mn-budget-capital-ggplot.png")
下圖是最終的圖片,我知道灰色可能有點(diǎn)多,但是毫不費(fèi)時(shí)就可以給它添些色彩。
Bokeh
Bokeh 不同于之前的3個(gè)庫(kù),它不依賴(lài)于 matplotlib 并且實(shí)現(xiàn)的是面向現(xiàn)代瀏覽器的可視化。它的目標(biāo)是實(shí)現(xiàn)交互式的 web 可視化,所以我的例子非常簡(jiǎn)單。
導(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)在我們可以繪圖了。下面的代碼將會(huì)實(shí)現(xiàn)在瀏覽器中展示包含圖表的 HTML 頁(yè)面,如果想用作其他展示,可以保存其 png 格式的副本。
bar = Bar(amount, details, filename="bar.html")
bar.title("MN Capital Budget - 2014").xlabel("Detail").ylabel("Amount")
bar.show()
下面是 png 格式的圖片:
正如你所看到的,圖表是非常干凈的。我沒(méi)有找到一種更簡(jiǎn)單的方式來(lái)格式化 y 軸。Bokeh 有很多功能,但在本例中我并未深入探索。
Pygal
Pygal 用于創(chuàng)建 svg 格式的圖表,如果安裝了正確的依賴(lài),也可以保存為 png 格式。svg 文件在創(chuàng)建交互式圖表時(shí)非常有用,同時(shí)我也發(fā)現(xiàn),使用此工具可以非常容易地創(chuàng)建獨(dú)特而又極具視覺(jué)感染力的圖表。
導(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]
我們需要?jiǎng)?chuàng)建圖表類(lèi)型并做一些基礎(chǔ)設(shè)置:
bar_chart = pygal.Bar(style=LightStyle, width=800, height=600,
legend_at_bottom=True, human_readable=True,
title='MN Capital Budget - 2014')
有趣的一點(diǎn)是 human_readable ,它可以很好地格式化數(shù)據(jù),所以大多數(shù)情況下,這個(gè)功能“很管用”。
現(xiàn)在我們需要向圖表中添加數(shù)據(jù),這是與 pandas 集成地不是很緊湊的地方,但是就本次的小數(shù)據(jù)集來(lái)說(shuō),可以直接添加數(shù)據(jù)。數(shù)據(jù)量很大時(shí),性能可能會(huì)是一個(gè)問(wèn)題。
for index, row in budget.iterrows():
bar_chart.add(row["detail"], row["amount"])
接下來(lái),將文件渲染為 svg 和 png 格式:
bar_chart.render_to_file('budget.svg')
bar_chart.render_to_png('budget.png')
我覺(jué)得 svg 的展示效果確實(shí)很好,我很喜歡看起來(lái)獨(dú)特且賞心悅目的風(fēng)格。同時(shí)我也發(fā)現(xiàn),我們可以相對(duì)容易地弄清楚使用此工具時(shí),哪些可以實(shí)現(xiàn),哪些不能實(shí)現(xiàn)。我鼓勵(lì)大家下載 svg 文件,并在瀏覽器中感受圖表的互動(dòng)效果。
· Pandas 對(duì)于簡(jiǎn)單的圖表繪制時(shí)非常方便的,但是你需要學(xué)習(xí) matplotlib 來(lái)實(shí)現(xiàn)定制。
· Seaborn 可以支持一些更復(fù)雜的可視化方法,但仍需要 matplotlib 的知識(shí)來(lái)調(diào)整。顏色方案是一個(gè)不錯(cuò)的功能。
· ggplot 很有前景,但它仍在努力成長(zhǎng)中。
· 如果你想建立自己的可視化服務(wù)器,bokeh 將是一個(gè)強(qiáng)大的工具。但是對(duì)于一些簡(jiǎn)單的腳本,使用 bokeh 就像殺雞用牛刀一樣。
· pygal 在創(chuàng)建互動(dòng)使 SVG 圖表和 PNG 文件方面是獨(dú)一無(wú)二的。它不如基于matplotlib 的解決方案靈活。
本文版權(quán)歸黑馬程序員人工智能+Python學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:黑馬程序員人工智能+Python培訓(xùn)學(xué)院
首發(fā):http://python.itheima.com/