Python的可視化庫(kù)超全盤點(diǎn),有你中意的一款嗎?
前言
使用Python創(chuàng)建圖形的方法有很多,但是哪種方法最好呢?當(dāng)我們進(jìn)行可視化時(shí),問(wèn)一些關(guān)于圖形目標(biāo)的問(wèn)題是很重要的:您是否試圖對(duì)數(shù)據(jù)的外觀有一個(gè)初步的感覺(jué)?也許你是想在演示中給人留下深刻印象?在這篇文章中,我將介紹一些流行的Python可視化包,它們的優(yōu)缺點(diǎn),以及它們各自的優(yōu)點(diǎn)。
Matplotlib, Seaborn, and Pandas:
我將出于幾個(gè)原因?qū)⑺鼈兘M合在一起,首先是Seaborn和Pandas繪圖是建立在Matplotlib之上的——當(dāng)你在panda中使用Seaborn或df.plot()時(shí),你實(shí)際上是在利用Matplotlib編寫的代碼。因此,每一種方法產(chǎn)生的美感都是相似的,定制圖片的方法將使用非常相似的語(yǔ)法。
當(dāng)我想到這些可視化工具時(shí),我想到:探索性數(shù)據(jù)分析。這些包對(duì)于第一次查看您的數(shù)據(jù)是非常棒的,但是當(dāng)涉及到表示時(shí)就不太好了。Matplotlib還有一組樣式選擇,它們模仿其他流行的美學(xué),比如ggplot2和xkcd。下面是一些使用Matplotlib和它的近親制作的圖的例子:
在處理籃球薪資數(shù)據(jù)時(shí),我希望找到擁有最高薪資中位數(shù)數(shù)據(jù)的球隊(duì)。為了說(shuō)明這一點(diǎn),我用顏色編碼了一個(gè)柱狀圖,下面是每支球隊(duì)的工資,以顯示球員應(yīng)該去哪支球隊(duì),這樣才能加入薪酬高的球隊(duì)。
- import seaborn as snsimport matplotlib.pyplot as pltcolor_order =
- ['xkcd:cerulean', 'xkcd:ocean', 'xkcd:black','xkcd:royal purple',
- 'xkcd:royal purple', 'xkcd:navy blue', 'xkcd:powder blue',
- 'xkcd:light maroon', 'xkcd:lightish
- blue','xkcd:navy']sns.barplot(x=top10.Team, y=top10.Salary,
- palette=color_order).set_title(' Teams with Highest Median
- Salary')plt.ticklabel_format(style='sci', axis='y', scilimits=(0,0))

接下來(lái)是回歸實(shí)驗(yàn)殘差的Q-Q圖。這種可視化的主要目的是顯示我們可以用很少的代碼顯示比較完整的圖片。
- import matplotlib.pyplot as pltimport scipy.stats as stats#model2 is
- a regression modellog_resid = model2.predict(X_test)-
- y_teststats.probplot(log_resid, dist="norm",
- plot=plt)plt.title("Normal Q-Q plot")plt.show()

最終,Matplotlib和它的相關(guān)組件非常高效,但就演示而言,它們通常不是最終產(chǎn)品。
ggplot(2)
ggplot是最流行的R可視化軟件包。這不是一個(gè)Python包評(píng)審嗎?你可能會(huì)問(wèn)。開發(fā)人員用Python實(shí)現(xiàn)了ggplot2,復(fù)制了從美學(xué)到語(yǔ)法的所有內(nèi)容。從我所見(jiàn)過(guò)的所有材料來(lái)看,它的外觀和感覺(jué)都很像ggplot2,但是還有一個(gè)額外的好處,它依賴于pandas Python包,該包最近棄用了一些方法,導(dǎo)致ggplot的Python版本變得無(wú)關(guān)。如果您想在R中使用真正的ggplot(它具有所有相同的外觀、感覺(jué)和語(yǔ)法,沒(méi)有依賴項(xiàng)),我將在這里討論它的一些額外功能!也就是說(shuō),如果您確實(shí)必須在Python中使用ggplot,那么您必須安裝pandas版本0.19.2,但是我要提醒您不要降低您的pandas的級(jí)別,這樣您就可以使用一個(gè)較差的繪圖包。
使ggplot2(我猜還有Python的ggplot)改變游戲規(guī)則的是,它們使用“圖形語(yǔ)法”來(lái)構(gòu)造圖形。基本的前提是,您可以實(shí)例化您的圖片,然后分別添加不同的功能,即標(biāo)題、軸、數(shù)據(jù)點(diǎn)和趨勢(shì)線都是單獨(dú)添加的,具有各自的美學(xué)屬性。下面是一些ggplot代碼的簡(jiǎn)單示例。首先,我們用ggplot實(shí)例化圖形,設(shè)置美學(xué)和數(shù)據(jù),然后添加點(diǎn)、主題和軸/標(biāo)題標(biāo)簽。
- #All Salariesggplot(data=df, aes(x=season_start, y=salary,
- colour=team)) + geom_point() + theme(legend.position="none") +
- labs(title = 'Salary Over Time', x='Year', y='Salary ($)')

Bokeh
Bokeh很漂亮。概念上類似于ggplot,它使用圖形語(yǔ)法來(lái)構(gòu)造圖形,Bokeh有一個(gè)易于使用的界面,可以制作非常專業(yè)的圖形和儀表板。
- import pandas as pdfrom bokeh.plotting import figurefrom bokeh.io
- import show# is_masc is a one-hot encoded dataframe of responses to
- the question:# "Do you identify as masculine?"#Dataframe Prepcounts =
- is_masc.sum()resps = is_masc.columns#Bokehp2 = figure(title='Do You
- View Yourself As Masculine?', x_axis_label='Response', y_axis_label='Count',
- x_range=list(resps))p2.vbar(x=resps, top=counts,
- width=0.6, fill_color='red',
- line_color='black')show(p2)#Pandascounts.plot(kind='bar')

上面的柱狀圖顯示了538位在最近的一次調(diào)查中對(duì)“你認(rèn)為自己是男性嗎”這個(gè)問(wèn)題的回答。第9-14行中的Bokeh代碼創(chuàng)建了一個(gè)優(yōu)雅的、專業(yè)的響應(yīng)計(jì)數(shù)直方圖,具有合理的字體大小、y標(biāo)記和格式。我編寫的大部分代碼用于標(biāo)記坐標(biāo)軸和標(biāo)題,以及給條形圖添加顏色和邊框。當(dāng)制作漂亮的,像樣的圖形時(shí),我非常傾向于Bokeh -很多美學(xué)工作已經(jīng)為我們做了!

上面的藍(lán)色圖是上面要點(diǎn)的第17行上的一行代碼。這兩個(gè)直方圖具有相同的值,但用途不同。在一個(gè)探索性的設(shè)置中,與pandas一起寫一行來(lái)查看數(shù)據(jù)要方便得多,但是Bokeh的美學(xué)是相當(dāng)出色的。Bokeh提供的所有便利都可以在Matplotlib中進(jìn)行定制,包括x軸標(biāo)簽的角度、背景線、y軸擴(kuò)展、字體大小/斜體/粗體等。下圖顯示了一些隨機(jī)的趨勢(shì),使用了更多的自定義圖例和不同的線條類型和顏色:

最后提一下,Bokeh也是一個(gè)制作交互式儀表板的好工具。
Plotly
Plotly是非常強(qiáng)大的,但設(shè)置和創(chuàng)建的數(shù)字需要很多時(shí)間,都不是直觀的。在花了大半個(gè)上午埋頭苦干之后,我去吃午飯,幾乎什么也沒(méi)看到。我創(chuàng)建了一個(gè)沒(méi)有軸標(biāo)簽的條形圖和一個(gè)“散點(diǎn)圖”,其中的線條我無(wú)法刪除。一些值得注意的缺點(diǎn)有:
- 它需要一個(gè)API密鑰和注冊(cè),而不僅僅是一個(gè)pip安裝它
- 繪制的數(shù)據(jù)/布局對(duì)象是獨(dú)特的圖片,并不直觀
- 圖片布局對(duì)我不起作用(40行代碼什么都沒(méi)有!)
- 然而,對(duì)于所有設(shè)置的缺點(diǎn),也有優(yōu)點(diǎn)和變通方法:
- 您可以在Plotly網(wǎng)站和Python環(huán)境中編輯圖片
- 有很多對(duì)交互式圖形/儀表板的支持
- Plotly與Mapbox合作,可以定制地圖
- 有驚人的整體潛力
如果我只是用一些代碼來(lái)表達(dá)我的不滿,而不展示一些代碼和我能夠完成的工作,以及那些更有能力使用這個(gè)包的人所完成的工作,這對(duì)我來(lái)說(shuō)是不公平的:
- #plot 1 - barplot# **note** - the layout lines do nothing and trip no errorsdata = [go.Bar(x=team_ave_df.team,
- y=team_ave_df.turnovers_per_mp)]layout = go.Layout( title=go.layout.Title(
- text='Turnovers per Minute by Team', xref='paper', x=0),
- xaxis=go.layout.XAxis(title = go.layout.xaxis.Title(
- text='Team', font=dict( family='Courier New, monospace',
- size=18, color='#7f7f7f' ) ) ),
- yaxis=go.layout.YAxis( title = go.layout.yaxis.Title(
- text='Average Turnovers/Minute', font=dict(
- family='Courier New, monospace', size=18,
- color='#7f7f7f' ) ) ),
- autosize=True, hovermode='closest')py.iplot(figure_or_data=data, layout=layout,
- filename='jupyter-plot', sharing='public',
- fileopt='overwrite')#plot 2 - attempt at a scatterplotdata = [go.Scatter(x=player_year.minutes_played, y=player_year.salary,
- marker=go.scatter.Marker(color='red', size=3))]layout = go.Layout(title="test", xaxis=dict(title='why'),
- yaxis=dict(title='plotly'))py.iplot(figure_or_data=data,
- layout=layout, filename='jupyter-plot2', sharing='public')

總的來(lái)說(shuō),開箱即用的外觀看起來(lái)不錯(cuò),但是多次嘗試修復(fù)axis標(biāo)簽,逐字復(fù)制文檔,都沒(méi)有產(chǎn)生任何變化。然而,正如我之前承諾過(guò)的,這里有一些圖片展示了它的潛力,以及為什么花幾個(gè)小時(shí)以上可能是值得的:

Pygal
Pygal是一個(gè)不太為人所知的繪圖包,它與其他流行的包一樣,使用圖形框架的語(yǔ)法來(lái)構(gòu)造圖像。由于圖片對(duì)象非常簡(jiǎn)單,所以它是一個(gè)相對(duì)簡(jiǎn)單的包。使用Pygal非常簡(jiǎn)單:
- 實(shí)例化你的圖片
- 使用圖形對(duì)象的屬性格式化
- 使用figure. Add()符號(hào)將數(shù)據(jù)添加到圖形中
我在Pygal中遇到的主要問(wèn)題是如何渲染圖形。我必須使用他們的render_to_file選項(xiàng),然后在web瀏覽器中打開該文件,看看我構(gòu)建了什么。它最終是值得的,因?yàn)檫@些數(shù)字是互動(dòng)的,有一個(gè)愉快的和容易定制的審美。總的來(lái)說(shuō),這個(gè)包看起來(lái)不錯(cuò),但是有一些文件創(chuàng)建/渲染的怪癖限制了它的吸引力。

Networkx
Networkx是分析和可視化圖形的一個(gè)很好的解決方案,盡管它是基于matplotlib的。圖形和網(wǎng)絡(luò)不是我的專業(yè)領(lǐng)域,但Networkx允許快速、簡(jiǎn)單地用圖形表示連接的網(wǎng)絡(luò)。下面是我構(gòu)建的一個(gè)簡(jiǎn)單圖的幾個(gè)不同的表示,以及從斯坦福SNAP下載的一些開始繪制小型Facebook網(wǎng)絡(luò)的代碼。

我用顏色標(biāo)注每個(gè)節(jié)點(diǎn)編號(hào)(1-10)的代碼如下:
- options = {'node_color' : range(len(G)), 'node_size' :
- 300, 'width' : 1, 'with_labels' : False, 'cmap' :
- plt.cm.coolwarm}nx.draw(G, **options)

總結(jié)
有那么多的包可以可視化數(shù)據(jù),卻沒(méi)有明確的最佳包。希望在閱讀完這篇綜述之后,您可以看到各種美學(xué)和代碼如何適用于不同的情況,從EDA到presentation。

































