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

Python重要的5種可視化工具

更新時間:2017-11-14 來源:黑馬程序員 瀏覽量:

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

· Pandas

· Seaborn

· ggplot

· Bokeh

· pygal

什么是 Matplotlib?

Matplotlib 是眾多 Python 可視化包的鼻祖。其功能非常強大,同時也非常復雜。你可以使用 Matplotlib 去做任何你想做的事情,但是想要搞明白卻并非易事。我不打算展示原生的 Matplotlib 例子,因為很多工具(特別是 Pandas 和 Seaborn)是基于 Matplotlib 的輕量級封裝。

Pandas

首先,導入模塊并將數(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)整展示風格為更美觀的默認設置,并創(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")

基礎圖表看起來不錯,理想情況下,我想對 y 軸再做一些格式化,但是這樣做需要使用 matplotlib 的一些功能。雖然現(xiàn)在的圖表已是完美可用的可視化圖表了,但是僅僅通過 pandas 是不可能完成更多定制的。

Seaborn

Seaborn 是一個基于 matplotlib 的可視化庫。它旨在使默認的數(shù)據(jù)可視化更加悅目。它還旨在簡化復雜圖表的創(chuàng)建,可以與 pandas 很好地集成。

標準導包及讀取數(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 軸的標題以便可以正常地閱讀。從外觀上看,圖表看起來不錯。理想情況下,我想格式化 y 軸上的刻度,但我不知道在不使用 matplotlib 中的 plt.yticks 的情況下,如何實現(xiàn)格式化。

ggplot

ggplot 與 Seaborn 類似,也是基于 matplotlib 并旨在以簡單的方式提高 matplotlib 可視化的視覺感染力。它不同于 seaborn 是因為它是 ggplot2 為 R 語言準備的一個端口?;谶@個目標,一些 API 的接口雖然不是很 pythonic 但是功能很強大。

繼續(xù)導包并讀取數(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 軸上的標簽排序,確實要做些深入的挖掘。

我發(fā)現(xiàn)最酷的功能是 scale_y_continous, 它可以使標簽更美觀。

如果你想將圖表保存為圖片,使用 ggsave可以很輕松地辦到:

ggsave(p, "mn-budget-capital-ggplot.png")

下圖是最終的圖片,我知道灰色可能有點多,但是毫不費時就可以給它添些色彩。

Bokeh

Bokeh 不同于之前的3個庫,它不依賴于 matplotlib 并且實現(xiàn)的是面向現(xiàn)代瀏覽器的可視化。它的目標是實現(xiàn)交互式的 web 可視化,所以我的例子非常簡單。

導包并讀入數(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)建獨特而又極具視覺感染力的圖表。

導包及讀取數(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)建圖表類型并做一些基礎設置:

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ā)現(xiàn),我們可以相對容易地弄清楚使用此工具時,哪些可以實現(xiàn),哪些不能實現(xiàn)。我鼓勵大家下載 svg 文件,并在瀏覽器中感受圖表的互動效果。

· Pandas 對于簡單的圖表繪制時非常方便的,但是你需要學習 matplotlib 來實現(xiàn)定制。

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

· ggplot 很有前景,但它仍在努力成長中。

· 如果你想建立自己的可視化服務器,bokeh 將是一個強大的工具。但是對于一些簡單的腳本,使用 bokeh 就像殺雞用牛刀一樣。

· pygal 在創(chuàng)建互動使 SVG 圖表和 PNG 文件方面是獨一無二的。它不如基于matplotlib 的解決方案靈活?!居亚樘崾荆韩@得更多學科學習視頻+資料+源碼,請加QQ:3276250747?!?/p>

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


作者:黑馬程序員人工智能+Python培訓學院


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


分享到:
在線咨詢 我要報名
和我們在線交談!