案例上手 Python 数据可视化
課程亮點
- 6 個常用的數據可視化工具使用方法
- 20 個案例貫穿各個工具的學習過程
- 基于 GUI / HTML / Web 網站多種繪圖風格
- 中、美、日三國不同思想的制圖工具
- 從靜態到交互,滿足不同需要的圖示
課程背景
數據可視化是數據分析和機器學習的重要環節,比如數據清洗、特征工程、機器學習、數據分析(特別是報告)、評估等環節都會用到“數據可視化”技術。
數據可視化同時還廣泛存在于各種商業、政務、教育等領域的業務表述之中。因為“圖”才是喜聞樂見、通俗易懂的,也是最直觀的。
不僅如此,數據可視化還是獨立的業務,在現代社會中有各種引人注目的操作,比如將抽象的東西“可視化”、“直觀化”等。
本課程主要向讀者介紹了數據可視化中常用工具的使用方法,并且通過多個實戰項目案例,讓讀者更深入地理解可視化的各種方法和技能。
作者介紹
齊偉,蘇州研途教育科技有限公司 CTO,在 Web 開發、數據分析、機器學習領域有比較豐富的從業經驗,并在大學開設過《機器學習實踐》課程。曾出版書籍:《跟老齊學Python:輕松入門》《跟老齊學Python:Django實戰》《跟老齊學Python:數據分析》和《Python大學實用教程》(大學教材)。
課程大綱
課程內容
開篇詞:為什么學習可視化,應該怎么學
每一本書或每一個課程,都會有前言或開篇詞,但是,很多學習者不喜歡閱讀前言,這就大錯特錯了,因為在前言中往往會包含一些作者想要表達的核心觀點。
我的日常工作就是寫程序,業余時間也寫了幾本書,也有幸偶爾會與周邊幾所大學的一些學生分享某些技術。在與我交流的一些程序員、讀者和學生中,會提出很多關于如何學習某項技能的問題——這里指的是軟件開發或者大數據、機器學習方面,不包括諸如人際關系等技能。在這里,我把其中的重要問題和回答,整理出來,供讀者參考。
跟誰學
這里的“誰”,不僅包括“人”,還包括“物”。
先說“物”。
早先學習的媒介比較簡單,就是圖書,要學習什么知識,沒有其他選擇,就是買本書。而現如今,選擇就多了,除了印刷版的圖書之外,還有電子版、音頻和視頻,甚至視頻還分為微課、慕課和課堂實錄等,可謂是五花八門。那么,應該選擇什么媒介來學習呢?
很顯然,上述問題有一個大前提,那就是“自學”,即自己控制學習過程的學習。如果選擇這種學習方式,那就要檢討自我:“是否具有自我控制能力?”。判斷標準也比較簡單,那就是回頭看看在自己的求學過程中,是否運用過這種能力?如果答案是肯定的,那么面對這次自學,就會有信心、有方法了;如果是否定的,并不意味著這次不能自學,而是要為自己的這個“第一次”好好謀劃一番了。
檢討完自己,確立能夠自學,就繼續下面的操作;否則,請跳過,直接找一個老師,別吝惜多花錢,從長遠來看,最好的投資是跟著老師去學。自學,并非適合任何人。
再回到剛才的問題,選擇哪一種學習媒介?
我的回答是:要了解自己,根據自己的情況而定。
比如,自己比較擅長閱讀,那么就可以選擇借助書(包括印刷版和電子版)來學習;如果看書時間稍長,就犯困,建議還是選擇視頻媒介稍好一些。但是,即便如此,我也建議要有一本相關的書,因為它能夠讓我們隨意翻閱,可以隨時解決某些棘手問題——或許搜索引擎更適合?非也!對于一個初學者,搜索引擎給出的東西太龐雜了,難以找到答案。
“物”選好之后,就要選“人”了。
不論選擇書還是線上或線下的課程,都有一些大師或名師,俗話說“名師出高徒”——更符合我們內心的應該是“大師出高徒”。因此,要找一個超級牛的人,比如在大廠工作過的頂級開發者、名校的名教授等,只要看了他們的書、聽了他們的課,就能達到登峰造極之高度,再不濟至少也要快速掌握。
這是很多人的想法,也能理解,誰不希望以最小的投入來獲得最大的產出?最好是“不勞而獲”。
只是殘酷的現實不斷地告訴我們,“大師”和“高徒”之間,不是正相關的。請看下面的思想實驗。
思想實驗是指:使用想像力去進行的實驗,所做的都是在現實中無法做到(或現實未做到)的實驗。例如,愛因斯坦有相對運動的著名思想實驗。思想實驗需求的是想像力,而不是感官。
假設某名校,有一個宇宙級的大師教授人工智能課,每年聽課的學生有 60 人,該大師在該校授課 10 年,累計有 600 名學生。如果“大師”與“高徒”正相關,那么新的宇宙級大師應該至少有幾百名。
但,上述推論與事實不符合。
“名師(大師)出高徒”,只是聽起來很好,符合個人的愿望罷了,但不是客觀真理。
什么原因?
因為他們不是專門針對你的。
所以,選“人”的標準不是看其頭銜,而是看其提供的學習內容是否適合自己。特別是“小白”,更要以通俗易懂的學習資料入手,跟著能“深入淺出”地講述的“好老師”去學。
學什么
這個問題其實很難回答。因為就編程而言,可以學習的東西就很多了,現在又有大數據、機器學習、人工智能等領域。
至于學什么,拷問的應該是自己,而不是問別人。檢視自己擅長什么、喜歡什么,未來有什么規劃,根據這個來確定學什么。
有的人也列出了一些非常簡明扼要的判斷標準,比如:
- 什么方向工資高,就學什么
- 現在媒體上宣傳什么,就學什么
- 大師說學什么,就學什么
- 招聘網站上什么崗位多,就學什么
是否可以據此確定學習內容,此處不置可否。還是做一個思想實驗。
假如時光倒退 20 年。在 20 年前,用上面的標準看一看,應該學什么?什么也不需要學,專門買房子(得有好爹)就可以了!
選擇學什么的確很困難。高考報志愿的時候,眾多家長都糾結于孩子要學什么專業的問題。
除了上帝,誰都不曉得未來什么樣,與其糾結某個具體的專業,不如學“萬人敵”。
籍曰:“書足以記名姓而已,劍一人敵,不足學,學萬人敵。”
——《史記·項羽本紀》
每個領域,都會有一些沉淀下來的基礎知識和技能,這是要學的。此外,更重要的是“學習能力”,學習內容是增長學習能力的載體,學習能力就是“萬人敵”。
因此,本課程從始至終,會貫徹一個宗旨:提升學習能力,不是嘮嘮叨叨地訴說知識點。
怎么學
關于學習方法問題,很多書中都有所論述,此處不詳述,因為方法都差不多,關鍵是能不能執行的問題。
學習是一個苦差事,我們從本性上是排斥的。
因此,古人云“書山有路勤為徑,學海無涯苦作舟”。
有了“肯吃苦”的思想準備之后,如下具體操作方案,供讀者參考:
- 認真閱讀書中的每句話,并且反問自己是否理解了,如果沒有理解立刻 Google 相關的信息,這就是把書讀厚的理念。
- 要理解書中的程序示例,逐行理解,甚至于逐行注釋,并且,一定要自己親自敲代碼,千萬不要復制代碼。
- 在上面的基礎上,獨立地把示例程序寫出來,并進行調試。如果遇到了問題,比如報錯了,此時應該“聞過則喜”,因為這是進步的階梯,務必對照書上的講解,反思自己寫的代碼。
- 要閱讀有關技術文檔,不論它是中文的還是英文的——這點很重要,千萬不要因為語言問題而放棄閱讀。
- 用 Google 搜索(這里不是在做廣告,我也不是‘美分’什么的,只是介紹個人的經驗),并且不限于使用中文作為搜索關鍵詞。
如果有條件,還建議多參加一些有關技術的專題活動,比如社區活動等,不僅能擴展自己的視野,還能結交很多同道中人。
為什么學“數據可視化”
說的有點多了,現在才回到正題。
如果有志于在大數據、機器學習、人工智能領域從業的話,“數據可視化”是必不可少的,因此說不得不學。
接下來就會有另外一個問題:為什么要選擇本達人課作為學習資料?
那就要了解本達人課為讀者做了什么。
深入淺出闡述有關知識點和技能,同時“授人以漁”,這是核心目標。
介紹目前常用的幾種工具,當然不可能窮盡所有工具,挑選了部分具有代表性的。
- Matplotlib
- Seaborn
- Plotnine
- Plotly
- Pyecharts
- Bokeh
在講解的過程中,配以豐富的示例。
其他說明
本達人課的所有程序都是基于 Python 語言(Python 3.x 版)來寫的,需要做好如下準備。
- 準備一臺適合開發用的計算機,不論是臺式機還是筆記本均可。但是,它是否適合開發?只要不是太古老的機器,硬件方面都差不多,關鍵是操作系統。本達人課中的所有演示都不是基于 Windows 操作系統(也算是我的偏執吧),我不習慣把 Windows 操作系統列位于適合開發的環境,倒是在日常辦公方面比較適合,在開發方面我習慣使用 Linux 或者 Mac OS 操作系統。讀者可根據自己的喜好選擇。本達人課的所有代碼,是跨平臺的,跟用什么操作系統無關。
- 已經能夠使用 Python 語言編程。
- 掌握 Numpy 和 Pandas 的基本知識。
這是學習本達人課內容的前置條件。
這些都準備好之后,就開始學習。
課程大綱
本課程分為七大部分,共計 28 篇(含開篇詞和結尾)。
準備部分(磨刀不誤砍柴,第 0-1 ~ 0-3 課),介紹數據科學工程師的工作流程以及數據可視化的必要性,并且指導學習者安裝有關工具。通過這部分的學習,能夠對數據科學以及從業者的工作有個總體認識,曉得數據可視化的地位,并在本地計算機安裝有關工具。
第一部分(開山鼻祖:Matplotlib,第 1-1 ~ 1-6 課),介紹 Python 語言生態中雖然古老但依然被使用的數據可視化工具 Matplotlib。通過這部分的學習,能夠掌握 Matplotlib 的應用思想和方法,并能夠繪制常用的統計圖。
第二部分(后起之秀:Seaborn,第 2-1 ~ 2-5 課),介紹基于 Matplotlib 發起而來的一種常用的可視化工具 Seaborn。通過這部分的學習,能夠掌握 Seaborn 的特點,并熟悉常用統計圖的繪制方法。
第三部分(另立門派:Plotnine,第 3-1 ~ 3-3 課),Plotnine 是根據圖層概念制圖的工具,不同于前面兩部分的工具。通過這部分的學習,能夠理解圖層的概念以及在制圖中的應用,掌握 Plotnine 靈活制作個性化圖示的方法。
第四部分(特立獨行:Plotly,第 4-1 ~ 4-4 課),Plotly 是一款能夠“兩棲作戰”的工具,既能得到靜態圖片,也能生成動態交互的圖示,即從這部分開始,制圖工具進入“交互”階段。通過這部分的學習,能夠掌握常用統計圖(具有交互功能)的繪制,并可以生成 HTML 文件。
第五部分(中華武功:Pyecharts,第 5-1 ~ 5-2 課),Pyecharts 是非常好的國產工具——中文文檔,非常可親近。Pyecharts 提供的工具和色彩渲染上,都比前述工具有所突破。通過這部分的學習,能夠掌握 Pyecharts 的使用方法,特別是利用它實現地理信息可視化和基于 Web 項目發布可視化圖示。
第六部分(島國薄紗:Bokeh,第 6-1 ~ 6-3 課),這是一款來自島國日本的可視化工具,除了完成通常的操作之外,在交互功能上,比 Plotly 和 Pyecharts 更有特色。通過這部分的學習,能夠掌握 Bokeh 的使用方法,特別是 Bokeh 自帶服務,能發布基于網絡的圖示。
課程寄語
最后送上勵志名言:
努力面前,忘記背后,向著標桿直跑。
當遇到貌似無法克服的困難時,當懷疑自己是否能夠學會時,當受到其他誘惑想放棄時,請來讀一讀這句話。
開始!
第0-1課:數據科學工作流程
每門學科,都會有一些前置的信息,這里還要再繼續嘮叨嘮叨,最好別引起你的反感呦。
愚見,下面的信息,是需要首先明晰的。
- 數據分析、人工智能等與數據相關的工作,其工作流程是什么?
- “數據可視化”,在數據科學中占有什么位置?
- 為了學會數據可視化的各種技能,都需要哪些前置知識和能力?
拙作《跟老齊學 Python:數據分析》一書中,列出了數據科學的發展簡史,從中能體會到人類對數據的研究和應用。隨著技術的發展,本質上是社會生產力的發展,數據驅動決策的觀念越來越深入人心(此處推薦觀看電影《點球成金》)。
都在談論“數據科學”,那么什么是數據科學?需要有一個明確的說明。
對于概念性的東西,推薦參考“維基百科”或者某些經典著作。
下面的定義來自“維基百科”中的“數據科學”詞條。
數據科學(英語:Data Science),又稱資料科學,是一門利用數據學習知識的學科,其目標是通過從數據中提取出有價值的部分來生產數據產品。它結合了諸多領域中的理論和技術,包括應用數學、統計、模式識別、機器學習、數據可視化、數據倉庫以及高性能計算。數據科學通過運用各種相關的數據來幫助非專業人士理解問題。
閱讀了詞條的解釋,算是對數據科學有了初步的感性認識。
根據經驗,對于專有名詞的英文詞條解釋與其對應的漢語說明,還是有差異的。因此,特別建議再閱讀“數據科學”的英文詞條:Data science。
Data science is an interdisciplinary field that uses scientific methods, processes, algorithms and systems to extract knowledge and insights from data in various forms, both structured and unstructured, similar to data mining.
Data science is a "concept to unify statistics, data analysis, machine learning and their related methods" in order to "understand and analyze actual phenomena" with data. It employs techniques and theories drawn from many fields within the context of mathematics, statistics, information science, and computer science.
顯然,中文“數據科學”和英文的“Data Science”兩個詞條的內容,從信息量上看,還是有差別的。
根據 Data Science 中的說明,數據科學所處理的數據包括“Structured”和“Unstructured”(即“結構化的”和“非結構化的”)。數據科學中有一個重要環節,名曰“特征工程”,就是要將一些非結構化的數據轉變成通常算法能夠處理的結構化的數據。當然,這不是本課程要講述的內容,本課程中使用的數據都是“結構化的”數據。
通常,科學是基礎理論部分,它不直接產生價值,它的價值會通過工程體現出來。因此,對應著“數據科學”的應用,就是“數據工程”。那么“數據工程”是怎樣的實施流程呢?
下圖是綜合了一些書籍所述和個人工作經驗而來的。
圖 數據工程流程
圖的優勢是能夠把很多信息集中顯示在眼前,給人以直觀視覺化的體驗,這也是“可視化”的優勢。但是,圖示也有明顯的劣勢,那就是表述上不嚴謹,容易產生歧義。比如面對一幅山水畫,可能會有各種不同的理解;但是面對 F = ma 這個牛頓第二定律的表達式時,就只能有一種理解,不能仁者見仁智者見智。
因此,通常圖示都要配說明。
理解商業問題
這是“數據工程”的開始,從業者——數據工程師,必須對相應的業務有所了解,這也是數據工程師特有的市場價值之一(高工資是有道理的)。
理解商業問題,并非是成為業務高手,而是要能夠從業務中梳理出與數據工程項目有關的環節,特別是將業務中某些問題轉化為數據問題。
比如,某公司打算開發一套能夠評價學生學習情況的軟件系統,其中應用了所謂“過程性評價”的學習發展評價方式,要實現這種評價方式,就需要用到數據分析、機器學習的有關技能。
面對這個項目,首先問如下幾個問題:
- 哪些類型的數據能夠支持“過程性評價”?
- 通過什么渠道可以獲取這些數據?
- 所獲得的數據可靠程度如何?
以上問題獲得了明確答復之后,再考慮后續的工作,否則項目就成為了空中樓閣。
通過理解商業問題,把通常的業務人員習慣用的描述性語言,轉變為具體的科學性語言,才能對某些環節作出“數據性”回復,實現“數據驅動決策”目標。
還是用前面的例子來說明,通常的教育工作者或者業務人員,會對“過程性評價”的結果這樣描述:過程性評價能夠對學生的成長發展提供指導,而不是一考定終身。
這種說法貌似容易理解,但里面充滿了歧義,列出幾項(包含但不限于):
- 學生成長發展的指標是什么?是考試成績?心理發展?身體狀況?
- 如果是考試成績,是周考試成績?月考試成績?學期末考試成績?
- 如果是心理發展,用什么量表測量?還是憑借主觀觀察?
- 如果是身體狀況,又要測量哪些項目?
- 衡量學生發展的周期是多長?學年?學期?月?周?日?小時?每次作業?
顯然,要落實所謂的“素質教育”,需要解決的問題真的太多、太復雜,絕非幾句口號和幾篇文章就能解決的。
若要從數據層面解決上述問題,就必須把有關數據的問題提煉出來,用準確的語言表述,然后考查業務是否能夠支持這些問題。
數據收集
數據收集和前述理解商業問題,兩者之間是一個互動關系。研究收集數據的方法,也是對商業問題的再度理解。
此外,數據收集還包含著從某個數據集中獲得數據的含義。這里所說的數據集,包括但不限于:
- 數據庫,包括關系型和非關系型
- 數據接口(API)
- 保存數據的文件,比如 Excel、CSV 文檔等
以上這些是常用的數據集。如何從這些數據集中讀取到數據?需要的技能應該是:
- 熟練使用 SQL
- 熟練使用某種編程語言(本達人課使用的是 Python 語言)
數據清洗和特征工程
假設已經通過某種合法的方式“不作惡”的途徑得到了某些數據,接下來要做的是了解這些數據,主要通過以下兩種方式:
- 對數據進行簡單的描述性統計
- 對數據實行可視化,直觀地了解數據概況
這里就用到了“數據可視化”的技能。
然后就是“數據清洗”和“特征工程”,這是另外兩個重要工作了,由于本課程聚焦在“數據可視化”上,這里就不詳述了。但是,即便在這兩個工作過程中,也會用到“數據可視化”的操作技能。
兩個分支
有了“訓練好”的數據之后,根據商業問題的目標,可以從事兩個方面的具體工作。
(1)數據分析
應用各種數據分析的方法,最終得到一份分析報告。
分析結果,除了用數字表達之外,可視化是不可避免的(又見“數據可視化”)。
(2)機器學習
機器學習是另外一個專門領域,目前正火熱中。
通過機器學習算法,實現對數據的分類、預測和聚類等操作,在這個過程中,也難免要用“數據可視化”表達某種結論。
評估
不論是機器學習,還是數據分析,其結果都要進行評估。
對于機器學習而言,有專門的模型評估方式。即便如此,用可視化的方式把結果表達出來,也是一種重要的手段。
根據評估結果,確定是否采用機器學習所獲得的模型,亦或數據分析的報告是否被采納。
以上是數據工程項目的基本流程,從中可知,“數據可視化”并不是流程中的一個獨立環節,它是幾個環節中必不可少的實現手段。
在實際中,做可視化工作的,除了數據科學從業者,還有美工,甚至還有其他人員,顯然實現可視化的途徑是多樣的。那么,我們將學習什么類型的可視化呢?
請看下一課的內容。
總結
本課介紹了“數據科學”的基本概念,并簡述了“數據工程”項目的基本流程,從此工作流程可知,本課程的主題 “數據可視化”是數據分析和機器學習等方面的重要手段,在這些環節中都占據了一定的位置。
第0-2課:數據可視化的類別
走在大街上,滿眼都是廣告——說明市場經濟發達,這是好事情。再觀察一下廣告,多是以各種樣式的圖形呈現,而不是簡簡單單地把數字呈現出來——即使是數字,也想辦法把數字搞得像圖一樣。這樣做的目的是要吸引人的注意,并且能夠讓人一眼就能看到想要看的。
別以為這是廣告商的策略,其實,他們只是順應了大腦的特點(具體請參考有關心理學和腦科學的研究成果)。
因為大腦的這種喜好,所以才非常有必要“數據可視化”,即用某種適合的圖形來表示某些數據。
數據可視化的類別
通常有兩種可視化數據的方式——這是我提出的分類,如有雷同,純屬巧合:
- 藝術性可視化
- 數學性可視化
以 2018 年的中美“貿易戰”為例,美國的媒體為了向美國老百姓說明中國經濟發展的情況,特別是對美國經濟的威脅,一定要使用到中國經濟和美國經濟相關數字,那么這些數字怎么展示?
圖 1 中美 GDP 比較(圖片來源)
這是一張預測中美 GPD 走勢的圖示,看此圖,我想,美國人也沒有什么太被刺激的感覺,因為看看兩條線,未來即使有高低之別,但差別也沒有那么嚇人,況且,預測還可能不準確呢。
這就是數學性可視化,雖然比較理智的反映了數據。但是,給人的印象不是很深刻,或者沒有讓人感到受刺激。
再對比圖 2。
圖 2 藝術性地表示 GDP(圖片來源)
雖然這張圖中也包含了數字,但是,它同時配置了表示數字的圖示,并且都很形象,人的視覺無形中就被圖示所吸引了。把數字本來的抽象意義,用直觀的方式表達出來,更刺激人的大腦。
這就是將原本的數據通過“藝術性可視化”的方式進行了表達。目的無非是要從視覺的維度讓人感受到一種震撼。
“藝術性可視化”,它通常不會科學、準確地反映數據的含義,而是為了某個目的追求感官刺激,比如圖 3。
圖 3 預測 GDP 變化 (圖片來源)
在本達人課中所要介紹的“數據可視化”,肯定不是那種蠱惑人心的可視化,而是本著科學精神的“數學性可視化”,雖然它可能不如“藝術性的可視化”好看,但是,更趨真實地反映了對象的本質。
常見圖像和用途
“數學性可視化”,就是要將數據用圖像的方式表達。從數學角度來看,不同的圖像有不同的用途或目的,下面依次簡要說明(此處姑且討論二維圖像)。
散點圖
還記得高中物理課學過的折射定律嗎?也稱為斯涅爾定律,假設不知道,我們就探索一下。用實驗的方式分別測量光線入射某透明介質的入射角和折射角大小,測量多次,于是就得到了入射角和折射角的數據集,分別用 alpha 和 belta 表示。
有了這兩組數據,怎么研究入射角和折射角之間的關系呢?它們之間符合什么函數關系?
一種常用的方法是:
- 建立一個坐標系,橫坐標表示入射角,縱坐標表示折射角;
- 將入射角及其對應的折射角,作為坐標系中的一個坐標點,在此坐標系中把點標記出來。
這樣就在坐標系中“散落”了很多點,如圖 4 所示:
圖 4 入射角和折射角散點圖
接下來的任務就是觀察這些點在坐標系中的分布,猜測它們應該符合什么函數關系,比如可能符合某個一次函數關系等(看起來像符合正比例函數的關系,人類曾經很長時間都這么認為,直到偉大的物理學家斯涅耳揭示了其中的奧秘為止)。
通過這個例子,可以總結如下:
- 繪制散點圖,要有對應的兩組數據(二維圖);
- 兩組數據所對應的兩個變量是連續變量;
- 散點圖的用途在于發現變量之間的關系。
在實際業務中,散點圖的樣式可能具有多種,而且也不一定都是用來尋找某種函數關系。比如在地圖上用色彩深淺畫出各個城市的 PM2.5 指數,這也是一種散點圖,通過這種散點圖就能夠看到污染城市的地理分布規律。
柱形圖
柱形圖(也稱為:柱狀圖),適用于二維數據集,但是有一個維度的數據需要具有比較意義。比如下面的數據:
| 廣東省 | 8,987.92 |
| 江蘇省 | 8,590.09 |
| 山東省 | 7,267.82 |
| 浙江省 | 5,176.80 |
| 河南省 | 4,498.82 |
| 四川省 | 3,698.02 |
| 湖北省 | 3,652.30 |
| 河北省 | 3,596.40 |
| 湖南省 | 3,459.06 |
| 福建省 | 3,229.83 |
| 上海市 | 3,013.39 |
| 北京市 | 2,800.04 |
對于這份數據,就比較適合用柱形圖進行可視化。
圖 5 部分省 GDP 柱形圖
圖中所示的柱子高度,表示數據表中各省的 GDP 值。
通過柱形圖,非常明顯地反映了各省 GDP 數據的差異。
但是注意,柱形圖不適合大數據,在橫坐標上如果排滿了柱子,看著多眼暈呀。
條形圖
條形圖,貌似就是柱狀圖橫過來,對于數值都是大于 0 的數據而言,畫出來的條形圖可以這樣理解。但是,下面這種類型的數據也是比較常見的。
| 哈爾濱 | ﹣31 |
| 北京 | ﹣2.9 |
| 鄭州 | ﹣4 |
| 濟南 | ﹣5 |
| 南昌 | 3 |
| 長沙 | 2 |
| 廣州 | 10 |
| 臺北 | 14 |
從數據表中可以看出,我國部分城市 1 月份最低氣溫,有的在 0℃ 以上,有的在 0℃ 以下。對于這類數據,用條形圖顯示,結果是這樣的。
圖 6 部分城市最低溫
當然,這份數據也可以用前面的“柱形圖”實現可視化。
折線圖
下面這份數據,是 1961 ~ 2017 年我國的 GDP 年度增長率。顯然,如果用條形圖、柱形圖來實現可視化,效果都不是太好,因為數據量有點大了。
| 2017 年 | 6.90% |
| 2016 年 | 6.70% |
| 2015 年 | 6.90% |
| ... | ... |
| 1962 年 | ﹣5.58% |
| 1961 年 | ﹣27.27% |
注:因為數據量比較多,所以顯示部分。
對這份數據實現可視化,比較好的選擇是繪制折線圖。
圖 7 我國理念 GDP 增長
從圖示結果中,可以看出 GDP 的發展變化趨勢。
折線圖最典型的應用應該算是在股票方面了,范圍大一點可以說是“金融數據分析”方面。
直方圖
直方圖貌似“柱形圖”,但兩者有很大區別。
直方圖是以各個矩形的面積描述各組的頻數,所有矩形的面積之積為各組頻數的和。
例如,使用下面的程序構造了一批隨機數。
import numpy as npmu, sigma = 100, 15x = mu + sigma * np.random.randn(1000)想直觀地了解這個數據集中數字分布的特征,就可以利用直方圖。
圖 8 正態分布
從圖中可以看出,雖然是隨機生成的,但是數據的分布還是有規律的,這就是統計學中的正態分布。
餅圖
餅圖常用于表達某些量所占比例的情況。例如:
圖 9 餅圖
圖中顯示了不同量占據總量的百分比,通過餅狀圖就能夠對比分類數據的數值大小。當然,如果類別太多,會把“餅”分成太多的小份,不美觀,也不易于觀察。
箱形圖
箱形圖又稱盒須圖、盒式圖或箱線圖。
圖 10 顯示了通常的箱形圖的形狀:
圖 10 箱線圖
通過箱形圖,可以觀察到如下信息:
- 數據的統計值為中位數、最大值、最小值等
- 數據集中是否存在異常值,以及異常值的具體數值
- 數據是否是對稱的
- 數據的分布是否密集、集中
- 數據是否有偏向性
還要提到股票,如果仔細觀察,里面也用到了箱形圖。
以上列出的幾種圖形,是常見的,也是基本的。在這個基礎上,還有很多變形,這些變形可能綜合了多種含義,比如堆積柱狀圖,能比較不同量之間的大小,也能部分顯示分布情況。此外,還有一些專用圖形,例如股票中常用的 K 線圖,地理信息中常用的分級統計地圖等。
此外,根據不同的用途,還可以創造性地開發新的圖像。
為了便于檢索,把一些圖形的名稱列在下面,供參考:
- 柱形圖
- 堆積柱形圖
- 條形圖
- 氣泡圖
- 直方圖
- 箱形圖
- 熱力圖
- 散點圖
- 雷達圖
- 環形圖
- 餅圖
- 折線圖
- K 線圖
- 儀表盤
- 詞云
對數據進行可視化的時候,要根據數據特征、繪圖目的選擇適合的圖像。
總結
本課將“數據可視化”分為“藝術性可視化”和“數學性可視化”兩類,本達人課主要講述的是“數學性可視化”,即基于統計學基本知識,運用編程技能實現數據可視化。這種方式特別適用于大數據的問題中。
本課還列出了常用的統計圖,生成這些統計圖的數學原理及其所表達的含義,請參閱有關統計學的知識。
第0-3課:做好啟動準備
本達人課不是針對零基礎的學習者,需要具備以下知識。
(1)Python 基礎知識,包括但不限于:
- 掌握 Python 內置的基本對象類型,如數字、字符串、列表、字典、元組等
- 掌握 Python 的基本語法規則,如引入模塊的方法、for 循環語句等
- 掌握 Python 中函數的編寫方法
- 掌握 Python 中類的基本概念和了解面向對象的思想
這里推薦《Python 快速入門》達人課來學習。
(2)NumPy 和 Pandas 的基本知識,包括但不限于:
- 利用 NumPy 創建數組,以及數組相關的方法(或者 Numpy 的函數)
- 利用 Pandas 創建 Series 和 DataFrame 對象,以及相應的操作和方法
以上知識,在拙作《跟老齊學 Python:輕松入門》《跟老齊學 Python:數據分析》圖書中均有詳細介紹,可供參考。
有了以上知識作為基礎,接下來要做的是安裝數據可視化相關的包(模塊)。在 Python 中,基本安裝方法是使用 pip 安裝,但是在數據科學方面,有兩個可供使用的環境。
Anaconda
官方網站:https://www.anaconda.com/
上圖是官方網站界面的截圖,其中只凸顯了 Anaconda 的作用,它是一個數據科學的平臺,而且宣稱是最流行的,此言絕非虛妄。之所以如此受歡迎,就是因為 Anaconda 已經融匯了很多常用的工具,比如前面提到的 Numpy、Pandas 等已經集成在里面了。所以,只需要下載這個網站的 Anaconda,然后安裝,通常使用的模塊就都包括了——一次安裝,終生受用。
流行,就是因為簡單。
但是,它也絕非十全十美,或者說世界上就沒有十全十美的東西吧。
因為 Anaconda 高度集成化,也會讓你失去對模塊的控制,比如你有強迫癥,非要把程序文件安裝到某個指定位置,這就難度大了。
但是,依然推薦。
pip
這是我喜歡的,所有在本達人課中的安裝演示,都是使用 pip。
除了上面兩個之外,還可以直接下載源碼安裝,源碼通常會在 github.com 這樣的代碼托管網站上。
接下來,就要演示安裝本達人課所用工具的過程了。
特別聲明:
- 本達人課中的所有操作和程序,是在 MacOS 操作系統中進行的
- 完全照搬以下安裝方法,在你的計算機上不一定成功,屆時請多用 Google 找方法
安裝工具之前,先要了解通常的命令:
- 如果使用 anaconda,安裝命令是 conda install modulename
- 如果使用的 pip,安裝命令是 pip install modulename
Jupyter
這是一個網頁版的編輯器。
在 Python 中,有一個“交互模式”,如下所示:
>>> print("Life is short, you need Python.")Life is short, you need Python.這種模式非常方便,但是,寫過的代碼難以保存。因此,它不是一個好的“編輯器”(根本就不是編輯器)。
于是乎,IPython 就應運而生了(不用著急安裝 IPython,在此處它只是一個過程)。后來,在 IPython 基礎上,發展出了一個基于瀏覽器的 Notebook,用于文本文件編輯,它兼顧了交互模式的優點,那就是即時運行,并且能夠如同 IDE 一樣,對代碼實施保存、傳播、再運行等操作。這個編輯器就是這里推薦的 Jupyter。
Jupyter 也是開源免費的。2014年, Fernando Pérez 發明了它,除了支持 Python 之外,它還可以支持 Julia 和 R,并且可以用于編寫 Markdown 文件。
安裝
pip3 install jupyter注意,后面的所有安裝,我都使用 pip3,表示安裝適用于 Python 3 的版本。
運行
打開終端,到某一個工作目錄,執行以下命令:
$ jupyter notebook通常,會自動打開默認瀏覽器,并呈現下圖所示的界面。
在圖示中可以看到一些擴展名為 ipynb 的文件,這些都是已經創建的 Jupyter 文件,里面都是一些相關代碼,如果點擊某個文件,就可以在當前環境中打開。
再觀察上圖的右上角,有“新建”下拉菜單,通過它,可以創建一個全新的編輯界面。
Jupyter 與通常的 GUI 軟件差不多,用鼠標點來點去就可以了。當然,它有一些快捷鍵,如果想了解,可以在網上搜一下。
Matplotlib
Matplotlib 是基于 NumPy 的、Python 語言環境中的繪圖工具包。它可以用于繪制類似 GUI 軟件的圖像,并且這些繪圖工具的 API 都是基于“面向對象”思想開發的,與 Python 語言的開發思想一致(這也是現代編程語言都秉承的思想)。
Matplotlib 的發明者 John D. Hunter,繼承了 Python 一貫的開源思想。目前 Matplotlib 已經由一個委員會來負責,發明者 John Hunter 于 2012 年 8 月被上帝接走了。
必須向這位偉大的發明者致以崇高的敬意。
自從 Matplotlib 1.2 之后,就開始支持 Python 3 了。因此,現在所安裝的 Matplotlib 如果沒有特別的版本指定,默認都是適合于 Python 3 的了。
Matplotlib 有一個重要的子模塊,也是我們制圖經常用的,名為:pyplot,它是一個類似于 Matlab 的接口(如果學習過 Matplab,就可以直接把其中的用法搬過來了)。其實,Matplotlib 也是參考了 Matlab 中的繪圖功能而設計的專門用于 Python 中的繪圖工具。
Matplotlib 的官方網站:https://matplotlib.org/
安裝
標準方法:pip install matplotlib
理論上講,如果本地缺少某些依賴程序,執行上面的命令后,會自動地將依賴的程序安裝上。
在實際中,總會遇到意想不到的,因此,如果遇到安裝不成功的事情,也不要氣餒,慢慢找辦法,一定能成功的。
最基本的條件,計算機要聯網,并且網絡情況別太差了。
檢測是否安裝成功
安裝之后,用下面的方式測試是否安裝好。
在工作目錄中運行 Jupyter,新建一個頁面,并且命名為“chapter0-3”。
然后按照下圖的方式輸入代碼:
為了方便,后面演示的時候,就把每個代碼塊寫成如下的形式,上圖中顯示的是一個代碼塊。書寫的這個代碼塊的方法就是:每寫完一行,回車,然后寫下一行。請不要復制代碼,而是要自己一個一個字母地敲。
%matplotlib inlineimport numpy as npimport matplotlib.pyplot as pltx = np.linspace(0, 100, 1000)y = np.sin(x)plt.plot(x, y)寫完這個代碼塊之后,按組合鍵“Shift + Enter”,即執行這個代碼塊中的程序。執行結果如下圖所示:
從圖中可以看到,在前述代碼塊的下面顯示了執行結果。得到的函數曲線圖,也呈現在了當前的頁面中,這是因為代碼塊中的第一行的設置。如果沒有 inline,只寫 %matplotlib,你會在另外一個窗口看到畫出來的圖。
上述代碼的其他部分,先不用理解,后面會詳細介紹。
執行上述代碼,如果能夠得到跟圖中顯示一樣的,就說明 Matplotlib 安裝無誤。如果出現錯誤,請特別認真閱讀報錯信息,然后根據報錯信息到網上搜索有關解決方案。比如常見的一種錯誤是說缺少 backend,這是因為本地計算機沒有安裝 GUI 的支持框架(推薦閱讀:What is a backend?,可以根據官方文檔中的說明,安裝一個 backend,比如安裝 tk)。
Seaborn
Seaborn 是基于 Matplotlib 的一個可視化工具,它提供了一些更高級的接口,讓繪圖過程更簡潔。
官方網站:https://matplotlib.org/glossary/index.html#term-tk
有了前面的基礎,安裝 seaborn 就比較簡單了:
pip3 install seaborn安裝完畢,如果要檢驗是否安裝成功,直接使用 import seaborn 命令,不報錯,說明就沒問題了。
Plotnine
Plotnie 是在 ggplot2 的基礎上發展而來的,這個模塊的繪圖思想和前面兩個有所不同,不過這些現在不需要掌握,只需要安裝它就可以了。
官方網站詳見這里。
官方網站給的安裝方法是:pip3 install plotnine
如果安裝過程沒有那么順利,可以參考我的經歷,因為我按照這個官方網站的方法操作也沒有成功。
以下安裝步驟是針對 Python 3.7 的環境。
- Pandas 要先升級,順便把 Numpy 也升級吧:
- 安裝 Cython:
- 安裝最新的 Pyproj。如果這個不安裝或者不適用于 Python 3.7,則會報出 gcc 錯誤:
這里是下載源碼來安裝的,理論上用 pip3 install pyproj 也行,但是因為源程序的服務器在境外,經常性的出現訪問超時現象。
- 如果 geppandas 沒有安裝,也要安裝:
- 最后安裝 plotnine:
經歷以上過程之后,如果還沒有安裝好,就只能 Google 了。
完成了坑爹的過程之后,plotnine 安裝完畢。
Plotly
Plotly 是一款能夠實現基于網頁作圖的工具軟件,其底層是 plotly.js,基于 D3.js、stack.gl 和 SVG,因此能夠實現用 JavaScript 在網頁上繪制類似于 Matplotlib 的各種統計圖形。
官方網站:https://plot.ly/
Plotly 原本是收費的軟件,但自 2016 年 6 月開始,提供免費的社區版。
它能夠實現在線發布制圖結果,為了實現這個目的,還需要到該網站進行注冊。
注冊完畢,登錄網站,并在界面的右上角用戶名的下拉菜單中選擇“setting”項目,再從左側欄選擇“API Keys”,設置 Username 和 API KEY,記錄下來,以備后用。
安裝方法:pip3 install plotly
Pyecharts
Pyecharts 是國產的可視化工具包。
官方網站:http://pyecharts.org/
難得有中文文檔。
為了獲得更好的效果,先安裝如下依賴:
- 安裝 Nodejs 環境,請點擊這里下載
- 安裝 phantomjs
而后,使用下述方式安裝:
pip3 install pyecharts在后續操作中,還要用到其他的模塊,比如主題模塊,可以參考官方文檔進行安裝。因為是中文的,而且文檔內容非常詳細,相信讀者一看便知。
Bokeh
Bokeh 也是當前使用量日益提升的制圖工具,它的核心特點在于能夠基于服務器發布各種具有強交互性的圖示。
官方網站:https://bokeh.pydata.org/en/latest/
安裝方法:
pip3 install bokeh經過上面的一系列折騰,應該已經把自己的計算機開發環境配置好了。
不過,要說明的是,本達人課所介紹的幾種可視化工具,僅僅是我選擇的,其實還有很多可視化工具沒有納入到本達人課的范疇。我相信,讀者學習這幾種各具特色的工具之后,可以非常快速地掌握任何一種新的工具。
總結
本課主要是為后續的正式學習做好準備,特別是開發環境的配置。在 Python 生態環境中做開發,難免還要安裝其他各類包和模塊。
- 通常使用 pip 即可,并且會自動安裝有關依賴。
- 如果出現“訪問超時”這類問題時,可能是網絡不太好,解決方法有兩個:一是換一個速度更快的網絡環境;二是找個“梯子”(自備,不要詢問我哦)或許就解決問題了。
- 下載相應模塊的代碼(通常官方網站或者 github.com 上都有)直接安裝(比如執行:python3 install setup.py)。
- 還有一個重要的解決問題途徑,就是使用 Google 找一找其他人是怎么解決的,參考一下。
結束語:在學習中應用,在應用中學習
本達人課介紹了各具特點的多種實現數據可視化的工具,讀者應該根據自己的需要,有重點地掌握,特別是結合實際的項目需要。
不論哪一個工具,都有完善的官方文檔,那么本達人課充其量是引領入門,要向對該工具有較深入的理解,還需要閱讀官方文檔。
學習和應用是兩個不同的過程。學習某項技能,必須從一招一式開始,或許感到枯燥,但這是基礎;應用則是要根據實際需要靈活地綜合運用所有技能了。
那“獨孤九劍”中的“破劍式”雖只一式,但其中于天下各門各派劍法要義兼收并蓄,雖說“無招”,卻是以普天下劍法之招數為根基。
實際項目中的每一行代碼背后,都是對基礎知識和基本技能的深刻理解,因此,非常有必要掌握。只有這樣才能面臨項目時隨機應變。
獨孤求敗如若復生,又或風清揚親臨,能遇到這樣的對手,也當歡喜不盡。使這“獨孤九劍”,除了精熟劍訣劍術之外,有極大一部分依賴使劍者的靈悟,一到自由揮灑、更無規范的境界,使劍者聰明智慧越高,劍法也就越高,每一場比劍,便如是大詩人靈感到來,作出了一首好詩一般。
程序亦如此!
答疑與交流
為了讓訂閱課程的讀者更快更好地掌握課程的重要知識點,我們為每個課程配備了課程學習答疑群服務,邀請作者定期答疑,盡可能保障大家學習效果,同時幫助大家克服學習拖延問題!
入群請到第1-1課末尾查看入群二維碼,如果群滿,請添加 GitChat 小助手伽利略的微信,ID 為 GitChatty6,注明「數據可視化」,并將支付截圖發給她,謝謝。
第1-1課:Matplotlib 初體驗
第1-2課:重新認識坐標系
第1-3課:如何分區和繪圖
第1-4課:多樣化的圖像
第1-5課:繪制柱形圖和條形圖
第1-6課:繪制箱線圖、餅圖和直方圖
第2-1課:Seaborn 初體驗
第2-2課:分類特征統計圖
第2-3課:關系統計圖和回歸統計圖
第2-4課:數據分布統計圖和熱圖
第2-5課:實戰練習
第3-1課:繪圖新概念
第3-2課:幾何對象和美學映射
第3-3課:案例剖析
第4-1課:Plotly 初體驗
第4-2課:繪圖類的應用
第4-3課:3 種統計圖及示例
第4-4課:高級制圖案例剖析
第5-1課:Pyecharts 初體驗
第5-2課:地理信息可視化及擴展應用
第6-1課:Bokeh 初體驗
第6-2課:常用圖形
第6-3課:重在交互
閱讀全文: http://gitbook.cn/gitchat/column/5c6cd09e7fa9074fde9c8909
總結
以上是生活随笔為你收集整理的案例上手 Python 数据可视化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 速度传感器330104-00-06-10
- 下一篇: 浅谈Java及应用学java