Python可視化工具概述

fn67 9年前發布 | 123K 次閱讀 Python 圖表/報表制作

一、介紹

在Python中,有很多數據可視化途徑。因為這種多樣性,造成很難選擇。本文包括一些比較常見的可視化工具的樣例,并將指導如何利用它們來創建簡單的條形圖。我將采用下面的工具來創建繪圖數據示例:

Pandas

Seaborn

ggplot

Bokeh

pygal

Plotly

在實例中,我們利用pandas來操作數據,驅動可視化。大多數情況下,這些工具的使用是不需要pandas的,但我覺得混用pandas和可視化工具比較常見,也是很好的起點。

Matplotlib是什么?

python 可視化工具包起源于Matplotlib。它非常強大,也很復雜。你可以使用它做幾乎所有的事情,然而,它并不是很易于學習。我不打算講述純 Matplotlib實例,因為很多工具(尤其是Pandas和Seaborn)都對它進行了封裝。如果你需要更多的了解,請參考我的simple graphing相關文章: http://pbpython.com/simple-graphing-pandas.html

我對Matplotlib抱怨最多的就是,要得到合理的圖表,需要付出很多。在練習下面這些例子中,我發現不需要很多代碼,就可以得到很好看的 可視化效果。如果你需要一些較小例子,用來學習matplotlib詳細特征,可以在ggplot post中找到相關的實例:http://pbpython.com/simple-graphing-pandas.html

關于方法

本文中是我所提到的方法。我相信大家在閱讀時,也會想到更好的使用這些工具的方法。我的目標,不是在每個示例中去創建完全一致的圖表,而是關注,在每個例子中以大致相同的方式對數據進行可視化,以及大致相同的時間的研究方案。

在學習過程中,碰到的最大的挑戰,就是格式化x軸和y軸,使用大的標簽使數據看起來合理。同樣還需要時間弄清楚每個工具需要格式化的數據。一旦搞清楚這些,其它的就相對簡單了。

另一個需要考慮的地方,條形圖可能是一種比較簡單的類型。這些工具允許你使用數據創建各種各樣的圖形。我的實例更多關注的是格式化相關的易用 性,而不是可視化創新。另外,因為標簽,一些圖占用更多的空間,所以,我已進行處理,以便文章長度適中。最后,圖片大小也修改了,縮放后有些模糊,但不影 響學習。

最后,我試著使用另一個工具代替Excel。我想讓我的例子能更直觀地顯示在報告,展示,郵件或者是靜態頁面。如果你正在評估工具的實時數據可視化或通過其它方式的共享機制,以及這些工具更多的功能,我在本文中暫時不作介紹。

數據集

在上一篇文章中(http://pbpython.com/web-scraping-mn-budget.html),描述了我們用到的數 據。在數據抓取例子中,更深入點,在每個類別中確定詳細的支出項。數據集包括125行支出項,但我只需要關注top10,這樣可以簡單些。你可以在此找到 詳細的數據集:http://pbpython.com/extras/mn- ... 4.csv

Pandas

我將使用pandas的DataFrame來開始畫各種圖形。幸運的是,pandas提供內置的圖表功能,它封裝了matplotlib。我將使用它來作為基線。

首先,導入我們的模塊,將數據讀入設定的DataFrame。我們還需要對數據排序,并限制在top10中。

budget = pd.read_csv("mn-budget-detail-2014.csv")

budget = budget.sort('amount',ascending=False)[:10]

我們將在所有實例中,使用同樣的設定,下面是查看到的top5情況

Python可視化工具概述

    現在可以建立display,使用更好的defaults,創建條形圖:

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


    這使用"default"列創建的圖表,顯示標題,去掉了圖例。
    再加上下面的代碼,可以將圖片保存為png格式文件 。

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


    看看生成的效果:

Python可視化工具概述

基本上,看起來很好了。想想,還可以在y軸上做更多的格式化處理,但這樣,就需要了解matplotlib了。好了,就這樣,僅通過pandas,我們不能做更多的定制了。

Seaborn

Seaborn是一個可視化庫,基于matplotlib。它會使用數據看起來更具有吸引力,還可以很簡單地創建更復雜的圖表,也可以和pandas集成。

我的seaborn例子不能搞得太差異化了。有一件事,我喜歡seaborn各種內置的樣式,你可以快速地改變調色板,這樣看起來更好一些。否則,對于簡單圖形,seaborn不能做更多了。

先import以及讀入數據:

import pandas as pd

import seaborn as sns

import matplotlib.pyplot as plt

budget = pd.read_csv("mn-budget-detail-2014.csv")

budget = budget.sort('amount',ascending=False)[:10]

我發現一件事情,就是需要使用x_order設置x軸上各項的順序。

下面的代碼設置順序,并設置圖表樣式和條形圖顏色:

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

Python可視化工具概述

你可以看到,我使用matplotlib旋轉x軸標題,這樣可以看到它們。看起來,確實不錯了。再想想,我還想格式化一下,在y軸上的點,在不使用matplotlib的plt.yticks的情況下,但我不知道如何做。

ggplot

ggplot與seaborn相似,也是基于matplotlib,用于簡化matplotlib可視化,并改善可視化效果。與seaborn不同的是,它是R語言ggplot2的移值。因此,一些API對于python不太友好,但它確實非常強大。

我沒有在R中使用過ggplot,所以,這有點學習曲線。但我可以開始了解下ggplot的魅力。這個庫還處在活躍的開發期,希望它一直發展下 去,慢慢成熟,我覺得它將會是一個真正強大的工具。我花了些時間學習使用它,在看了代碼和google所需后,我能夠解決大部分問題。

開始吧!導入并讀取數據:

import pandas as pd

from 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

 

Python可視化工具概述

 

Bokeh

Bokeh與前3個庫不一樣,它不依賴matplotlib,而是在瀏覽器中生成可視化。這意味著可以產生交互的web可視化,這樣我的實例有點簡單了。

Import,然后讀取數據:

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)

現在可以畫圖了。下面的代碼可以在瀏覽器中顯示HTML頁面,包括圖表。可以保存為png文件,用于其它目的。

bar = Bar(amount, details, filename="bar.html")

bar.title("MN Capital Budget - 2014").xlabel("Detail").ylabel("Amount")

bar.show()

png圖如下:

 

Python可視化工具概述

可以看到圖片,很好,很清晰。還沒有找到更易于格式化y軸的方式。Bokeh還有很多功能,在本例中不能一一列舉,請參考相關文檔。

Pygal

Pygal用來創建svg圖表。把依賴包都安裝好后,你也可以保存圖表為png文件。svg文件對于創建交互圖表非常有用。我同樣發現用這個工作,可以很容易創建個性化的,視覺體驗很好的圖表。

下面導入,并讀取數據:

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]

我們需要建立圖表類型,并設置一些基本參數:

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


Python可視化工具概述



我覺得svg演示,相當不錯,而且,我喜歡圖表擁有獨立,視覺愉悅的風格。我也發現用這個工具,哪些可做,哪些不可做,都比較容易了解。我建議你下載svg文件,在瀏覽器中查看圖表的交互效果。

Plot.ly
Plot.ly作為在線工具,用來做數據分析和可視化,有點特別。它擁有健狀的API,包括python版本。去網上查查,就知道,它有很豐富的,交互的圖表。感謝這些文檔,創建條形圖相當簡單多了。

按照文檔,獲取API key。然后所有工作,都很容易進行了。需要注意的一點是,所有東西,都將發到web上,所以,請確保你對付web沒有問題。有一個選項,可以讓圖表私有,這樣,你可以在這方面進行控制。

Plotly能很好地與pandas集成。有問題的時候,可以向開發方發郵件,能很快收到回復。對他們的答復很滿意。

好了,Import并讀入數據:

import plotly.plotly as py
import pandas as pd
from plotly.graph_objs import *

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


設置數據和圖表類型:

data = Data([
Bar(
    x=budget["detail"],
    y=budget["amount"]
)
])


再加上layout信息:

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 保存為圖像的。很酷吧!你不但可以看到基于web的報告,還有可以嵌入到文檔中的本地版本。

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可視化工具概述


打開這個鏈接,可以在線看一下效果:https://plot.ly/~chris1610/12,還有其它更多例子在這個網站。

 

所見所得的圖表,非常吸引人,而且高度互動。得益于文檔和python API,起步入門是很容易的,我喜歡這個最終產品。



總結
在Python生態系統中繪圖,既有優點,也有缺點。好處是,有很多工具可用。缺點也是,有很多工具可用。找到適合自己的,取決于你需達到的目標。有時候,你需要試用這些工具后,才知道哪個適合你。我們不能斷定哪個好,哪個不好。

下面是我總結的看法:
1、Pandas對于簡單繪圖,可以隨手用,但你需要學習定制matplotlib。
2、Seaborn可以支持更多復雜的可視化方式,但仍然需要matplotlib知識,上色功能是個亮點。
3、ggplot有很多功能,但還需要發展。
4、bokeh是一個有效的工具,如果你想建立一個可視化的服務器,這幾乎是殺雞用牛刀的事情。
5、pygal獨立運行,可用來生成交互的svg圖表和png文件。它沒有基于matploglib的方案那樣靈活。
6、Plotly可生成大多數可交互圖表。你可以保存為離線文件,然后建立豐富的基于web的可視化。

 本文由用戶 fn67 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!