我明知存在更高效、更具交互性和外觀更好的替代方案時,我卻仍然繼續使用一個過時的繪圖庫——matplotlib,只是因為我曾經花了數百個小時來學習 matplotlib 複雜的語法。
幸運的是,現在有許多的開源繪圖庫可供選擇,經過仔細研究,我發現 plotly 包無論從易用性、交互性還是功能性來看,都有絕對的優勢。接下來,我將帶領大家學會如何用更少的時間繪製更美觀的可視化圖表——通常只需要一行代碼。
本文所有代碼都可以在 GitHub 上找到。讀者朋友們也可以直接在瀏覽器裡打開 NBViewer 鏈接查看效果。地址獲取方式見文末。
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 時,我覺得繪圖是數據科學中相當有趣的工作之一!
2020年最新python丶java教程
如果你處於想學python或者正在學習python,python的教程不少了吧,但是是最新的嗎?
說不定你學了可能是兩年前人家就學過的內容,在這小編分享一波2020最新的python全套教程最後小編為大家準備了1月份新出的python自學視頻教程,共計約200G,免費分享給大家!
2020Python自學教程全新升級為《Python+數據分析+機器學習》,九大階段能力逐級提升,打造技能更全面的全棧工程師。
以上這Java和python自學教程小編已經為大家打包準備好了,希望對正在學習的你有所幫助!
獲取方式:轉發此文+關注並私信小編:“資料”,即可免費獲取哦!
閱讀更多 雯雯編程 的文章