前言
使用Python創建圖形的方法有很多,但是哪種方法最好呢?當我們進行可視化時,問一些關於圖形目標的問題是很重要的:您是否試圖對數據的外觀有一個初步的感覺?也許你是想在演示中給人留下深刻印象?在這篇文章中,我將介紹一些流行的Python可視化包,它們的優缺點,以及它們各自的優點。
Matplotlib, Seaborn, and Pandas:
我將出於幾個原因將它們組合在一起,首先是Seaborn和Pandas繪圖是建立在Matplotlib之上的——當你在panda中使用Seaborn或df.plot()時,你實際上是在利用Matplotlib編寫的代碼。因此,每一種方法產生的美感都是相似的,定製圖片的方法將使用非常相似的語法。
當我想到這些可視化工具時,我想到:探索性數據分析。這些包對於第一次查看您的數據是非常棒的,但是當涉及到表示時就不太好了。Matplotlib還有一組樣式選擇,它們模仿其他流行的美學,比如ggplot2和xkcd。下面是一些使用Matplotlib和它的近親製作的圖的例子:
在處理籃球薪資數據時,我希望找到擁有最高薪資中位數數據的球隊。為了說明這一點,我用顏色編碼了一個柱狀圖,下面是每支球隊的工資,以顯示球員應該去哪支球隊,這樣才能加入薪酬高的球隊。
<code>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))/<code>
接下來是迴歸實驗殘差的Q-Q圖。這種可視化的主要目的是顯示我們可以用很少的代碼顯示比較完整的圖片。
<code>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()/<code>
最終,Matplotlib和它的相關組件非常高效,但就演示而言,它們通常不是最終產品。
ggplot(2)
ggplot是最流行的R可視化軟件包。這不是一個Python包評審嗎?你可能會問。開發人員用Python實現了ggplot2,複製了從美學到語法的所有內容。從我所見過的所有材料來看,它的外觀和感覺都很像ggplot2,但是還有一個額外的好處,它依賴於pandas Python包,該包最近棄用了一些方法,導致ggplot的Python版本變得無關。如果您想在R中使用真正的ggplot(它具有所有相同的外觀、感覺和語法,沒有依賴項),我將在這裡討論它的一些額外功能!也就是說,如果您確實必須在Python中使用ggplot,那麼您必須安裝pandas版本0.19.2,但是我要提醒您不要降低您的pandas的級別,這樣您就可以使用一個較差的繪圖包。
使ggplot2(我猜還有Python的ggplot)改變遊戲規則的是,它們使用“圖形語法”來構造圖形。基本的前提是,您可以實例化您的圖片,然後分別添加不同的功能,即標題、軸、數據點和趨勢線都是單獨添加的,具有各自的美學屬性。下面是一些ggplot代碼的簡單示例。首先,我們用ggplot實例化圖形,設置美學和數據,然後添加點、主題和軸/標題標籤。
<code>#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 ($)')/<code>
Bokeh
Bokeh很漂亮。概念上類似於ggplot,它使用圖形語法來構造圖形,Bokeh有一個易於使用的界面,可以製作非常專業的圖形和儀表板。
<code>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')/<code>
上面的柱狀圖顯示了538位在最近的一次調查中對“你認為自己是男性嗎”這個問題的回答。第9-14行中的Bokeh代碼創建了一個優雅的、專業的響應計數直方圖,具有合理的字體大小、y標記和格式。我編寫的大部分代碼用於標記座標軸和標題,以及給條形圖添加顏色和邊框。當製作漂亮的,像樣的圖形時,我非常傾向於Bokeh -很多美學工作已經為我們做了!
上面的藍色圖是上面要點的第17行上的一行代碼。這兩個直方圖具有相同的值,但用途不同。在一個探索性的設置中,與pandas一起寫一行來查看數據要方便得多,但是Bokeh的美學是相當出色的。Bokeh提供的所有便利都可以在Matplotlib中進行定製,包括x軸標籤的角度、背景線、y軸擴展、字體大小/斜體/粗體等。下圖顯示了一些隨機的趨勢,使用了更多的自定義圖例和不同的線條類型和顏色:
最後提一下,Bokeh也是一個製作交互式儀表板的好工具。
Plotly
Plotly是非常強大的,但設置和創建的數字需要很多時間,都不是直觀的。在花了大半個上午埋頭苦幹之後,我去吃午飯,幾乎什麼也沒看到。我創建了一個沒有軸標籤的條形圖和一個“散點圖”,其中的線條我無法刪除。一些值得注意的缺點有:
- 它需要一個API密鑰和註冊,而不僅僅是一個pip安裝它
- 繪製的數據/佈局對象是獨特的圖片,並不直觀
- 圖片佈局對我不起作用(40行代碼什麼都沒有!)
然而,對於所有設置的缺點,也有優點和變通方法:
- 您可以在Plotly網站和Python環境中編輯圖片
- 有很多對交互式圖形/儀表板的支持
- Plotly與Mapbox合作,可以定製地圖
- 有驚人的整體潛力
如果我只是用一些代碼來表達我的不滿,而不展示一些代碼和我能夠完成的工作,以及那些更有能力使用這個包的人所完成的工作,這對我來說是不公平的:
<code>#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')/<code>
總的來說,開箱即用的外觀看起來不錯,但是多次嘗試修復axis標籤,逐字複製文檔,都沒有產生任何變化。然而,正如我之前承諾過的,這裡有一些圖片展示了它的潛力,以及為什麼花幾個小時以上可能是值得的:
Pygal
Pygal是一個不太為人所知的繪圖包,它與其他流行的包一樣,使用圖形框架的語法來構造圖像。由於圖片對象非常簡單,所以它是一個相對簡單的包。使用Pygal非常簡單:
- 實例化你的圖片
- 使用圖形對象的屬性格式化
- 使用figure. Add()符號將數據添加到圖形中
我在Pygal中遇到的主要問題是如何渲染圖形。我必須使用他們的render_to_file選項,然後在web瀏覽器中打開該文件,看看我構建了什麼。它最終是值得的,因為這些數字是互動的,有一個愉快的和容易定製的審美。總的來說,這個包看起來不錯,但是有一些文件創建/渲染的怪癖限制了它的吸引力。
Networkx
Networkx是分析和可視化圖形的一個很好的解決方案,儘管它是基於matplotlib的。圖形和網絡不是我的專業領域,但Networkx允許快速、簡單地用圖形表示連接的網絡。下面是我構建的一個簡單圖的幾個不同的表示,以及從斯坦福SNAP下載的一些開始繪製小型Facebook網絡的代碼。
我用顏色標註每個節點編號(1-10)的代碼如下:
<code>options = {'node_color' : range(len(G)), 'node_size' : 300, 'width' : 1, 'with_labels' : False, 'cmap' : plt.cm.coolwarm}nx.draw(G, **options)/<code>
總結
有那麼多的包可以可視化數據,卻沒有明確的最佳包。希望在閱讀完這篇綜述之後,您可以看到各種美學和代碼如何適用於不同的情況,從EDA到presentation。
閱讀更多 機器學習與數據分析 的文章