1. 程式人生 > 其它 >【Python環境】Python視覺化工具綜述

【Python環境】Python視覺化工具綜述

簡介

在Python的世界裡,視覺化你的資料有多種選擇。由於這種多樣性,決定何時使用哪一個確實是種挑戰。這篇文章包含由更受歡迎的包中的一部分製作的示例,並說明如何使用它們建立一個簡單的條形圖。我將使用:

  • Pandas
  • Seaborn
  • ggplot
  • Bokeh
  • pygal
  • Plotly

在例子中,我將使用Pandas處理資料並驅動視覺化。大多數情況下這些工具可以在沒有pandas的環境中執行,但是我認為pandas和視覺化工具的結合非常普遍,這是最合適的開始之處。

Matplotlib怎麼樣?

Matplotlib是Python視覺化軟體包的始祖,它有非常強大的能力,但是隨之而來的是複雜性。Matplotlib往往可以做到任何你想做的,但並非那麼容易弄清楚。我不會進入一個純粹的Matplotlib示例,因為許多工具(尤其是Pandas和Seaborn)是對Matplotlib的簡單封裝。如果你想要閱讀更多關於它的資訊,我在這篇simple graphing中介紹了幾個例子。

我對Matplotlib最大的不滿是,它需要太多工作以獲得合理可讀的圖表。通過把玩這裡的一些例子,我發現不需要太多程式碼就可以輕易獲得不錯的視覺化。這篇gglpot文章裡的例子可以側面說明matplotlib的詳細特性。

方法論

一個對這篇文章中我的方法論的快速註解。我敢肯定,只要人們開始閱讀這篇文章,他們就能找出更好使用這些工具的方法。我的目標不是在每個示例中建立完全一致的圖表,我希望以大致相同的方式視覺化資料,在每個示例中也花費大致相同的時間研究解決方案。

在這個過程中,我遇到的最大挑戰是格式化x軸和y軸,以及通過賦予一些大的標籤使資料看起來合理。找出每種工具需要的資料格式也花費了一些時間。一旦決定了這些部分,其餘都相對比較簡單。

另一個需要考慮的問題是,條形圖可能是簡單型別的圖表。這些工具允許你用資料繪製更多不同的型別。我的例子更多側重於設計的方便性,而不是新穎的視覺化案例。而且,由於一些圖表的標籤佔用太多空間,我粗暴地切斷了它們——只是為了保持文章的長度合理。最後,我調整了圖片大小,因此任何模糊都是縮放導致的,不代表實際輸出質量。

最後,我的想法接近於嘗試使用另一種工具替代Excel的心態。我認為我的例子更多說明報告、簡報、電子郵件或者靜態網頁中的展示。如果你在評估實時資料視覺化或通過一些其他機制共享的工具,那麼這些工具中的一部分提供了更多我沒有涉及的能力。

資料集

一篇先前的文章描述了我們將要使用的資料集。我抓取更深一層以確定每個類別中的詳細支出項。該資料集包含125個專案,但是我選擇只注重展示前10項,這樣簡單一些。你可以在這裡找到完整資料集。

Pandas

我使用pandas的DataFrame作為所有不同例子的開始。幸運的是,pandas支援一個作為matplotlib上一層的內建繪圖功能。我將用它作為基線。首先,引入我們的模組,把資料讀入為名為budget的DataFrame。我們也要對資料進行排序,並選擇前10大專案。

budget = pd.read_csv("mn-budget-detail-2014.csv")
budget = budget.sort('amount',ascending=False)[:10]

我們將在所有的例子中使用同樣的預算行。下面是資料的前5項:

現在,使用更好的預設值設定我們的顯示方式,建立條形圖:

pd.options.display.mpl_style = 'default'budget_plot = budget.plot(kind="bar",x=budget["detail"],
title="MN Capital Budget - 2014",
legend=False)

這完成了所有建立“detail”列圖表的重任,以及顯示標題,移除圖例。下面是儲存影象為png格式所需的額外程式碼。

fig = budget_plot.get_figure()
fig.savefig("2014-mn-capital-budget.png")

儲存的影象如下所示(截斷以保持合理的文章長度):

這個基準看上去很不錯。理想情況下,我希望對y軸做一些更多的格式化,但是這需要跳進matplotlib進行設定。這是一個完全可用的視覺化,但不可能純粹通過pandas做大量更多的定製。

Seaborn

Seaborn是一個基於matplotlib的視覺化庫。它旨在使預設資料視覺化具有更多視覺吸引力,以及將簡單建立複雜圖表作為目標。它確實與pandas整合得很好。我的例子中並未體現出seaborn的顯著特點。我喜歡seaborn的一點是各種內建樣式允許你快速更換調色盤以看起來更美觀。另外,seaborn並不能對這個簡單圖表操作更多。標準引入和讀取資料:

import pandas as pdimport seaborn as snsimport matplotlib.pyplot as plt

budget = pd.read_csv("mn-budget-detail-2014.csv")
budget = budget.sort('amount',ascending=False)[:>10]

我發現我必須通過x_order顯式指定專案的順序。下面的程式碼指定順序,並設定圖表樣式和柱狀圖的顏色:

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()

如你所看到的,我不得不使用matplotlin旋轉x軸標籤從而實際閱讀它們。直觀上顯示效果不錯。理想情況下,我想格式化y軸上的刻度,但是除了使用matplotlib中的plt.yticks,我沒有其他的辦法。

gglot

ggplot與seaborn類似,也建立在matplotlib上,目的是以簡單的方式改進matplotlib視覺化的視覺吸引力。與seaborn不同的是,它是R中ggplot2的一個移植。考慮到這一目標,其中一些API是非Python風格的,但是它很強大。我沒有在R中用過ggplot,因此有點學習曲線。然而,我開始看到ggplot的美麗。這個庫正在被積極地開發,我希望它繼續成長成熟,因為我認為它可能成為一個真正強大的選擇。在我的學習中,確實有幾次費勁地搞清楚如何做某事。銅鼓哦看程式碼和一點搜尋,我能夠搞定大部分。繼續匯入和讀取資料:

import pandas as pdfrom 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))print p

這看起來有點奇怪,尤其是使用print p顯示圖形。不過我很容易就找到並解決了它。確實需要挖掘如何旋轉x軸標籤和指定它們的順序。我發現最酷的特性是scale_y_continous,這讓標籤變得更好看。如果你想儲存影象,使用ggsave很簡單:

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

下面是最終的影象。它是灰度的,我可以上色,但沒有花費時間這樣做。

Bokeh

Boken和前三個庫都不一樣,它不依賴matplotlib,針對現代Web瀏覽器中的視覺化生成。它的目的是製作互動web視覺化,因此我的例子相當過分簡單化。引入並讀取資料:

import pandas as pdfrom 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 pdimport pygalfrom 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的。瀏覽它的網站,你將看見很多豐富的互動圖形。多虧它優秀的文件,建立柱狀圖非常簡單。你需要遵循文件獲得你的API金鑰設定。一旦完成,它看起來工作得非常順暢。注意你所做的一切都將釋出在網際網路上,因此確保這樣沒問題。有一個選項可以保持圖表私有,所以你可以控制這個特性。Ployly與pandas無縫整合,我也會高聲說他們對我的電子郵件問題積極迴應,我很感激他們及時的答覆。設定匯入和讀入資料:

import plotly.plotly as pyimport pandas as pdfrom 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')

也可以查閱完整互動版本。你能在他們的網站上看到更多穩健的例子。箱線圖的出現非常具有吸引力,且高度互動。由於文件和python的api,開始和執行都很容易,我喜歡最後這個產品。

總結

在Python生態系統中繪製資料圖是一個好訊息/壞訊息的故事。好訊息是有很多選擇,壞訊息是有太多選擇。試圖確定哪些適合你取決於你試圖完成什麼。在某種程度上,你需要把玩工具。我看不到一個明確的優勝者或失敗者。下面是一些我的結束語:

  • Pandas便於簡單繪圖,但是自定義需要學習matplotlib。
  • Seaborn可以支援一些更復雜的視覺化方法,但是仍然需要matplotlib知識進行調整。配色方案是一個額外優勢。
  • ggplot很可能成功,但仍在經歷成長的煩惱,
  • 如果你想要設定自己的視覺化伺服器,Bokeh是一個穩定的工具,但是對簡單的場景可能過猶不及。
  • Pygal能獨立生成互動式svg圖形和png檔案。它不如基於matplotlib的解決方案靈活。
  • Plotly生成最大程度互動的圖示,你可以離線儲存它們,也可以建立非常豐富的web視覺化效果。

就目前的情況來看,我會繼續注意ggplot的進展,在需要互動性時使用pygal和plotly。