"); //-->
在Python培訓中,將數據可視化有多種選擇,正是因為這種多樣性,何時選用何種方案才變得極具挑戰性。本文包含了一些較為流行的工具以及如何使用它們來創建簡單的條形圖,將使用下面幾種工具來完成繪圖。

在將使用pandas處理數據并將數據可視化。大多數案例中,使用工具時無需結合pandas,認為pandas與可視化工具結合是非常普遍的現象,所以以這種方式開啟本文是很棒的。
什么是Matplotlib
Matplotlib是眾多Python可視化包的鼻祖。其功能非常強大,同時也非常復雜。你可以使用Matplotlib去做任何你想做的事情,但是想要搞明白卻并非易事。不打算展示原生的Matplotlib例子,因為很多工具(特別是Pandas和Seaborn)是基于Matplotlib的輕量級封裝。
Matplotlib令我最不滿的地方是它花費太多工作來獲得目視合理的圖表,但是在本文的某些示例中,我發現無需太多代碼就可以輕松獲得漂亮的可視化圖表。
方法論
簡要說一下本文的方法論。我堅信只要讀者開始閱讀本文,他們將會指出使用這些工具的更好方法。我的目標并非在每個例子中創造出完全相同的圖表,而是花費大致相同的時間探索方法,從而在每個例子中以大體相同的方法將數據可視化。
在這個過程中,我所面臨的最大挑戰是格式化x軸和y軸以及基于某些大的標簽讓數據看起來合理,弄明白每種工具是如何格式化數據的也花費了我不少精力,我搞懂這些之后,剩余的部分就相對簡單了。
另外還需要注意的一點是,條形圖可能是制作起來相對更簡單的圖表,使用這些工具可以制作出多種類型的圖表,但是我的示例更加側重的是簡易的格式化,而不是創新式的可視化。另外,由于標簽眾多,導致一些圖表占據了很多空間,所以我就擅自移除了它們,以保證文章長度可控。最后,我又調整了圖片尺寸,所以圖片的任何模糊現象都是縮放導致的問題,并不代表真實圖像的質量。
最后一點,一種嘗試使用Excel另外一款替代品的心態來實現示例。我認為我的示例在報告、展示、郵件或者靜態網頁中都更具說服力。如果你正在評估用于實時可視化數據的工具,亦或是通過其他途徑去分享,那么其中的部分工具會提供很多我還未涉獵到的功能。
數據集
從每一類中抽取了更深一層的樣例,并選用了更詳細的元素。
Pandas
我打算先使用pandasDataFrame來繪圖。幸運地是,pandas確實提供了內建的繪圖功能,此功能是基于matplotlib,接下來我將以它作為開始。
首先,導入模塊并將數據讀入budgetDataFrame,將數據排序并取前10條。
importpandasaspd
budget=pd.read_csv("mn-budget-detail-2014.csv")
budget=budget.sort('amount',ascending=False)[:10]
我們將在所有示例中使用相同的budget數據,下面是其中5條:

現在,調整展示風格為更美觀的默認設置,并創建圖表:
pd.options.display.mpl_style='default' budget_plot=budget.plot(kind="bar",x=budget["detail"], title="MNCapitalBudget-2014", legend=False)
上述代碼使用detail列的數據完成了創建圖表的主要工作,同時展示了title并移除了legend。
下面是將圖表存為png格式的代碼:
fig=budget_plot.get_figure()
fig.savefig("2014-mn-capital-budget.png")
圖表如下圖所示(截取了部分以使文章長度可控):

基礎圖表看起來不錯,理想情況下,我想對y軸再做一些格式化,但是這樣做需要使用matplotlib的一些功能。雖然現在的圖表已是完美可用的可視化圖表了,但是僅僅通過pandas是不可能完成更多定制的。
Seaborn
Seaborn是一個基于matplotlib的可視化庫。它旨在使默認的數據可視化更加悅目。它還旨在簡化復雜圖表的創建,可以與pandas很好地集成。
本例中并未明顯將seaborn區別于其他其他工具(譯者注:并未展示一些seaborn獨有或者特色的功能),我非常喜歡seaborn多樣的內置風格,可以快速地修改調色板以使圖表看起來更美觀。其他方面,在創建這個簡易圖表時,并未使用seaborn做太多工作。
標準導包及讀取數據:
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
ggplot與Seaborn類似,也是基于matplotlib并旨在以簡單的方式提高matplotlib可視化的視覺感染力。它不同于seaborn是因為它是ggplot2為R語言準備的一個端口。基于這個目標,一些API的接口雖然不是很pythonic但是功能很強大。
我之前沒有在R中使用過ggplot,所以可能有一個學習曲線,但是我可以感受到ggplot的吸引力。該庫正在積極發展,我也希望它可以繼續成長、成熟。我認為它會是一個非常強大的工具。學習過程中,我也曾多次努力去弄清楚如何實現一些功能,在查閱代碼并在Google搜索之后,我基本上搞明白了大部分。
繼續導包并讀取數據:
importpandasaspd
fromggplotimport*
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("MNCapitalBudget-2014")+
xlab("SpendingDetail")+
ylab("Amount")+scale_y_continuous(labels='millions')+
theme(axis_text_x=element_text(angle=90))
printp
這似乎看起來有些奇怪–尤其是使用printp來顯示圖表。但是,我發現這樣相對簡單明了。
要弄清楚如何將文本旋轉90度以及如何將x軸上的標簽排序,確實要做些深入的挖掘。
我發現最酷的功能是scale_y_continous,它可以使標簽更美觀。
如果你想將圖表保存為圖片,使用ggsave可以很輕松地辦到:
ggsave(p,"mn-budget-capital-ggplot.png")
下圖是最終的圖片,我知道灰色可能有點多,但是毫不費時就可以給它添些色彩。

Bokeh
Bokeh不同于之前的3個庫,它不依賴于matplotlib并且實現的是面向現代瀏覽器的可視化。它的目標是實現交互式的web可視化,所以我的例子非常簡單。
導包并讀入數據:
importpandasaspd
frombokeh.chartsimportBar
budget=pd.read_csv("mn-budget-detail-2018.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("MNCapitalBudget-2018").xlabel("Detail").ylabel("Amount")
bar.show()
下面是png格式的圖片:

正如你所看到的,圖表是非常干凈的。我沒有找到一種更簡單的方式來格式化y軸。Bokeh有很多功能,但在本例中我并未深入探索。
Pygal
Pygal用于創建svg格式的圖表,如果安裝了正確的依賴,也可以保存為png格式。svg文件在創建交互式圖表時非常有用,同時我也發現,使用此工具可以非常容易地創建獨特而又極具視覺感染力的圖表。
導包及讀取數據:
importpandasaspd
importpygal
frompygal.styleimportLightStyle
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='MNCapitalBudget-2018')
有趣的一點是human_readable,它可以很好地格式化數據,所以大多數情況下,這個功能“很管用”。
現在我們需要向圖表中添加數據,這是與pandas集成地不是很緊湊的地方,但是就本次的小數據集來說,可以直接添加數據。數據量很大時,性能可能會是一個問題。
forindex,rowinbudget.iterrows(): bar_chart.add(row["detail"],row["amount"])
bar_chart.render_to_file('budget.svg')
bar_chart.render_to_png('budget.png')
接下來,將文件渲染為svg和png格式:
bar_chart.render_to_file('budget.svg')
bar_chart.render_to_png('budget.png')
我覺得svg的展示效果確實很好,我很喜歡看起來獨特且賞心悅目的風格。同時我也發現,我們可以相對容易地弄清楚使用此工具時,哪些可以實現,哪些不能實現。我鼓勵大家下載svg文件,并在瀏覽器中感受圖表的互動效果。
Plot.ly
Plot.ly區別于其他工具,是分析和可視化的在線工具。它具有強大的API并包含一個Python版本。基于Plot.ly,瀏覽網站時,你會看到豐富的交互式圖表。得益于優秀的文檔,創建條形圖會相對簡單。
你需要參考文檔設置API秘鑰,一旦設置完成,看起來所有工作就可以無縫對接了。需要警告的一點是,所有通過Plot.ly所做的東西都會發布到網上,所有請確保你可以接受這一點,當然你也可以圖表設為私有。
Plotly與pandas可以無縫集成。在這里我也要對他們的認真負責并及時地回復我的問題深表感謝。
導包并讀取數據:
importplotly.plotlyaspy
importpandasaspd
fromplotly.graph_objsimport*
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='2014MNCapitalBudget', 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='MNCapitalBudget-2018') py.image.save_as(fig,'mn-18-budget.png')

Plot.ly繪制出的圖表非常吸引人并且具有高度互動性。由于其優秀的文檔和PythonAPI以及入門和運行都很簡單。
下面一些見解:
Pandas對于簡單的圖表繪制時非常方便的,但是你需要學習matplotlib來實現定制。
Seaborn可以支持一些更復雜的可視化方法,但仍需要matplotlib的知識來調整。顏色方案是一個不錯的功能。
ggplot很有前景,但它仍在努力成長中。
如果你想建立自己的可視化服務器,bokeh將是一個強大的工具。但是對于一些簡單的腳本,使用bokeh就像殺雞用牛刀一樣。
pygal在創建互動使SVG圖表和PNG文件方面是獨一無二的。它不如基于matplotlib的解決方案靈活。
Plotly可以創建最具互動性的圖表。你可以離線保存,并創建非常豐富的基于網絡的可視化圖表。
最后想要了解更多關于Python發展前景趨勢,請關注扣丁學堂python培訓官網、微信等平臺,扣丁學堂IT職業在線學習教育平臺為您提供最新的Python視頻教程系統,通過千鋒扣丁學堂金牌講師在線錄制的Python視頻教程課程,讓你快速掌握Python從入門到精通開發實戰技能。扣丁學堂python學習交流群:816572891。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。
相關推薦
采用肖特基管的驅動保護電路
感謝工程師——無線電話聽筒
由集成電路TLP250構成的驅動器
驅動電路(電壓型)
關于codewarrior求助
環境應力篩選
射頻高速數模混合PCB設計加工專家
英偉達發布BlueField-4 DPU,搭載64核Grace CPU支持AI數據中心
[求助]請大家幫幫忙!
中國的一臺機器人剛剛在三天內走了66英里——創造了新的世界紀錄
面向Home Bus系統的電感選型指南
[求助]ucos-ii硬中斷
Segger 為系統內程序員增加了可編程系統測試
感謝工程師——關于短信發送
怎么在編譯內核時添加文件到文件系統?
關于tftp下載內核的問題!(tftpcmd相關)
多USB接口的局域網接入技術的實現
怪了!中性線發熱被無視,載流量表咋沒3 + 2、4 + 1芯電纜數據?
電力電子集成模塊的封裝結構與互連方式的研究現狀
新思科技亮相微軟Ignite大會,展示數字孿生賦能的制造流程優化框架
由分立元件構成的lGBT驅動電路
具身神經智能、類腦芯片的進展與展望
使用R系列Intelligent DAQ進行高級定時和出發
驅動保護二合一電路
面向NI PAC的確定性分布式I/O
低功耗手持多媒體終端硬件平臺的研究
什么是配電級數?為什么低壓系統通常不超過三級?
電視近距離人體信號檢測及保護電路研究
美國國家半導體推出的通信網絡設備解決方案可有效提供系統效率
電加熱微型反應器的串級自適應預估控制