作者 | Will Koehrsen
如何僅使用一行代碼制作漂亮、互動性強(qiáng)的圖表?
程序員的沉沒成本論
沉沒成本謬論是人類眾多的認(rèn)知偏見之一。 它指的是我們傾向于持續(xù)將時間和資源投入到失去的原因中,因?yàn)槲覀円呀?jīng)花了很多時間去追求無用的事情。沉沒成本謬論適用于當(dāng)我們花了很多成本也不會起作用的項(xiàng)目或工作。比如,當(dāng)存在效率更高,互動性更強(qiáng)的選擇時,我們依然繼續(xù)使用Matplotlib。
在過去的幾個月里,我意識到我使用Matplotlib的唯一原因是我花費(fèi)了數(shù)百小時去學(xué)習(xí)它復(fù)雜的語法。這種復(fù)雜性讓作者在StackOverflow上遭受了數(shù)小時的挫折去弄清楚如何格式化日期或添加第二個y軸。幸運(yùn)的是,在探索了一些選項(xiàng)后,一個在易用性,文檔和功能方面顯著的贏家是Plotly庫。
在本文中,我們將直接上手使用Plotly,學(xué)習(xí)如何在更短的時間內(nèi)制作出更好的圖表。
本文的所有代碼都可以在GitHub上找到(https://github.com/WillKoehrsen/Data-Analysis)。 圖表都是交互式的,可以在NBViewer(https://w.url.cn/s/ALOvpfv)上查看。
Plotly簡介
Plotly Python包(https://plot.ly/python/)是一個基于plotly.js(https://plot.ly/javascript/)構(gòu)建的開源庫,而后者又建立在d3.js(https://d3js.org/)上。我們將用一個名為cufflinks的封裝器來使用Pandas數(shù)據(jù)。因此,我們的整個堆棧是cufflinks> plotly> plotly.js> d3.js,這意味著我們可以通過d3的交互式圖形功能去獲得Python編碼的效率。
(Plotly本身就是一家擁有多種產(chǎn)品和開源工具的圖形公司。其Python版本的庫可以免費(fèi)使用,我們可以在離線模式下創(chuàng)建無限的圖表,在線模式下最多可以創(chuàng)建25個圖表,用于共享。)
本文中的所有工作都是使用Jupyter notebook完成的,其中的plotyl+cuffilinks可以在離線模式下運(yùn)行。 在使用pip命令安裝了plotly和cufflinks之后,在Jupyter中運(yùn)行以下命令:
單變量分布:直方圖和箱線圖
單變量—單因素—圖是開始分析數(shù)據(jù)的標(biāo)準(zhǔn)方法,直方圖是繪制分布圖的首選圖(雖然它有一些問題-https://w.url.cn/s/AkZpZF1)。在這里,使用作者M(jìn)edium文章的統(tǒng)計(jì)信息(你可以看到如何獲取你的統(tǒng)計(jì)數(shù)據(jù),或者你也可以使用我的-https://w.url.cn/s/AQRA3Kp),制作了關(guān)于文章點(diǎn)贊數(shù)量的交互式直方圖(df是標(biāo)準(zhǔn)的Pandas數(shù)據(jù)幀):
對于那些習(xí)慣使用Matplotlib的人來說,我們所要做的就是添加一個字母(使用iplot而不是plot),我們就可以得到一個更好看的交互式圖表! 我們可以點(diǎn)擊數(shù)據(jù)來獲取更多細(xì)節(jié),放大圖的各個部分,我們稍后會看到,可以選擇要高亮的內(nèi)容。
如果我們想要繪制疊加的直方圖,使用如下代碼,同樣非常簡單:
通過使用一點(diǎn)點(diǎn)Pandas相關(guān)的操作,我們可以做一個條形圖:
正如我們所看到的,我們可以將Pandas與plotly+cufflinks結(jié)合起來??蓪Π闯霭嫖锩總€故事的粉絲,繪制箱線圖:
交互性的好處是我們可以根據(jù)需要探索和分組數(shù)據(jù)。 在箱線圖中有很多信息,如果沒有觀察數(shù)字的能力,我們會錯過大部分的信息!
散點(diǎn)圖
散點(diǎn)圖是大多數(shù)分析方法的核心。它允許我們看到變量隨時間演變的過程或兩個(或更多)變量之間的關(guān)系。
時間序列
相當(dāng)一部分的真實(shí)數(shù)據(jù)會有一個時間維度。 幸運(yùn)的是,plotly+cufflinks的設(shè)計(jì)考慮了時間序列的可視化。 接下來使用下面的代碼制作一個關(guān)于作者TDS文章的數(shù)據(jù)框,看看趨勢是如何變化。
在這里,我們僅用一行代碼做了很多不同的事情:
自動獲取時間序列x軸
添加輔助y軸,因?yàn)槲覀兊淖兞坑胁煌姆秶?/p>
將文章標(biāo)題添加為懸停信息
我們還可以非常輕松地添加文本注釋:
對于使用第三個變量來上色的雙變量散點(diǎn)圖,我們可以使用如下命令:
我們可以使用log軸(指定為繪圖布局)(參見Plotly文檔-中的布局細(xì)節(jié)-https://plot.ly/python/reference/)以及數(shù)值變量來調(diào)整氣泡,讓圖表更復(fù)雜一點(diǎn):
更進(jìn)一步的工作(詳見notebook-https://w.url.cn/s/AS8rPTo
),我們甚至可以在一個圖表上放置四個變量(不建議-https://w.url.cn/s/ALRC02Y)!
和之前一樣,我們可以將pandas與plotly + cufflinks結(jié)合起來,用于獲得有用的圖表。
有關(guān)添加功能的更多示例,請參閱notebook或文檔。 我們可以使用單行代碼在文本中添加文本注釋,參考線和最佳擬合線,并且仍然可以進(jìn)行所有的交互。
進(jìn)階圖表
現(xiàn)在我們將制作一些你可能不會經(jīng)常使用的圖表,它可能會令人印象深刻。我們將使用plotly figure_factory(https://w.url.cn/s/ACGcXLa
),也僅使用一行代碼來制作這些令人難以置信的圖。
散點(diǎn)矩陣
當(dāng)我們想要探索許多變量之間的關(guān)系時,散點(diǎn)矩陣(也稱為splom)是一個很好的選擇:
這個圖也是可以完全人機(jī)交互的,用于探索數(shù)據(jù)。
相關(guān)性熱力圖
為了可視化數(shù)值變量之間的相關(guān)性,我們會計(jì)算相關(guān)性,然后制作帶注釋的熱力圖:
還有很多不同類型的圖。cufflinks還有幾個主題,我們可以用來制作完全不同的風(fēng)格。例如,下面我們在“空間”主題中有一個比率圖,在“ggplot”中有一個展開圖:
我們還可以得到3D圖(表面和氣泡):
你甚至可以制作餅圖:
在Plotly Chart Studio中編輯
當(dāng)你在Notebook中制作這些圖時,你會注意到圖表右下角有一個小鏈接,上面寫著“Export to plot.ly”。 如果單擊該鏈接,你將會進(jìn)入到Chat Studio,在那里您可以修改圖并進(jìn)行最終演示。 你可以添加注釋,指定顏色,并清理所有不相關(guān)的內(nèi)容來得到一張出色的圖。然后,你可以在線發(fā)布圖,以便任何人都可以通過鏈接找到它。
下面是我在Chart Studio中發(fā)布的兩個圖表:
上面提到的一切,并不是該繪圖庫的全部功能! 因此作者建議讀者查看plotly和cufflinks文檔,以獲得更令人難以置信的圖形。
Plotly interactive graphics of wind farms in United States (Source)
總結(jié)
關(guān)于沉沒成本謬論最糟糕的部分是你只能意識到在你退出這項(xiàng)努力之后浪費(fèi)了多少時間。幸運(yùn)的是,現(xiàn)在作者犯了長時間堅(jiān)持使用Matploblib的錯誤,而你不必!
在考慮繪圖庫時,我們通常想要以下的一些東西:
1、僅用一行代碼就可以快速探索數(shù)據(jù)
2、用于子集化/調(diào)查數(shù)據(jù)的交互元素
3、根據(jù)需要深入挖掘細(xì)節(jié)
4、輕松定制最終演示文稿
截至目前,在Python中完成所有這些操作的最佳選擇是 Plotly庫。 Plotly允許我們快速進(jìn)行可視化,并幫助我們通過交互更好地探索我們的數(shù)據(jù)。 此外,必須承認(rèn)的是,繪圖應(yīng)該是數(shù)據(jù)科學(xué)中最令人愉快的部分之一! 使用其他庫時,繪圖變成了一項(xiàng)繁瑣的任務(wù)。但是使用plotly庫時,可以為制作一張好圖而愉悅!
A plot of my enjoyment with plotting in Python over time
現(xiàn)在是2019年,是時候升級您的Python繪圖庫,以便在數(shù)據(jù)可視化中實(shí)現(xiàn)更優(yōu)的效率,功能和美學(xué)。