還在使用Matplotlib?Plotly,是時候表演真正的技術了(附代碼)

還在使用Matplotlib?Plotly,是時候表演真正的技術了(附代碼)

作者 | Will Koehrsen

譯者 | 劉暢

出品 | Python大本營(ID:pythonnews)

如何僅使用一行代碼製作漂亮、互動性強的圖表?

程序員的沉沒成本論

沉沒成本謬論是人類眾多的認知偏見之一。它指的是我們傾向於持續將時間和資源投入到失去的原因中,因為我們已經花了很多時間去追求無用的事情。沉沒成本謬論適用於當我們花了很多成本也不會起作用的項目或工作。比如,當存在效率更高,互動性更強的選擇時,我們依然繼續使用Matplotlib。

在過去的幾個月裡,我意識到我使用Matplotlib的唯一原因是我花費了數百小時去學習它複雜的語法。這種複雜性讓作者在StackOverflow上遭受了數小時的挫折去弄清楚如何格式化日期或添加第二個y軸。幸運的是,在探索了一些選項後,一個在易用性,文檔和功能方面顯著的贏家是Plotly庫

在本文中,我們將直接上手使用Plotly,學習如何在更短的時間內製作出更好的圖表。

本文的所有代碼都可以在GitHub上找到(https://github.com/WillKoehrsen/Data-Analysis)。圖表都是交互式的,可以在NBViewer(https://w.url.cn/s/ALOvpfv)上查看。

还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

使用Plotly製作的樣例

Plotly簡介

Plotly Python包(https://plot.ly/python/)是一個基於plotly.js(https://plot.ly/javascript/)構建的開源庫,而後者又建立在d3.js(https://d3js.org/)上。我們將用一個名為cufflinks的封裝器來使用Pandas數據。因此,我們的整個堆棧是cufflinks> plotly> plotly.js> d3.js,這意味著我們可以通過d3的交互式圖形功能去獲得Python編碼的效率。

(Plotly本身就是一家擁有多種產品和開源工具的圖形公司。其Python版本的庫可以免費使用,我們可以在離線模式下創建無限的圖表,在線模式下最多可以創建25個圖表,用於共享。)

本文中的所有工作都是使用Jupyter notebook完成的,其中的plotyl+cuffilinks可以在離線模式下運行。在使用pip命令安裝了plotly和cufflinks之後,在Jupyter中運行以下命令:

<code># Standard plotly imports/<code><code>import plotly.plotly as py/<code><code>import plotly.graph_objs as go/<code><code>from plotly.offline import iplot, init_notebook_mode/<code><code># Using plotly + cufflinks in offline mode/<code><code>import cufflinks/<code><code>cufflinks.go_offline(connected=True)/<code><code>init_notebook_mode(connected=True)/<code>

單變量分佈:直方圖和箱線圖

單變量—單因素—圖是開始分析數據的標準方法,直方圖是繪製分佈圖的首選圖(雖然它有一些問題-https://w.url.cn/s/AkZpZF1)。在這裡,使用作者Medium文章的統計信息(你可以看到如何獲取你的統計數據,或者你也可以使用我的-https://w.url

.cn/s/AQRA3Kp),製作了關於文章點贊數量的交互式直方圖(df是標準的Pandas數據幀):

<code>df['claps'].iplot(kind='hist', xTitle='claps',/<code><code> yTitle='count', title='Claps Distribution')/<code>
还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

使用plotly+cufflinks製作的交互式直方圖

對於那些習慣使用Matplotlib的人來說,我們所要做的就是添加一個字母(使用iplot而不是plot),我們就可以得到一個更好看的交互式圖表!我們可以點擊數據來獲取更多細節,放大圖的各個部分,我們稍後會看到,可以選擇要高亮的內容。

如果我們想要繪製疊加的直方圖,使用如下代碼,同樣非常簡單:

<code>df[['time_started', 'time_published']].iplot(/<code><code> kind='hist',/<code><code> histnorm='percent',/<code><code> barmode='overlay',/<code><code> xTitle='Time of Day',/<code><code> yTitle='(%) of Articles',/<code><code> title='Time Started and Time Published')/<code>
还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

通過使用一點點Pandas相關的操作,我們可以做一個條形圖:

<code># Resample to monthly frequency and plot /<code><code>df2 = df[['view','reads','published_date']].\\/<code><code> set_index('published_date').\\/<code><code> resample('M').mean/<code><code>df2.iplot(kind='bar', xTitle='Date', yTitle='Average',/<code><code> title='Monthly Average Views and Reads') /<code>
还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

正如我們所看到的,我們可以將Pandas與plotly+cufflinks結合起來。可對按出版物每個故事的粉絲,繪製箱線圖:

<code>df.pivot(columns='publication', values='fans').iplot(/<code><code> kind='box',/<code><code> yTitle='fans',/<code><code> title='Fans Distribution by Publication')/<code>
还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

交互性的好處是我們可以根據需要探索和分組數據。在箱線圖中有很多信息,如果沒有觀察數字的能力,我們會錯過大部分的信息!

散點圖

散點圖是大多數分析方法的核心。它允許我們看到變量隨時間演變的過程或兩個(或更多)變量之間的關係。

時間序列

相當一部分的真實數據會有一個時間維度。幸運的是,plotly+cufflinks的設計考慮了時間序列的可視化。接下來使用下面的代碼製作一個關於作者TDS文章的數據框,看看趨勢是如何變化。

<code>Create a dataframe of Towards Data Science Articles/<code><code>tds = df[df['publication'] == 'Towards Data Science'].\\/<code><code> set_index('published_date')/<code><code># Plot read time as a time series/<code><code>tds[['claps', 'fans', 'title']].iplot(/<code><code> y='claps', mode='lines+markers', secondary_y = 'fans',/<code><code> secondary_y_title='Fans', xTitle='Date', yTitle='Claps',/<code><code> text='title', title='Fans and Claps over Time')/<code>
还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

在這裡,我們僅用一行代碼做了很多不同的事情:

  • 自動獲取時間序列x軸

  • 添加輔助y軸,因為我們的變量有不同的範圍

  • 將文章標題添加為懸停信息

我們還可以非常輕鬆地添加文本註釋:

<code>tds_monthly_totals.iplot(/<code><code> mode='lines+markers+text',/<code><code> text=text,/<code><code> y='word_count',/<code><code> opacity=0.8,/<code><code> xTitle='Date',/<code><code> yTitle='Word Count',/<code><code> title='Total Word Count by Month') /<code>
还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

帶註釋的散點圖

對於使用第三個變量來上色的雙變量散點圖,我們可以使用如下命令:

<code>df.iplot(/<code><code> x='read_time',/<code><code> y='read_ratio',/<code><code> # Specify the category/<code><code> categories='publication',/<code><code> xTitle='Read Time',/<code><code> yTitle='Reading Percent',/<code><code> title='Reading Percent vs Read Ratio by Publication')/<code>
还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

我們可以使用log軸(指定為繪圖佈局)(參見Plotly文檔-中的佈局細節-https://plot.ly/python/reference/)以及數值變量來調整氣泡,讓圖表更復雜一點:

<code>tds.iplot(/<code><code> x='word_count',/<code><code> y='reads',/<code><code> size='read_ratio',/<code><code> text=text,/<code><code> mode='markers',/<code><code> # Log xaxis/<code><code> layout=dict(/<code><code> xaxis=dict(type='log', title='Word Count'),/<code><code> yaxis 
=dict(title='Reads'),/<code><code> title='Reads vs Log Word Count Sized by Read Ratio'))/<code>
还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

更進一步的工作(詳見notebook-https://w.url.cn/s/AS8rPTo

),我們甚至可以在一個圖表上放置四個變量(不建議-https://w.url.cn/s/ALRC02Y)!

还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

和之前一樣,我們可以將pandas與plotly + cufflinks結合起來,用於獲得有用的圖表。

<code>df.pivot_table(/<code><code> values='views', index='published_date',/<code><code> columns='publication').cumsum.iplot(/<code><code> mode='markers+lines',/<code><code> size=8,/<code><code> symbol=[1, 2, 3, 4, 5],/<code><code> layout=dict(/<code><code> xaxis=dict(title='Date'),/<code><code> yaxis=dict(type='log', title='Total Views'),/<code><code> title='Total Views over Time by Publication'))/<code>
还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

有關添加功能的更多示例,請參閱notebook或文檔。我們可以使用單行代碼在文本中添加文本註釋,參考線和最佳擬合線,並且仍然可以進行所有的交互。

進階圖表

現在我們將製作一些你可能不會經常使用的圖表,它可能會令人印象深刻。我們將使用plotly figure_factory(https://w.url.cn/s/ACGcXLa

),也僅使用一行代碼來製作這些令人難以置信的圖。

散點矩陣

當我們想要探索許多變量之間的關係時,散點矩陣(也稱為splom)是一個很好的選擇:

<code>import plotly.figure_factory as ff/<code><code>figure = ff.create_scatterplotmatrix(/<code><code> df[['claps', 'publication', 'views', /<code><code> 'read_ratio','word_count']],/<code><code> diag='histogram',/<code><code> index='publication')/<code>
还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

這個圖也是可以完全人機交互的,用於探索數據。

相關性熱力圖

為了可視化數值變量之間的相關性,我們會計算相關性,然後製作帶註釋的熱力圖:

<code>corrs = df.corr/<code><code>figure = ff.create_annotated_heatmap(/<code><code> z=corrs.values,/<code><code> x=list(corrs.columns),/<code><code> y=list(corrs.index),/<code><code> annotation_text=corrs.round(2).values,/<code><code> showscale=True)/<code>
还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

還有很多不同類型的圖。cufflinks還有幾個主題,我們可以用來製作完全不同的風格。例如,下面我們在“空間”主題中有一個比率圖,在“ggplot”中有一個展開圖:

还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

我們還可以得到3D圖(表面和氣泡):

还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)
还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

你甚至可以製作餅圖:

还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

在Plotly Chart Studio中編輯

當你在Notebook中製作這些圖時,你會注意到圖表右下角有一個小鏈接,上面寫著“Export to plot.ly”。如果單擊該鏈接,你將會進入到Chat Studio,在那裡您可以修改圖並進行最終演示。你可以添加註釋,指定顏色,並清理所有不相關的內容來得到一張出色的圖。然後,你可以在線發佈圖,以便任何人都可以通過鏈接找到它。

下面是我在Chart Studio中發佈的兩個圖表:

还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

上面提到的一切,並不是該繪圖庫的全部功能!因此作者建議讀者查看plotly和cufflinks文檔,以獲得更令人難以置信的圖形。

还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

Plotly interactive graphics of wind farms in United States (Source)

總結

關於沉沒成本謬論最糟糕的部分是你只能意識到在你退出這項努力之後浪費了多少時間。幸運的是,現在作者犯了長時間堅持使用Matploblib的錯誤,而你不必!

在考慮繪圖庫時,我們通常想要以下的一些東西:

1、僅用一行代碼就可以快速探索數據

2、用於子集化/調查數據的交互元素

3、根據需要深入挖掘細節

4、輕鬆定製最終演示文稿

截至目前,在Python中完成所有這些操作的最佳選擇是 Plotly庫。Plotly允許我們快速進行可視化,並幫助我們通過交互更好地探索我們的數據。此外,必須承認的是,繪圖應該是數據科學中最令人愉快的部分之一!使用其他庫時,繪圖變成了一項繁瑣的任務。但是使用plotly庫時,可以為製作一張好圖而愉悅!

还在使用Matplotlib?Plotly,是时候表演真正的技术了(附代码)

A plot of my enjoyment with plotting in Python over time

現在是2019年,是時候升級您的Python繪圖庫,以便在數據可視化中實現更優的效率,功能和美學。

原文地址:

https://towardsdatascience.com/the-next-level-of-data-visualization-in-python-dd6e99039d5e


分享到:


相關文章: