在Python中,有不少數據可視化途徑。由於這種多樣性,形成很難選擇。本文包括一些比較常見的可視化工具的樣例,並將指導如何利用它們來建立簡單的條形圖。我將採用下面的工具來建立繪圖數據示例:html
Pandaspython
Seabornweb
ggplotapi
Bokeh瀏覽器
pygal服務器
Plotlysvg
在實例中,咱們利用pandas來操做數據,驅動可視化。大多數狀況下,這些工具的使用是不須要pandas的,但我以爲混用pandas和可視化工具比較常見,也是很好的起點。工具
python 可視化工具包起源於Matplotlib。它很是強大,也很複雜。你可使用它作幾乎全部的事情,然而,它並非很易於學習。我不打算講述純 Matplotlib實例,由於不少工具(尤爲是Pandas和Seaborn)都對它進行了封裝。若是你須要更多的瞭解,請參考個人simple graphing相關文章: http://pbpython.com/simple-graphing-pandas.htmlpost
我對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的DataFrame來開始畫各類圖形。幸運的是,pandas提供內置的圖表功能,它封裝了matplotlib。我將使用它來做爲基線。
首先,導入咱們的模塊,將數據讀入設定的DataFrame。咱們還須要對數據排序,並限制在top10中。
budget = pd.read_csv("mn-budget-detail-2014.csv")
budget = budget.sort('amount',ascending=False)[:10]
咱們將在全部實例中,使用一樣的設定,下面是查看到的top5狀況
如今能夠創建display,使用更好的defaults,建立條形圖:
1
2
3
4
|
pd.options.display.mpl_style
=
'default'
budget_plot
=
budget.plot(kind
=
"bar"
,x
=
budget\[
"detail"
\],
title
=
"MN Capital Budget - 2014"
,
legend
=
False
|
這使用"default"列建立的圖表,顯示標題,去掉了圖例。
再加上下面的代碼,能夠將圖片保存爲png格式文件 。
1
2
|
fig
=
budget_plot.get_figure()
fig.savefig(
"2014-mn-capital-budget.png"
)
|
看看生成的效果:
基本上,看起來很好了。想一想,還能夠在y軸上作更多的格式化處理,但這樣,就須要瞭解matplotlib了。好了,就這樣,僅經過pandas,咱們不能作更多的定製了。
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()
你能夠看到,我使用matplotlib旋轉x軸標題,這樣能夠看到它們。看起來,確實不錯了。再想一想,我還想格式化一下,在y軸上的點,在不使用matplotlib的plt.yticks的狀況下,但我不知道如何作。
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
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不一樣的方面,在於,我須要明確地列出,咱們須要繪圖的值。
1
|
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用來建立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')
我以爲svg演示,至關不錯,並且,我喜歡圖表擁有獨立,視覺愉悅的風格。我也發現用這個工具,哪些可作,哪些不可作,都比較容易瞭解。我建議你下載svg文件,在瀏覽器中查看圖表的交互效果。
Plotly做爲在線工具,用來作數據分析和可視化,有點特別。它擁有健狀的API,包括python版本。去網上查查,就知道,它有很豐富的,交互的圖表。感謝這些文檔,建立條形圖至關簡單多了。
按照文檔,獲取API key。而後全部工做,都很容易進行了。須要注意的一點是,全部東西,都將發到web上,因此,請確保你對付web沒有問題。有一個選項,可讓圖表私有,這樣,你能夠在這方面進行控制。
Plotly能很好地與pandas集成。有問題的時候,能夠向開發方發郵件,能很快收到回覆。對他們的答覆很滿意。
好了,Import並讀入數據:
1
2
3
4
5
6
7
|
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
]
|
設置數據和圖表類型:
1
2
3
4
5
6
|
data
=
Data([
Bar(
x
=
budget[
"detail"
],
y
=
budget[
"amount"
]
)
])
|
再加上layout信息:
1
2
3
4
5
6
7
8
9
10
11
|
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的報告,還有能夠嵌入到文檔中的本地版本。
1
2
3
|
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'
)
|
打開這個連接,能夠在線看一下效果:https://plot.ly/~chris1610/12,還有其它更多例子在這個網站。
所見所得的圖表,很是吸引人,並且高度互動。得益於文檔和python API,起步入門是很容易的,我喜歡這個最終產品。總結 在Python生態系統中繪圖,既有優勢,也有缺點。好處是,有不少工具可用。缺點也是,有不少工具可用。找到適合本身的,取決於你需達到的目標。有時候,你須要試用這些工具後,才知道哪一個適合你。咱們不能判定哪一個好,哪一個很差。 下面是我總結的見解: 一、Pandas對於簡單繪圖,能夠隨手用,但你須要學習定製matplotlib。 二、Seaborn能夠支持更多複雜的可視化方式,但仍然須要matplotlib知識,上色功能是個亮點。 三、ggplot有不少功能,但還須要發展。 四、bokeh是一個有效的工具,若是你想創建一個可視化的服務器,這幾乎是殺雞用牛刀的事情。 五、pygal獨立運行,可用來生成交互的svg圖表和png文件。它沒有基於matploglib的方案那樣靈活。 六、Plotly可生成大多數可交互圖表。你能夠保存爲離線文件,而後創建豐富的基於web的可視化。