首頁(yè)技術(shù)文章正文

Python5種可視化工具

更新時(shí)間:2017-12-18 來源:黑馬程序員 瀏覽量:

在 Python 中,將數(shù)據(jù)可視化有多種選擇,正是因?yàn)檫@種多樣性,何時(shí)選用何種方案才變得極具挑戰(zhàn)性。本文包含了一些較為流行的工具以及如何使用它們來創(chuàng)建簡(jiǎn)單的條形圖,我將使用下面幾種工具來完成繪圖示例:

· 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條:

1513583925120_20171218153658886.png

現(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ǔ)圖表看起來不錯(cuò),理想情況下,我想對(duì) y 軸再做一些格式化,但是這樣做需要使用 matplotlib 的一些功能。雖然現(xiàn)在的圖表已是完美可用的可視化圖表了,但是僅僅通過 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)題以便可以正常地閱讀。從外觀上看,圖表看起來不錯(cuò)。理想情況下,我想格式化 y 軸上的刻度,但我不知道在不使用 matplotlib 中的 plt.yticks 的情況下,如何實(shí)現(xiàn)格式化。

ggplot

ggplot 與 Seaborn 類似,也是基于 matplotlib 并旨在以簡(jiǎn)單的方式提高 matplotlib 可視化的視覺感染力。它不同于 seaborn 是因?yàn)樗?ggplot2 為 R 語言準(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)在讓我們通過連接幾條 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)這樣相對(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ù),它不依賴于 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 格式的圖片:

正如你所看到的,圖表是非常干凈的。我沒有找到一種更簡(jiǎn)單的方式來格式化 y 軸。Bokeh 有很多功能,但在本例中我并未深入探索。

Pygal

Pygal 用于創(chuàng)建 svg 格式的圖表,如果安裝了正確的依賴,也可以保存為 png 格式。svg 文件在創(chuàng)建交互式圖表時(shí)非常有用,同時(shí)我也發(fā)現(xiàn),使用此工具可以非常容易地創(chuàng)建獨(dú)特而又極具視覺感染力的圖表。

導(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)建圖表類型并做一些基礎(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ù)集來說,可以直接添加數(shù)據(jù)。數(shù)據(jù)量很大時(shí),性能可能會(huì)是一個(gè)問題。

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 的展示效果確實(shí)很好,我很喜歡看起來獨(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 來實(shí)現(xiàn)定制。

· Seaborn 可以支持一些更復(fù)雜的可視化方法,但仍需要 matplotlib 的知識(shí)來調(diào)整。顏色方案是一個(gè)不錯(cuò)的功能。

· ggplot 很有前景,但它仍在努力成長(zhǎng)中。

· 如果你想建立自己的可視化服務(wù)器,bokeh 將是一個(gè)強(qiáng)大的工具。但是對(duì)于一些簡(jiǎn)單的腳本,使用 bokeh 就像殺雞用牛刀一樣。

· pygal 在創(chuàng)建互動(dòng)使 SVG 圖表和 PNG 文件方面是獨(dú)一無二的。它不如基于matplotlib 的解決方案靈活。


本文版權(quán)歸黑馬程序員人工智能+Python學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!


作者:黑馬程序員人工智能+Python培訓(xùn)學(xué)院


首發(fā):http://python.itheima.com/


分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!