第七課 - 數據可視化
本課內容:
matplotlib 繪圖基礎
? ? ? 函數曲線的繪制
? ? ? 圖形細節的設置
案例分析:銷售記錄可視化
? ? ? 條形圖
? ?
?繪制多圖
?? ? 餅圖
? ? ?散點圖
? ? ?直方圖
seaborn 數據可視化包
? ? ?分類數據的散點圖
? ? ?分類數據的箱線圖
? ? ?多變量圖
在第五節課中,我們通過pandas的plot函數對鶯尾花數據進行了可視化。我們繪制了根據品種分類的散點圖和箱線圖。
在第六節課中,我們使用matplotlib繪制了姓名變化趨勢圖,并通過plt的各種選項對圖形進行了美化。
上述例子中可視化都是基于matplotlib來展開的,在本次課程中我們將詳細演示如何使用matplotlib
matplotlib 是Python編程語言的一個繪圖庫,最初由John D. Hunter撰寫。
與Python的深度集成
風格與Matlab接近
官網:http://matplotlib.org/
老師說,我們為什么今天要上新的 matplotlib 的繪圖呢,因為之前學的鳶尾花散點圖用的是Pandas里面自帶的plot圖,在分類數據的分析上,之前學的方法顯得冗余了。為了更好的可視化,不冗余!我們來學新的!
matplotlib 繪圖基礎
以上還是一樣設置基礎數據,每一次都要導入的numpy和 pandas包,不導入后面會跟你說沒有定義,識別不了的哦~ 設置圖形的格式是 retina 的清晰度。運行之后,我們來正式繪圖吧!
在matplotlib 中,繪制一個曲線圖,可以使用plt.plot這個函數,在正弦函數中,主要的是x和y軸兩個軸的數據。所以我們需要先設置x 和 y 。
我們用numpy中的arange函數,設置的是從0到5,間隔為0.1之間的數據。專業點來講,0.1好像叫步長。當時上課這個語句一晃而過,我沒看懂是什么為什么括號里面有三個數字,回放聽終于明白了。。。明明是學過的啊??????
突然覺得,中學時代不會Python真可惜,或許時不時用它來解決數學問題,數學成績就沒那么差了。周三上課的時候余老師一講到正弦函數我就有點頭大,幸好不是要我計算呀!
看到這里才發現,x 和y 用的都是 np 的函數,在np里面定義賦值。為什么不是pandas呢?
老師說因為我們前面設置過自動顯示圖片(終于明白第一張圖的 “%matplotlib Inline” 的作用了。。。),所以這里直接輸入語句,按輸出,就可以看到結果了。我們也可以設置成手動顯示圖片,看下圖:
plt.show( ) 這個語句,設置手動顯示圖片,而且這里沒有 OUT這個顯示了。其實這個我不知道有什么用。
接下來又是(我不懂的)美化啦!
把函數線的顏色設置成綠色,上課的時候我說為什么它知道g就是綠色啊!老師說用的 green 比 grey 多,所以系統會默認 g 是 green。上課講的時候可沒有color=g 啊,老師用的是簡寫,直接在 plt.plot(x,y) 中的右邊括號里面加上逗號和 'g . -' ,然后就是綠色?點線條了。
現在看到的圖兩軸還是有些是空白,所以需要美化,縮減空白,這里用的是我們第六課用的方法:
plt.xlim(0,5) 和 plt.ylim(-1.1,1.1) 的使用可以讓區間空白改變一點,這次老師教了一種新的方法:
plt.axis([0,5,-1.1,1.1]) ,和上節課的xlim, ylim 使用結果一樣,這個語句更短,先定義 x 軸的范圍從0到5,再定義 y 軸的范圍,所以在圓括號里面,有一個方括號,包著四個數字,分別表示兩個軸的范圍。
要是我們需要清晰看到一個點所在的橫縱坐標,需要用網格線進行更精確的定位,在那個點標明文字:
plt.grid(True) 指的是網格線存在哦。
plt.text(3.1,0.3,'sin(x)') ?,指的是在坐標(3.1,0.3)的位置上加上文字說明 sin(x)。
回顧例一,用plot 函數得到一個基本的曲線函數,然后用各種細節設置,讓整個圖變得更加飽滿,包括標題/橫軸/縱軸/網格/文本等設置,這樣的方法稱為函數式的編程,這是模仿matlib的作圖方式。與之相對應的還有面向對象的作圖,它對細節的控制會更加豐富,但對初學者的掌握能力來說,學會函數式的編程比較適時。
例2:繪制 y=x, y=x^2, y=x^3 三個函數的曲線
我在看預習資料的時候,看不到運行出來的圖,plt.plot(x,x,x,x**2,x,x**3) ,這一句看起來太復雜有點可怕,然而它的意思竟然是,里面的6個數字分為三對xy軸的數。三個函數的x 和 y 竟然可以全部擠在一起,厲害了。
要是想要更好的區分這三個函數曲線,可以用一些設置將它們變得更有辨識度:
上課看老師運行這一步的時候,驚呆了。這里就是上面提到過的簡寫了,具體代表什么,# 后面已經說明了。接下來還是繼續美化顯示的圖片了,大家可以自己做一下啦!這里不展示了。
小結:
上述代碼展示了matplotlib的一些基本功能,我們可以通過使用plt自帶的各種函數來控制圖形的細節,比如是否加網格,坐標的標簽等等。
我們在后續課程中還會向大家展示其他常用圖形
案例分析:銷售記錄可視化
導入并觀察數據
每次看到數據導入我就特別害怕,因為每次都會卡我很久,久到我會想“要不這文章就這樣吧,老子不寫了?!?每一次的坑我都記得非常清楚,紅酒質量的,鳶尾花的,全美嬰兒姓名的,這次是銷售數據。
這次卡了多久?
一小時30分鐘。
讀取數據失敗的我,拿起等了我3個小時三明治,一邊吃一邊苦悶地想,這樣的事情真是太丟人了啊,同一個坑,掉第四次。吃完這次終于上網查怎么在jupyter導入excel數據了(以前我都在干嘛??。┑遣]有查到要的答案,終于在我們課程的討論區,看到一個同學回復的答案!老淚縱橫?。。?/p>
試了一下,上載成功的文件在jupyter打開是一片空白,而且把這個空白的文件下載到電腦了,我以為操作出了問題,試了幾次,一模一樣。把代碼敲進去試著運行,竟然!成功運行了。。。詭異!
這是一份一家公司在某個時間段段交易數據。行首對應的分別是客戶賬號/公司名稱/商品貨號/每次交易的購貨量/每個商品的交易價格/交易總額/交易時間。
要是你是一個數據分析師,想要在這份數據里面得到一些信息,你會從哪方面著手呢?
我們可以用之前學過的一些函數進行對整份數據進行分析:
這是一份有1500條信息的數據,沒有缺失值。
要是需要看與之交易的公司有哪些,可以把上面運行語句的 len( ) 去除掉。
要是需要看某家公司的交易量,也是可以用函數進行輸出的:
這個輸出比較長,分兩張展示首尾,最后一行可以看出,一共82筆交易。
銷售額最高的10個公司
先用語句求出我們要的數。套路都是我們之前學過的:用groupby分組,也就是找到交易量的公司,先圈出范圍“name”,然后是“ext price” 。然后使用agg進行聚合運算:sum求交易總額,count計算交易次數。
但是在上面我們可以看到,行首的格式不是很對,這里需要調整一下:
這里在前面一行加了 ' \ '這樣的符號,老師說這樣加上去可以讓它換行,看了結果,應該是讓name 這個詞在行首回到了好看的位置。reset_index 重置索引,里面寫的 “在這里取消了name作為索引”,我沒理解明白,也就是前面是用name來索引的?用name來索引和這一步的操作,作為索引來說,有什么不同?
這時候我們已經得到銷售總額的數據了,但是我們的題目是需要銷售總額前十的,所以我們需要對銷售總額進行排序。
這里學到一個新的函數了,用 sort_values 進行排序。
好吧,前十還沒出來:
這一步加了挺多東西上去的。重新再句首賦值 top10,后面輸出 top10。在第27條輸出了排前的銷售額,才能直接在這一步的第二行代碼最后直接使用切片的方式 [:10] 來運算。
然后是對行首名稱對修改,把首字母都大寫了,替換的方式是使用字典的鍵值對,格式是 {之前的值:替換上的值} ,老師運行的第一遍沒有加上inplace=true,結果就是并沒有修改成功,然后解釋,因為rename那一行算是里面默認的副本,要是沒有inplace=true ,那是運行不成功的。
我們總算把銷售額前十的公司輸出來了!
條形圖
top10公司銷售總額的條形圖
新的圖!之前我們學過有scatter散點圖,plot折線圖,還有啥來著?今天的直方圖是bar,哦,垂直的是bar,水平方向的直方圖是barh。
所有的代碼,其實都能看懂。但是要我自己不偷看打出來,真的是。。。心虛。
添加標題和橫縱坐標的說明。并且,為了讓圖看起來更加知道相對應的值是什么,我們修改了坐標的刻度:
覺得單看這個圖好專業啊!這時候余老師講了上課的第二個“冗余”,就是圖和代碼之間那串黑體字。這時候終于能夠確切理解 冗余 這個詞的表達力!要是不想看到這些多余的字,我們可以這樣做:
有一種,把多余的毛發剃掉的感覺一樣?。。。。?!清爽!
然餓,老師這時候又去改X軸坐標了:
其實這一段不是很明白,替換掉的值,不像上面用字典來替換,用的是兩個列表,后面一個列表里面的元素還是字符串。這是我們之前學過的??疑惑。
這個圖的風格是默認的風格,老師說可以讓我們嘗試一下其他風格,選擇之前看看有哪些是可以被選擇的。這樣的東西竟然都有語法,太可怕了?。。?/p>
然后老師選了 ggplot,據說是 “愛原冢(音譯)”的風格,來看看吧
默認顏色變了,而且還有底版了:淺灰色+網格。
作業7-1:
模仿上面的例子,畫出交易總數最高的10個公司的條形圖。
提示:可以使用sort_values(by= quantity) 來實現。
啊啊啊,血槽空了,我去補補血,剩下這兩天盡快更新!