<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
資料展示,即資料視覺化,是資料分析的第五個步驟,大部分人對圖形敏感度高於數位,好的資料展示方式能讓人快速發現問題或規律,找到資料背後隱藏的價值。
Matplotlib 是 Python 中常用的 2D 繪相簿,它能輕鬆地將資料進行視覺化,作出精美的圖表。Matplotlib 模組很龐大,其中最常用的一個子模組是 pyplot,通常以一下方式將其匯入:
import matplotlib.pyplot as plt
因為在程式中經常使用,所以給 matplotlib.pyplot 起了個別名plt,以減少大量重複程式碼
pyplot 中最基礎的作圖方式是以點作圖,即給出每個點的座標,pyplot 會將這些點在座標系中畫出,並用線將這些點連起來。以正弦函數為例,用 pyplot 畫出影象:
程式碼段1:
import numpy as np import matplotlib.pyplot as plt x = np.arange(0,2*np.pi,0.1) #生成一個0到2pi、步長為0.1的陣列x y = np.sin(x) #將x的值傳入正弦函數,得到對應的值存入陣列y plt.plot(x,y) #傳入plt.plot(),將x,y轉換成對應座標。 plt.show() #顯示影象
上面程式畫出了以下影象:
注:選擇x的步長為0.1是為了讓每個點間隔較小,讓影象更加接近真實情況,否則如果步長過大,則會變成折線,若步長為1則會變成以下情況:
除了 np.sin()方法外,numpy 中也有 np.cos()、np.tan()等計算三角函數的方法。上面這些方法,最重要的是 plt.plot()方法,plt.plot()方法可以接收任意對數的 x 和 y ,它會將這些影象在一張圖上都畫出來,例如在原來的正弦影象上增加餘弦影象,可以這樣寫:
import numpy as np import matplotlib.pyplot as plt x = np.arange(0,2*np.pi,0.1) #生成一個0到2pi,步長為0.1的陣列x y1 = np.sin(x) #將x的值傳入正弦函數,得到對應的值存入陣列y1 y2 = np.cos(x) #將x的值傳入餘弦函數,得到對應的值存入陣列y1 plt.plot(x,y1,x,y2) #傳入plt.plot(),將(x,y1)、(x,y2)轉換成對應座標。 plt.show() #顯示影象
以上程式公用了同一個x,當然也可以重新定義一個新的 x,最終得到的影象如下:
程式碼段2使用一次 plt.plot()方法直接將兩個數位轉換 成對應座標,當然也可以呼叫兩次,以下兩行程式碼和上面第7行程式碼是等價的。
plt.plot(x,y1) plt.plot(x,y2)
對每一對 x 和 y,有一個可選格式化引數,進行指定線條的顏色、點標記和線條的型別。
程式碼段3:
import numpy as np import matplotlib.pyplot as plt x = np.arange(0,2*np.pi,0.1) #生成一個0到2pi,步長為0.1的陣列x y1 = np.sin(x) #將x的值傳入正弦函數,得到對應的值存入陣列y1 y2 = np.cos(x) #將x的值傳入餘弦函數,得到對應的值存入陣列y1 plt.plot(x,y1,'ro--',x,y2,'b*-.') #將(x,y1)、(x,y2)轉換成對應座標,並選用格式化引數 plt.show() #顯示影象
將程式碼段2傳入了格式化引數後,最終影象如下所示:
以其中的引數'ro--'為例,它分為三部分:r 代表紅色(red),o 代表在座標點採用圓點標記,-- 代表虛線。'ro--'
整體來說就是線條為虛線、座標點標記為圓點。格式化引數這三部分都是可選的,即傳入一部分也是可以的,並且沒有順序要求,
格式化引數常用的選型及含義如下表所示:
我們通過資料分析來進行決策,那麼使用合適的圖表來準確地展示資料是至關重要的。實際使用中,我們會用到各種各樣地幾十種圖表,按照資料展示的目標可以把它們分為五種,分別是:趨勢、比較、構成、分佈和聯絡。
在進行資料視覺化時,要先明確分析的目標,再來選擇五種合適的分類,最後選擇某個分類裡合適的圖表型別。
其實在前面已經用過折線圖了,就是使用 plot.plot() 方法。之前我們傳入的時x和y座標點,而折線圖的 x 和 y 分別是時間點和對應的資料,下面以兩個商品的銷量走勢為例:
import numpy as np import matplotlib.pyplot as plt x = ['週一','週二','週三','週四','週五','週六','週日'] y1 = [61,42,52,72,86,91,73] y2 = [23,26,67,38,46,55,33] #傳入label引數 plt.rcParams['font.family'] = ['SimHei'] #設定字型防止亂碼 plt.plot(x, y1, label='商品A') #增加折線圖例「商品A」 plt.plot(x, y2, label='商品B') #增加折線圖例「商品B」 #設定x軸標籤 plt.xlabel('時間') plt.ylabel('銷量') #設定圖表標題 plt.title('商品銷量對比圖') #顯示圖例、影象 plt.legend(loc='best') #顯示圖例,並設定在「最佳位置」 plt.show()
得到的影象如下圖所示:
因為上圖中有中文,所以通過 plt.rcParams['font.family'] = ['SimHei'] 來設定中文字型來防止亂碼,如果想設定其他字型只需將 SimHei(黑體)替換成相應的名稱即可。通過一下程式碼獲得,自己編譯器所在環境安裝的字型:
import matplotlib.font_manager as fm for font in fm.fontManager.ttflist: print(font.name)
圖例位置是一個可選引數,預設 matplotlib 會自動選擇合適位置,也可以指定其他位置。
具體的如下表所示:
plt.legend() 方法的 loc 引數選擇 引數含義引數含義best最佳位置center居中upper right右上角center right靠右居中upper left左上角center left靠左居中lower left左下角lower center靠下居中lower right右下角upper center靠上居中
柱狀圖描述的是分類資料,展示的是每一類的數量。柱狀圖分為很多種,有普通柱狀圖、堆疊柱狀圖、分組柱狀圖等。
普通柱狀圖呼叫 plt.bar() 方式實現。我們至少需要傳入兩個引數,第一個引數是 x 軸上刻度的標籤序列(列表、元組、陣列等),第二個引數用於指定每個柱子的高度,也就是具體的資料。下面以一個班級體育課選課的情況為例:
import matplotlib.font_manager as fm for font in fm.fontManager.ttflist: print(font.name)
得到如下影象:
plt.bar() 前兩個引數是必選的,當然還有一些可選引數,常用的有 width 和 color ,分別是用於設定柱子的寬度(預設0.8)和顏色。比如我們將柱子寬度改成0.6,將柱子的顏色設成好看的天藍色只需將 plt.bar() 改為 plt.bar(names, nums, width=0.6, color='skyblue') 即可。之前在折線圖部分用到的 plt.xlabel() 、plt.ylabel() 、plt.title() 和 plt.legend() 方法都是通用方法,並不侷限於一種圖表,所有的圖表都適用。
柱狀圖能直觀地展現出不同資料上的差異,但有時候我們需要進一步分析資料的分佈,比如每門選修課的男女比例,這時就需要用到堆疊柱狀圖。
下面就是進一步分析每一門選修課中男女比例為例編寫程式:
import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.family'] = ['SimHei'] #設定字型防止亂碼 name = ['乒乓球','羽毛球','網球'] nums_boy = [16,5,11] nums_girl = [10,15,8] plt.bar(name, nums_boy, width=0.6, color='skyblue', label='男') plt.bar(name, nums_girl, bottom=nums_boy, width=0.6, color='pink', label='女') plt.legend() plt.show()
最終得到影象:
上面的程式碼和普通柱狀圖相比,多呼叫了一次,plt.bar() 方法,並傳入了 bottom 引數,每呼叫一次 plt.bar() 方法都會畫出對應的柱狀圖,而 bottom 引數作用就是控制柱狀圖低端的位置。我們將前一個柱狀圖的高度傳進去,這樣就形成了堆疊柱狀圖。而如果沒有 bottom 引數,後面的圖形會蓋在原來的圖形之上,
就像下面這樣:
分組柱狀圖經常用於不同組間資料的比較,這些組都包含了相同分類的資料。
先來看一下效果圖:
繪製上圖的程式碼如下:
import numpy as np import matplotlib.pyplot as plt x = np.arange(3) width = 0.3 names = ['籃球', '羽毛球', '乒乓球'] nums_boy = [16, 5, 11] nums_girl = [10, 15, 8] plt.rcParams['font.family'] = ['SimHei'] #設定字型防止亂碼 plt.bar(x - width / 2, nums_boy, width=width, color='skyblue', label='男') plt.bar(x + width / 2, nums_girl, width=width, color='pink', label='女') plt.xticks(x, names) plt.legend() plt.show()
這次的方法和之前有些不同,首先使用 np.arange(3) 方法建立了一個陣列 x ,值為[0,1,2]。並定義了一個變數 width 用於指定柱子的寬度。在呼叫 plt.bar() 時,第一個引數不再是刻度線上的標籤,而是對應的刻度。以[0,1,2]為基準,分別加上或減去柱子的寬度得到[-0.15,0.85,1,85]和[0.15,1.15,2.15],這些刻度將分別作為兩組柱子的中點,並且柱子的寬度為0.3。
因為傳入的是刻度,而不是刻度的標籤。所以呼叫 plt.xticks() 方法來將 x 軸上刻度改為對應的標籤,該方法第一個引數時要改的刻度序列,第二個引數時與之對於的標籤序列。同理,使用plt.yticks() 方法來更改y軸上刻度的標籤。
餅圖廣泛地應用在各個領域,用於表示不同分類的佔比情況,通過弧度大小來對比各種分類。餅圖通過將一個圓餅按照分類的佔比劃分成多個區塊,整個圓餅代表資料的總量,每個區塊(圓弧)表示該分類佔總體的比例大小,所有區塊(圓弧)的加和等於100%。
餅圖的繪製很簡單,只需要傳入資料和對於的標籤給 plt.pie() 方法即可。以2018年國內生產總值(GDP)三大產業的佔比為例,可以畫出這樣的餅圖:
繪製上圖的程式碼如下:
import matplotlib.pyplot as plt plt.rcParams['font.family'] = ['SimHei'] #設定字型防止亂碼 data = [64745.2, 364835.2, 489700.8] labels = ['第一產業', '第二產業', '第三產業'] explode = (0.1, 0, 0) plt.pie(data, explode=explode, labels=labels,autopct='%0.1f%%') plt.show()
plt.pie() 方法的第一個引數是繪圖需要的資料;引數 explode 是可選引數,用於突出顯示某一區塊,預設數值都是0,數值越大,區塊抽離越明顯;引數 lables 是資料對應的標籤;引數 autopct 則給餅圖自動新增百分比顯示。
引數 autopct 的格式用到了字串格式化輸出的知識,程式碼中 '%0.1f%%' 可以分成兩部分。一部分是 %0.1f 表示保留一位小數,同理 %0.2f 表示保留兩位小數;另一部分是 %% ,它表示輸出一個 %,因為% 在字串格式化輸出中有特殊的含義,所以想要輸出 % 就得寫成 %% 。所以,'%0.1f%%' 的含義是保留一位小數的百分數,例如:66.6%。
Matplotlib 提供了子圖的概念,通過使用子圖,可以在一張圖裡繪製多個圖表。在 matplotlib 中,呼叫 plt.subplot() 方法來新增子圖。plt.subplot() 方法的前兩個引數分別是子圖的行數和列數,第三個引數是子圖的序號(從1開始)。
ax1 = plt.subplot(2, 2, 1) ax2 = plt.subplot(2, 2, 2) ax3 = plt.subplot(2, 2, 3) ax4 = plt.subplot(2, 2, 4)
plt.subplot(2,2,1) 的作用是生成一個兩行兩列的子圖,並選擇其中序號為1的子圖,所以上面四行程式碼將一張圖分成了4個子圖,並用1、2、3、4來選擇對應的子圖。
我們也可以繪製不規則的子圖,比如上面兩張子圖,下面一張子圖。
方法如下:
ax1 = plt.subplot(2, 2, 1) ax2 = plt.subplot(2, 2, 2) ax3 = plt.subplot(2, 1, 2)
之所以第三行程式碼是 plt.subplot(2, 1, 2) ,因為子圖序號是獨立的,與之前建立的子圖沒有關係。plt.subplot(2, 2, 1) 選擇並展示了2*2的子圖中的第一個。plt.subplot(2, 2, 2) 選擇並展示了2*2的子圖中的第二個,它們兩個合起來佔了2*2子圖的第一行。而 plt.subplot(2, 1, 2) 則是生成了兩行一列的子圖,並選擇了第二行。即佔滿第二行的子圖,正好填補了之前2*2子圖第二行剩下的空間,因此生成的圖表是這樣的:
圖表的框架畫好了,就可以往裡面填充影象了,之前呼叫的是 plt 上的方法繪圖,只要將其改成 plt.subplot() 方法的返回值上呼叫相應的方法繪圖即可。
舉個栗子,下面是在一張圖上繪製了 sin、cos 和 tan 三個函數的影象的程式碼:
import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.family'] = ['SimHei'] #設定字型防止亂碼 x = np.arange(0, 2 * np.pi, 0.1) plt.suptitle('三角函數視覺化') ax1 = plt.subplot(2,2,1) ax1.set_title('sin函數') y1 = np.sin(x) ax1.plot(x,y1) ax2 = plt.subplot(2,2,2) ax2.set_title('cos函數') y2 = np.cos(x) ax2.plot(x,y2) ax3 = plt.subplot(2,1,2) ax3.set_title('tan函數') y3 = np.tan(x) ax3.plot(x,y3) plt.show()
得到的影象是:
上面程序中,使用 set_title() 方法為每個子圖設定單獨的標題。需要注意的是,如果想要給帶有子圖的圖表設定總的標題的話,不是使用的 plt.titie() 方法,而是通過 plt.suptitile() 方法來設定帶有子圖的圖表標題。
到此這篇關於Python資料分析之Matplotlib資料視覺化的文章就介紹到這了,更多相關Python Matplotlib資料視覺化內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45