比 matplotlib 效率高十倍的資料視覺化神器
心理學上有一個名詞叫“沉沒成本謬誤”,它指如果我們已經在一項事業上花費了很多時間,那麼即使明知是失敗的,我們仍然會傾向於繼續把時間和資源花在上面。
在資料視覺化的路上,我也曾犯過這樣的錯誤。
當我明知存在更高效、更具互動性和外觀更好的替代方案時,我卻仍然繼續使用一個過時的繪相簿——matplotlib,只是因為我曾經花了數百個小時來學習 matplotlib 複雜的語法。
幸運的是,現在有許多的開源繪相簿可供選擇,經過仔細研究,我發現 plotly 包無論從易用性、互動性還是功能性來看,都有絕對的優勢。接下來,我將帶領大家學會如何用更少的時間繪製更美觀的視覺化圖表——通常只需要一行程式碼。
Plotly簡要概述
plotly Python 包是一個構建在 plotly。js 上的開源庫,而後者又是構建在 d3。js 上的。我們將使用一個 plotly 的“包裝器”——cufflinks,它可以 plotly 的使用變得更加簡單。整個堆疊順序是cufflinks>plotly>plotly。js>d3。js,意味著我們同時獲得了 Python 的程式設計高效性和d3強大的圖形互動能力。(畢竟d3。js是全世界公認的第一視覺化框架!)
本文中所有工作都是使用 plotly+cufflinks 在 Jupyter Notebook 中完成的。在開始前,我們需要使用
pip install cufflinks plotly
在 Python 環境中安裝這兩個包,然後在 jupyter notebook 中匯入這兩個包:
# 匯入plotly包
import plotly。plotly as py
import plotly。graph_objs as go
from plotly。offline import iplot,init_notebook_mode
# 使用離線模式的 plotly + cufflinks
import cufflinks
cufflinks。go_offline(connected=True)
單變數分佈:直方圖和箱線圖
單變數-單變數製圖是開始一個數據分析的標準方法。直方圖是繪製單變數分佈的首選方式。在這裡,我使用的資料來源是我個人在 medium 網站上所寫過文章的統計資訊,讓我們先來製作一個關於文章點贊次數的互動式直方圖(df 是一個標準的 Pandas 資料結構)。
df[‘claps’]。iplot(kind=‘hist’, xTitle=‘claps’, yTitle=‘count’, title=‘Claps Distribution’)
如果你已經習慣使用
matplotlib
,你所需要做的只是在你原有程式碼的基礎上新增一個字母,即把 plot 改為 iplot,就可以得到一個更加好看的互動式圖示!我們可以透過滑鼠的滑動獲得更多的資料幾節,還可以放大圖的各個部分。
如果我們想要繪製重疊的直方圖,這很簡單:
df[[‘time_started’, ‘time_published’]]。iplot( kind=‘hist’, histnorm=‘percent’, barmode=‘overlay’, xTitle=‘Time of Day’, yTitle=‘(%) of Articles’, title=‘Time Started and Time Published’)
透過一點
pandas
處理,我們還可以製作一個條形圖:
#重取樣獲得每月的均值 e Views and Reads‘)
df2 = df[[’view‘,’reads‘,’published_date‘]]。set_index(’published_date‘)。resample(’M‘)。mean()
df2。iplot(kind=’bar‘, xTitle=’Date‘, yTitle=’Average‘, title=’Monthly Average Views and Reads‘)
就像我們前面看到的那樣,pandas+plotly+cufflinks 這一組合的功能非常強大。如果我們要繪製一個關於每篇文章粉絲數量在不同發表渠道的分佈情況的箱線圖,我們可以先使用 pandas 中DataFrame 的 pivot(透視表) 功能,然後再繪製圖表,如下:
df。pivot(columns=’publication‘, values=’fans‘)。iplot( kind=’box‘, yTitle=’fans‘,title=’Fans Distribution by Publication‘)
互動式圖表的好處就在於,我們可以盡情地探索圖表中的資料。特別是在箱線圖中,包含的資訊很多,如果不能區域性放大檢視,我們可能會錯過這些資訊。
散點圖
散點圖是大多數分析的核心,它可以使我們看到變數隨著時間的演變情況,也可以看到兩種變數之間的關係。
時間序列
現實世界中的大部分資料都與時間相關。幸運的是,plotly + cufflinks 在設計之初就考慮到了時間序列的視覺化。讓我們來建立一個關於我寫過文章情況的 dataframe,看看它的各項指標是怎麼隨著時間變化的。
#建立一個數據集,只包括髮布在Towards Data Science渠道的文章
tds = df[df[’publication‘] == ’Towards Data Science‘]。 set_index(’published_date‘)
#將閱讀時間作為時間序列
tds[[’claps‘, ’fans‘, ’title‘]]。iplot( y=’claps‘, mode=’lines+markers‘, secondary_y = ’fans‘, secondary_y_title=’Fans‘, xTitle=’Date‘, yTitle=’Claps‘, text=’title‘, title=’Fans and Claps over Time‘)
我們在一行程式碼裡完成了很多不同的事情:
- 自動獲得了格式友好的時間序列作為x軸
- 新增一個次座標軸(第二y軸),因為上圖中的兩個變數的值範圍不同。
- 新增文章的標題到每個資料點中(滑鼠放上去可以顯示文章名和變數值)
如果要從圖表上了解更多的資訊,我們還可以很容易地新增文字註釋:
tds_monthly_totals。iplot(mode=’lines+markers+text‘, text=text, y=’word_count‘, opacity=0。8, xTitle=’Date‘, yTitle=’Word Count‘,title=’Total Word Count by Month‘)
對於由第三個分類變數著色的雙變數散點圖,我們使用:
#read_time代表文章所需閱讀時長,read_ratio代表閱讀比例,即閱讀文章的人數/點選檢視的人數
df。iplot( x=’read_time‘, y=’read_ratio‘,
# 定義類別變數
categories=’publication‘,xTitle=’Read
Time‘,yTitle=’Reading Percent‘, title=’Reading Percent vs Read Ratio by Publication‘)
如果要在圖表中體現三個數值變數,我們還可以使用氣泡圖,如下圖:橫座標、縱座標、氣泡的大小分別代表三個不同的變數——文章字數的對數、閱讀數量、閱讀比例。
tds。iplot(x=’word_count‘,y=’reads‘, size=’read_ratio‘,text=text, mode=’markers‘,
# Log xaxis
layout=dict(xaxis=dict(type=’log‘, title=’Word Count‘), yaxis=dict(title=’Reads‘), title=’Reads vs Log Word Count Sized by Read Ratio‘))
再做一點工作,我們甚至可以在一個圖表中體現四個變數!
結合 pandas 對資料進行統計處理,我們可以得到很多非常有價值的圖,比如下面這張關於不同文章發表渠道的讀者點選檢視數量的變化趨勢圖,顯然名為
Toward Data Science
的發表渠道能給文章帶來更多的點選量。
更高階的圖表
接下來所講述的圖表大家可能不會經常用到,但是非常酷炫,值得了解一下。同樣,我們仍然只使用一行程式碼就可以完成這些超級圖表。
散點圖矩陣
當我們想要探索許多變數之間的關係時,散點圖矩陣是非常好的選擇。
import plotly。figure_factory as ff
figure = ff。create_scatterplotmatrix(df[[’claps‘, ’publication‘,’views‘,’read_ratio‘,’word_count‘]],diag=’histogram‘, index=’publication‘)
以上的散點矩陣圖仍然是可以互動的,可以自由放大縮小,檢視各個資料點的詳細資訊。
相關係數熱力圖
為了將數值型變數的相關性視覺化,我們可以先計算相關係數,接著就可以建立一個帶註釋的熱力圖:
corrs = df。corr()
figure = ff。create_annotated_heatmap(z=corrs。values,x=list(corrs。columns),y=list(corrs。index), annotation_text=corrs。round(2)。values, showscale=True)
我們還可以繪製非常酷炫的3D表面圖和3D氣泡圖:
雲製圖——Plotly Chart Studio
當你使用 plotly 在 notebook 中繪製圖表時,你可能注意到了每幅圖的右下角都有一個連結 “Export to plot。ly” 。如果你點選該連結,就會跳轉到名為
chart studio
的雲製圖平臺,然後你就可以對自己的圖示進行潤色,添加註釋、改改顏色、清理一些不必要的內容等等。
你還可以線上釋出該圖表,任何人可以直接透過連結訪問到你的圖表。
(比如我的這個3D圖,在瀏覽器中輸入後方連結可直接抵達:
https://
plot。ly/~Allencxl/3/
)
前面所述的內容還不算是這個庫的所有功能,非常鼓勵各位小夥伴們去檢視 plotly 和 cufflinks 的文件,肯定會有更多不可思議的神級視覺化在等著你!
美國風力發電廠的分佈情況
總結
我已經因為固執地使用
matploblib
而浪費了太多時間,所以希望大家能透過這篇文章學習到一種新的方式提升自己的繪圖效率。
另外,當我們在選擇繪相簿的時候,有幾點是永遠需要考慮的:
- 用少量的程式碼進行資料探索
- 可以實時與資料互動,檢視資料子集情況
- 根據自己的需要,選擇性挖掘資料中的細節
- 非常便利地潤色最終演示的圖表
而到目前為止,能夠在 Python 中實現上述需求的不二選擇便是 plotly。plotly 使我們能夠快速地進行視覺化,讓我們透過與圖表的互動更好地瞭解我們的資料。日常工作中,在使用其他繪相簿的時候,我感覺繪圖是一項單調乏味的任務,但是使用 plotly 時,我覺得繪圖是資料科學中相當有趣的工作之一!
作者:Will Koehrsen 編譯&圖片漢化:Allen
原文連結:
https://
towardsdatascience。com/
the-next-level-of-data-visualization-in-python-dd6e99039d5e
知乎機構號:
來自矽谷的終身學習平臺——優達學城(http://Udacity。com),專注於技能提升和求職法則,讓你在家能追隨 Google、Facebook、IBM 等行業大佬,從零開始掌握資料分析、機器學習、深度學習、人工智慧、無人駕駛等前沿技術,激發未來無限可能!
知乎專欄:優達技術流,
每天分享來自行業大牛、工程師必讀的技術乾貨