數據可視化的研究熱潮中,如何讓數據生動呈現,成了一個具有挑戰性的任務,隨之也出現了大量的可視化軟件。相對于其他商業可視化軟件,Python是開源且免費的,而且具有易上手、效果好的優點。
大家普遍第一次接觸到的Python數據可視化庫基本上都是Matplotlib。Python還有很多數據可視化庫,本文盤點了12款常用的Python數據可視化庫,挑選適合自己業務的那一款吧!
深入學習Python商業數據可視化技術,推薦閱讀《Python商業數據可視化實戰》。
▼
Python有很多數據可視化庫,這些數據可視化庫主要分為探索式可視化庫和交互式可視化庫。前者透過簡單直接的視覺圖形,更方便用戶看懂原數據,后者主要用于與業務結合過程中展現總體分析結果。
探索式可視化庫
探索式分析最大的優勢在于,可以讓業務人員在海量數據中“自由發揮”,不受數據模型的限制。通過探索式分析和可視化,業務人員可以快速發現業務中存在的問題。
Python探索式可視化庫主要包括如下幾個。
1Matplotlib
Matplotlib是Python數據可視化庫的元老,盡管它已有十多年的歷史,但仍然是Python社區中使用最廣泛的繪圖庫,編寫幾行代碼即可生成線圖、直方圖、功率譜密度圖、條形圖、錯誤圖、散點圖等。
Python的可視化庫眾多,各有各的特點,但是Matplotlib是一個非?;A的Python可視化庫,如果需要學習Python數據可視化,那么Matplotlib是非學不可的,之后再學習其他庫就比較簡單了。Matplotlib的中文學習資料比較豐富,其中最好的學習資料是其官方網站的幫助文檔,大家可以在上面查閱自己感興趣的內容。
2Seaborn
Seaborn利用Matplotlib的強大功能,只用幾行代碼就能創建出漂亮的圖表。它們的關鍵區別在于,Seaborn的默認款式和調色板設計更加美觀和現代。由于Seaborn是在Matplotlib基礎上構建的,因此用戶還需要了解Matplotlib以便調整Seaborn的默認值。
Seaborn同Matplotlib一樣,也是Python進行數據可視化分析的重要第三方包。
Seaborn在Matplotlib的基礎上進行了更高級的API封裝,使用戶繪圖更加容易,所繪圖形更加漂亮。Seaborn是基于Matplotlib的一個模塊,專用于統計可視化,可以和Pandas進行無縫連接,使可視化的初學者更容易上手。
相對于Matplotlib,Seaborn語法更簡潔,兩者的關系類似于Numpy和Pandas的關系。但是需要注意的是,應該把Seaborn視為Matplotlib的補充,而不是替代物。
Seaborn庫旨在以數據可視化為中心來挖掘與理解數據,它提供的面向數據集制圖函數主要是對行列索引和數組的操作,包含對整個數據集進行內部的語義映射與統計整合,以此生成信息豐富的圖表。
3Pyecharts
Pyecharts是我國開發人員開發的,相比較Matplotlib、Seaborn等可視化庫,Pyecharts十分符合國內用戶的使用習慣。
Pyecharts的目的是實現Echarts與Python的對接,以便在Python中使用Echarts生成圖表。
Echarts是百度開源的一個數據可視化JavaScript庫,生成的圖的可視化效果非常好,其憑借良好的交互性,精巧的圖表設計,得到了眾多開發者的認可
4Missingno
處理缺失的數據是一件讓人痛苦的事,Missingno通過使用視覺摘要來快速評估數據集的完整性,而不是通過大篇幅的表格。它可以根據熱力圖或樹狀圖的完成度或點的相關度對數據進行過濾和排序。
交互式可視化庫
數據可視化可以是靜態的也可以是交互的,交互式的數據可視化是指人們使用計算機和移動設備深入圖表和圖形的具體細節,然后用交互的方式改變他們看到的數據。Python交互式可視化庫主要包括如下幾個。
1Bokeh
Bokeh基于JavaScript實現交互式可視化,它是原生Python語法,它可以在Web瀏覽器中實現美觀的視覺效果。
它的優勢在于能夠創建交互式的網站圖,可以很容易地將數據輸出為JSON對象、HTML文檔或交互式Web應用程序。Bokeh還支持流媒體和實時數據。
但是它也有明顯的缺點:一是版本時常更新,最重要的是有時語法不向下兼容,這對于開發者來說是噩夢;二是語法晦澀,與Matplotlib相比,可以說是有過之而無不及。
2HoloViews
HoloViews是一個開源的Python庫,旨在使數據分析和可視化更加簡便,可以用非常少的代碼行完成數據分析和可視化。
除了默認的Matplotlib后端,它還添加了一個Bokeh后端。結合Bokeh提供的交互式小部件,可以使用HTML5和WebGL快速生成交互式視圖,以及進行高維數據的可視化探索。
3Plotly
Plotly是一個數據可視化的在線平臺,與Bokeh一樣,Plotly的強項在于制作交互式視圖,但它提供了一些在大多數庫中沒有的圖表,如等高線圖、樹狀圖和3D圖表??梢栽诰€繪制條形圖、散點圖、餅圖、直方圖等多種圖形,可以畫出很多媲美Tableau的高質量圖。
Plotly支持在線編輯圖形,支持Python、JavaScript、MATLAB和R等多種語言的API。Plotly生成的所有圖表實際上都是由JavaScript產生的,無論是在瀏覽器還是在Jupyter中,所有的可視化、交互都是基于plotly.js的,它是一個高級的聲明性圖表庫,提供了20多種圖表類型,包含3D圖表、統計圖和SVG地圖等。
4pygal
與Bokeh和Plotly一樣,pygal提供了可以嵌入Web瀏覽器的交互式視圖。區別在于,它能夠將圖表輸出為SVG格式。如果用戶使用較小的數據集,則輸出位SVG格式的圖像就可以了,但是如果用戶制作的圖表包含數十萬個數據點,那么它們就會很難被渲染并變得反應遲鈍。
Pygal繪制線圖的方法很簡單,可以將圖表渲染為一個SVG文件,用戶使用瀏覽器打開SVG文件就可以查看生成的圖表。
5plotnine
plotnine是Python中圖形語法的一種實現,它基于ggplot2包,語法繪圖功能強大,可以輕松將數據映射到構成圖的可視對象,然后創建自定義的圖形。plotnine提供各種不同的可視化視圖,易于適應定制化輸出,安裝十分簡單,用戶可以通過pip install plotnine命令直接安裝。
plotnine的優點為代碼簡潔,易學;繪制出的圖流暢大方;不需要很多的代碼就可以繪制出很不錯的圖。在使用plotnine繪圖之前,首先需要理解繪圖的基本概念。
6Altair
Altair是一個專為Python編寫,它可以讓數據科學家更多地關注數據本身和其內在的聯系。
因為是基于Vega-Lite(交互式圖形語法)的聲明性統計可視化庫,Altair API具有簡單、友好、一致等特點。
聲明意味著用戶只需要提供數據列與編碼通道之間的鏈接,例如,x軸、y軸、顏色等,其余的繪圖細節它會自動處理。聲明使Altair變得簡單、友好和一致,用戶使用Altair可以輕松設計出有效且美觀的可視化代碼。
7ggplot
ggplot是基于R語言的ggplot2包和Python的繪圖系統。ggplot的運行方式與Matplotlib不同,它允許用戶對組件進行分層以創建完整的繪圖。例如,用戶可以從軸開始畫,然后添加點,接著添加線、趨勢線等。雖然圖形語法被認為是繪圖的“直觀”方法,但經驗豐富的Matplotlib用戶可能需要時間來適應這個新的方式。
8Gleam
Gleam的靈感來自R語言的Shiny包。它允許用戶僅使用Python腳本就可將分析結果轉換為交互式Web應用程序,因此用戶不必了解任何其他語言,如HTML、CSS或JavaScript。Gleam適用于任何Python數據可視化庫。在創建繪圖后,用戶可以在它的上面添加字段,以便對數據進行篩選和排序。
圖書推薦
▊《Python商業數據可視化實戰(全彩)》
王國平 著
本書由淺入深、循序漸進地介紹了基于Python的商業數據可視化技術,并結合實際案例詳細介紹了Python在數據可視化方面的具體應用。
重點介紹了Python的9個可視化庫,分別為Matplotlib、Seaborn、Pyecharts、Bokeh、HoloViews、Plotly、Pygal、plotnine、Altair,并介紹了商業數據可視化的思維。讀者通過學習本書,能夠輕松、快速地掌握商業數據可視化技術。
者:dataplusscience
翻譯:和中華
校對:丁楠雅
本文約2000字,建議閱讀8分鐘。
本文介紹了Tableau中如何把箱形圖和單位直方圖分離。
Steve Wexler在他最近的一篇博客文章《Is this better than a Jitterplot? Could be》中探索了可視化jitterplot圖(帶有隨機jitter的點圖,jitter用來區分點)的替代方法:
博客文章鏈接:https://www.datarevelations.com/betterthanjitterplot.html
在本文中,我將展示如何創建與單位直方圖(unit histogram)區分的箱形圖(box plot)。
譯者注:jitter是一個隨機值,分配給點用來將其區分,這樣就不會重疊了,詳細內容可以參見下面這篇文章:Methods for Creating Jitter in Tableau:https://www.dataplusscience.com/TableauJitter.html
單位直方圖
史蒂夫在他的帖子以及另一篇文章”Tableau visualization is here“中描述了如何制作單位直方圖:
Tableau visualization is here:https://public.tableau.com/profile/swexler
我將用它作為此文章的起點,因此如果您想跟著練習,請在此處下載他的workbook:
下載鏈接:https://public.tableau.com/workbooks/DataRevelations_MeVsOthers_UnitHistogram.twb
這是史蒂夫做的單位直方圖:
刪除分步帶(distribution bands)并添加箱形圖
下載并打開Steve的Tableau workbook后,右鍵單擊主儀表板選項卡“Salary Comparison Jitterplot Dashboard(2)”并選擇“Unhide All Sheets”。
轉到名為Breakout with Quartiles的工作表。單擊分布帶中的線并將其拖離Tableau Canvas。另一種方法是右鍵單擊該線并選擇“刪除”。對分步帶也重復此步驟。您現在應該得到了一個沒有分布帶的單位直方圖。
單擊左上角的“分析”選項卡。單擊并將箱形圖拖動到Tableau canvas并將其放在SUM(continuous Bin)上。這將為單位直方圖添加一個箱形圖。
這很簡單,但請注意,箱形圖的中心位于窗格中并覆蓋了一些點。
讓我們探討一些將箱形圖移開的辦法。
改變箱形圖的位置
第一種方法是通過創建更多點來移動箱形圖。我們將通過創建另一個膠囊(pill)并使用雙軸來實現這一目標:
雙擊INDEX() 膠囊右側白色區域的Column Shelf。這將允許您輸入行內公式。輸入-20并按Enter鍵。右鍵單擊新膠囊并選擇“Dual Axis”。右鍵單擊圖表頂部的新二級X軸,然后選擇“Synchronize Axis”。 在SUM(-20)的標記卡上,單擊顏色并將不透明度設置為0%,將邊框設置為“None”。
您現在應該得到了一個單位直方圖,它從箱形圖的中心開始。
但是,您會注意到許多點仍然隱藏在箱形圖的后面。您可以將X軸更改為固定以調整位置,但我認為很難以不與點重疊并能顯示所有點的方式固定箱形圖的位置。
將箱形圖與單位直方圖分開
分離箱形圖和點圖的最明顯方法是為每個箱形圖和單位直方圖創建工作表。在本例中,有四代,所以將有八個工作表。這種方法允許您為每一代創建一個不同的視圖,一個帶有箱形圖,另一個帶有單位直方圖,并且可以非常直接地復制整個工作表并相應地調整過濾器以創建每個視圖。但這并不是一個好辦法,當你有更多類別時,很快就會變得笨拙。
另一種分離它們的方法是復制數據。這可以使用自定義SQL,Tableau Prep,Alteryx或在原始數據源中預處理來完成。為了便于演示,您可以在此處下載重復的數據:
下載鏈接:https://www.dataplusscience.com/files/BoxandUnitHisto.xlsx
此電子表格只是簡單地復制原始數據并帶有一個名為“Column”的新列。第一組數據在此新列中具有值“box”,第二組數據具有值“dots”。
從頂部菜單中選擇“Data”,然后選擇“New Data Source”。選擇“Microsoft Excel”并選擇您下載的文件"BoxandUnitHisto.xlsx"。這將打開新的數據源。再次單擊"Breakout with quartiles"選項卡來返回Tableau canvas。再次從頂部菜單中選擇“Data”,然后選擇“Replace Data Source”?!癈urrent:”數據源應設置為"Reshaped Survey Data",“Replacement:”數據源應設置為"Sheet1(BoxandUnitHisto)"。
這將使用復制了所有記錄的新數據源替換原來的單個數據源,并具有一個名為“Column”的新字段。
復制數據集的一個大問題是計算可能會受到影響。例如,Continuous Bin,它是Y軸上的主要字段,現在已經翻倍了。有很多方法可以解決這個問題,但是我們將對此進行簡單的修復,即將數字除以2。注意這可能不是所有情況下的最佳解決方案:
右鍵單擊Continuous Bin并將/ 2添加到公式中,以便該值除以2。 在Breakdown之后將Column膠囊拖到Column shelf上。向上拖動SUM(-20)離開canvas以刪除膠囊或右鍵單擊并選擇“Remove”。 右鍵單擊Continuous Bin并選擇“Duplicate” 右鍵單擊新字段Continuous膠囊(copy)并選擇“Edit” 調整公式:IF [Column]='box' then INT([Value] / [Bin Size])* [Bin Size] / 2 ELSE null END 將新的Continuous膠囊(copy)拖動到“Continuous Bin”旁邊的Rows shelf 右鍵單擊Continuous膠囊(copy)并選擇“Dual Axis” 右鍵單擊右側的新二級Y軸,然后選擇“Synchronize Axis” 將Dots窗格中的箱形圖從Tableau Canvas中拖出以將其刪除,或者右鍵單擊Dots窗格中的箱形圖并選擇“Remove”
現在,您將擁有一個僅在標有“box”的左窗格窗口中的箱形圖,而不是標記為“dots”的第二個窗格。讓點在“box”窗格中消失有點棘手。我想你會發現不透明度,顏色,邊框和尺寸在此刻都不起作用。所以我們將創建另外兩個字段來處理這個問題:
計算字段:Col Num公式:IF [Column]='box' THEN 0 ELSE 1 END 計算字段:Count公式:IF avg([Col Num])=0 THEN null ELSE index()END 使用新字段Count替換Column shelf上的INDEX()右鍵單擊Column shelf上的Count,然后選擇“Compute Using”并將其設置為“Resp ID”
您現在應該在第一個列窗格中有一個箱形圖,在第二個列窗格中有一個單位直方圖。其余的只是根據需要進行格式化:
在圖表區域中單擊鼠標右鍵,然后選擇“Format” 選擇“Borders”并將“Column Divider Level:”向左滑動一個位置。 右鍵在二級Y軸的Continuous膠囊(copy)點擊并取消選中“Show Header”以刪除 右鍵單擊帶有“box”和“dots”的列標題,然后取消選中“Show Header”以刪除根據需要調整點的顏色。
復制數據肯定會有缺點,但是,這里的最終結果是一個不與單位直方圖重疊的箱形圖,并且與在點的頂部繪制的典型箱形圖相比具有一些優點。這種方法也可以用于分布帶。只需用分布帶替換箱形圖窗格。
這也可以與jitterplot一起使用,但我發現單位直方圖比使用jitter隨機放置點更有用。
我希望這篇文章對您有所幫助。如果您有任何問題,請隨時給我發電子郵件Jeff@DataPlusScience.com
原文標題:
How to Separate a Box Plot and Unit Histogram in Tableau
原文鏈接:
https://www.dataplusscience.com/BoxandUnitHisto.html
譯者簡介
和中華,留德軟件工程碩士。由于對機器學習感興趣,碩士論文選擇了利用遺傳算法思想改進傳統kmeans。目前在杭州進行大數據相關實踐。加入數據派THU希望為IT同行們盡自己一份綿薄之力,也希望結交許多志趣相投的小伙伴。
于數據分析師來說,數據獲取通常有兩種方式,一種是直接從系統本地獲取數據,另一種是爬取網頁上的數據,爬蟲從網頁爬取數據需要幾步?總結下來,Python爬取網頁數據需要發起請求、獲取響應內容、解析數據、保存數據共計4步。
本文使用Python爬取去哪兒網景點評論數據共計100條數據,數據爬取后使用Tableau Public軟件進行可視化分析,從數據獲取,到數據清洗,最后數據可視化進行全流程數據分析,下面一起來學習。
示例工具:anconda3.7
本文講解內容:數據獲取、數據可視化
適用范圍:網頁數據獲取及評論分析
Python爬取網頁數據需要發起請求、獲取響應內容、解析數據、保存數據共計4步,懂的數據爬取的原理后,進行數據爬取。
1、發起請求
以去哪兒旅行網站為例,爬取網頁數據,首先發送請求。
import requests
u='https://travel.qunar.com/p-cs300100-xian-jingdian'#爬取網址
response=requests.get(u)
print('狀態碼:{}'.format(response.status_code))
if response.status_code !=200:
pass
else:
print("服務器連接正常")
這里返回狀態碼為200,說明服務器連接正常,可以進行數據爬取。
2、獲取響應內容
服務器連接正常后,直接打印返回內容,這里返回整個網頁html。
print(response.text)
3、解析數據
網頁結構由復雜的html語言構成,這里借助BeautifulSoup庫進行解析。
from bs4 import BeautifulSoup
ri=requests.get(url=u)
soupi=BeautifulSoup(ri.text,'lxml')#解析網址
ul=soupi.find('ul',class_='list_item clrfix')
lis=ul.find_all('li')
lis
對于特定的標簽進行定位,輸出text。
print(soupi.h1.text)#標簽定位,輸出text
lis=ul.find_all('li')
print(lis[0].text)
建立一個字典,解析目標標簽內容。
li1=lis[0]
dic={}
dic['景點名稱']=li1.find('span',class_="cn_tit").text
dic['攻略提到數量']=li1.find('div',class_="strategy_sum").text
dic['評論數量']=li1.find('div',class_="comment_sum").text
dic['lng']=li['data-lng']
dic['lat']=li['data-lat']
dic
使用for循環解析標簽內容。
import requests
from bs4 import BeautifulSoup
u1='https://travel.qunar.com/p-cs300100-xian-jingdian'
ri=requests.get(url=u1)
soupi=BeautifulSoup(ri.text,'lxml')#解析網址
ul=soupi.find('ul',class_='list_item clrfix')
lis=ul.find_all('li')
for li in lis:
dic={}
dic['景點名稱']=li.find('span',class_="cn_tit").text
dic['攻略提到數量']=li.find('div',class_="strategy_sum").text
dic['評論數量']=li.find('div',class_="comment_sum").text
dic['lng']=li['data-lng']
dic['lat']=li['data-lat']
print(dic)
根據翻頁規律設置翻頁數,這里設置一個列表,用來循環爬取前十頁數據。
#根據翻頁規律,設置翻頁數
urllst=[]
for i in range(11):
urllst.append('https://travel.qunar.com/p-cs300100-xian-jingdian'+str('-1-')+str(i))
urllst=urllst[2:11]
urllst.append('https://travel.qunar.com/p-cs300100-xian-jingdian')
urllst
4、保存數據
新建一個空的數據框,用于保存數據。
import pandas as pd
dic=pd.DataFrame(columns=["景點名稱", "攻略提到數量", "評論數量", "lng", "lat"])
dic
在空的數據框中保存第一條數據,并且使用for循環,依次爬取其余頁面的數據。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。