數據分析與挖掘 - 08圖形繪製

2020-12-11 紙鶴視界

一 圖的基本構成

Matplotlib是數據可視化工作中,最常用的一個可視化庫。Matplotlib有非常多的圖形,我們很難在短時間內將其掌握,所以我們首先要掌握的是畫圖的思路和常用的一些圖形。創建一個圖的步驟大致可以分為9步,當然這9步並不是每一次都需要,只要你知道一個完整的圖形可以有這麼多的步驟就可以。每一個步驟對應著一個操作和操作它的函數。

導入模塊:import matplotlib.pyplot as plt定義圖像窗口:plt.figure()畫圖:plt.plot(x, y)定義坐標軸範圍:x軸:plt.xlim()/y軸:plt.ylim() lim其實就是limit的縮寫定義坐標軸名稱:x軸:plt.xlabel()/plt.ylabel()定義坐標軸刻度及名稱:plt.xticks()/plt.yticks()設置圖像邊框顏色:ax = plt.gca() ax.spines[].set_color()調整刻度位置:ax.xaxis.set_ticks_position()/ax.yaxis.set_ticks_position()調整邊框(坐標軸)位置:ax.spines[].set_position()下面請跟隨我的代碼一起來畫一個圖感受一下吧!

import numpy as npimport matplotlib.pyplot as plt# np.linspace將會在-5到5的區間內生成100個數,注意這個是均勻分布的x = np.linspace(-5, 5, 100)# 根據x的值,經過計算生成y1和y2的值y1 = 2 * x + 1y2 = x ** 2# 畫圖plt.plot(x, y1)plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--')# 顯示plt.show()這樣我們就畫出來一個簡單的圖形了,接下來我們繼續在剛剛畫的這個圖形中添加一些元素。我們要做的事情就是重新定義坐標軸的名稱,在定義坐標軸的名稱的時候,我們會遇到一個問題,就是中文顯示 的問題,這個問題是繞不過去的問題。對於Windows系統的同學只需在代碼中添加如下代碼:

# 解決中文顯示問題font = {"family" : "SimHei", "size" : "20"}plt.rc("font", **font)對於mac系統的同學來說,稍微有點麻煩,在terminal裡面輸入:fc-list :lang=zh,如果顯示command not found,那麼我們需要執行一個安裝命令:conda install fontconfig,然後輸入y確認就可以自動安裝好了,最後再一次輸入fc-list :lang=zh,就可以查看字體了,然後我們在代碼中添加下面一行代碼:

plt.rcParams["font.family"] = 'Arial Unicode MS'下面讓我們一起來把這個繪圖完善起來,代碼如下:

import numpy as npimport matplotlib.pyplot as plt# np.linspace將會在-5到5的區間內生成100個數,注意這個是均勻分布的x = np.linspace(-5, 5, 100)# 根據x的值,經過計算生成y1和y2的值y1 = 2 * x + 1y2 = x ** 2# font = {"family" : "SimHei",# "size" : "20"}# plt.rc("font", **font)plt.rcParams["font.family"] = 'Arial Unicode MS'# 設置畫布大小plt.figure(figsize=(8, 5))# 畫圖plt.plot(x, y1)plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--')# 設置坐標軸範圍plt.xlim((-3, 5))plt.ylim((-4, 5))# 設置坐標軸名稱plt.xlabel('我是x軸')plt.ylabel('我是y軸')# 顯示plt.show()我們看到,在坐標軸上還會有一些刻度的存在,我們只需要在上邊的代碼後邊加入一段代碼,就可以進行刻度的修改了:

new_ticks = np.linspace(-1, 2, 5)# 設置坐標軸的刻度plt.xticks(new_ticks)plt.yticks([-2, -1.8, -1, 1.22, 3], ["北京", "天津", "河北", "東北", "山東"])除此之外,我們還可以做一些圖形邊框上的修改,在本章最開始我們已經說過關於圖形邊框修改的方法了,我們只需要把下面的代碼添加至末尾即可:

# 添加邊框ax = plt.gca()# 修改右側顏色ax.spines["right"].set_color("green")# 修改左側顏色ax.spines["left"].set_color("orange")# 修改頂部顏色ax.spines["top"].set_color("yellow")# 修改底部顏色ax.spines["bottom"].set_color("purple")一起來看一下現實的效果怎麼樣

這裡需要注意的是,如果上下左右只操作其中的左側和底部,那麼其他兩條線將仍然默認是黑色,還有另外一個小技巧,我們上面的圖形總是在一個方框中顯示,我們可以把右側和頂部的線條不設置顏色,這樣看起來就與我們平時的坐標軸看起來一個樣子了,也就是把設置邊框的代碼修改為:

ax.spines["right"].set_color("none")ax.spines["top"].set_color("none")plt.show()修改之後看起來就好多了

在數學中,我們的圖形有時是十字的樣式,那下面我們一起來看一下,如何修改邊框的位置,代碼其實也很簡單,我們首先來修改一下x軸對應y軸的位置,完整的代碼如下:

import numpy as npimport matplotlib.pyplot as plt# np.linspace將會在-5到5的區間內生成100個數,注意這個是均勻分布的x = np.linspace(-5, 5, 100)# 根據x的值,經過計算生成y1和y2的值y1 = 2 * x + 1y2 = x ** 2# font = {"family" : "SimHei",# "size" : "20"}# plt.rc("font", **font)plt.rcParams["font.family"] = 'Arial Unicode MS'# 設置畫布大小plt.figure(figsize=(8, 5))# 畫圖plt.plot(x, y1)plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--')# 設置坐標軸範圍plt.xlim((-3, 5))plt.ylim((-4, 5))# 設置坐標軸名稱plt.xlabel('我是x軸')plt.ylabel('我是y軸')# 設置坐標軸的刻度plt.xticks(np.linspace(-1, 2, 5))plt.yticks([-2, -1.8, -1, 1.22, 3], ["北京", "天津", "河北", "東北", "山東"])# 添加邊框ax = plt.gca()# 修改右側顏色ax.spines["right"].set_color("none")# 修改左側顏色ax.spines["left"].set_color("orange")# 修改頂部顏色ax.spines["top"].set_color("none")# 修改底部顏色ax.spines["bottom"].set_color("purple")# 設置x軸的位置ax.xaxis.set_ticks_position("bottom")ax.spines["bottom"].set_position(("data", 0))# 設置y軸的位置ax.yaxis.set_ticks_position("left")ax.spines["left"].set_position(("data", 0))# 顯示plt.show()這樣就大功告成了,最後再來看一下現實的圖形

最後在畫圖時我們可以使用label參數給圖片添加一個圖例說明,最後使用legend顯示出來,最終代碼如下:

import numpy as npimport matplotlib.pyplot as plt# np.linspace將會在-5到5的區間內生成100個數,注意這個是均勻分布的x = np.linspace(-5, 5, 100)# 根據x的值,經過計算生成y1和y2的值y1 = 2 * x + 1y2 = x ** 2# font = {"family" : "SimHei",# "size" : "20"}# plt.rc("font", **font)plt.rcParams["font.family"] = 'Arial Unicode MS'# 設置畫布大小plt.figure(figsize=(8, 5))# 畫圖plt.plot(x, y1, label='y1圖例說明')plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--', label='y2圖例說明')# 設置坐標軸範圍plt.xlim((-3, 5))plt.ylim((-4, 5))# 設置坐標軸名稱plt.xlabel('我是x軸')plt.ylabel('我是y軸')# 設置坐標軸的刻度plt.xticks(np.linspace(-1, 2, 5))plt.yticks([-2, -1.8, -1, 1.22, 3], ["北京", "天津", "河北", "東北", "山東"])# 添加邊框ax = plt.gca()# 修改右側顏色ax.spines["right"].set_color("none")# 修改左側顏色ax.spines["left"].set_color("orange")# 修改頂部顏色ax.spines["top"].set_color("none")# 修改底部顏色ax.spines["bottom"].set_color("purple")# 設置x軸的位置ax.xaxis.set_ticks_position("bottom")ax.spines["bottom"].set_position(("data", 0))# 設置y軸的位置ax.yaxis.set_ticks_position("left")ax.spines["left"].set_position(("data", 0))# fontdict 是對字體大小和顏色進行設置,如果這裡會對原圖有遮擋,我們可以重新設置畫布大小plt.text(1, -1, "這是我對圖片添加的一段說明", fontdict={"size": 12, "color": "r"})# 顯示plt.legend(loc='lower right') # 圖例說明沒有參數則默認在右上角plt.show()二 繪製統計圖形

1 柱狀圖

在實際的企業應用中,我們要掌握多種圖形的繪製,並且深度結合自己的應用場景,用合適的圖形來展示適合它的數據場景,使得數據更具有說明力。首先我們來學習一下bar()函數,它的功能是在x軸上繪製定性數據的分布特徵,也就是柱狀圖。使用方法是plt.bar(x,y),其中x表示在x軸上的定性數據的類別,而y表示每種定性數據的類別的數量。如果你覺得有點抽象,那我們就直接上代碼吧。

import matplotlib.pyplot as plt# x是刻度,y是高度x = [1, 2, 3, 4, 5, 6, 7, 8]y = [3, 1, 4, 5, 7, 8, 6, 4]plt.bar(x, y)plt.show()代碼非常簡單,分別定義好了x和y並且帶入函數裡面就可以了,它的現實結果其實就是一個條形圖。

2 頻率分布直方圖

與條形圖相對比的是頻率直方圖(frequency histogram),也叫做頻率分布直方圖,是統計學中表示頻率分布的圖形。在直角坐標系中,用橫軸表示隨機變量的取值,橫軸上的每個小區間對應一個組的組距,作為小矩形的底邊;縱軸表示頻率(頻數/組距=頻率),並用它作小矩形的高,以這種小矩形構成的一組圖稱為頻率直方圖。

import matplotlib.pyplot as pltimport numpy as npx = np.random.randint(0, 10, 20)print(x)plt.hist(x)plt.show()隨機x輸出結果:[9 7 4 1 0 9 8 3 7 8 1 1 7 4 6 8 0 6 9 9]

3 餅圖

下面要學習的就是餅圖,餅圖是一種用來表示數據所佔比例最常用的圖形,它的函數是pie(),使用方法也非常的簡單,我們進行最簡單的圖形調用的時候也可以只傳一個參數,就像這樣plt.pie(x)。

import matplotlib.pyplot as plt# 中文顯示plt.rcParams["font.family"] = 'Arial Unicode MS'# 聲明類別kinds = ['蘋果', '香蕉', '西紅柿', '西瓜']# 這個是16進位顏色碼,你可以在網上搜索16進位顏色碼就可以獲取到所有的編碼colors = ['#e41a1c', '#DDA0DD', '#4B0082', '#7FFFAA']sold_nums = [4, 3, 2, 5]# 繪製餅圖,根據圖形效果,看一下這些參數的含義吧plt.pie(sold_nums, labels=kinds, colors=colors)plt.show()餅圖顯示結果

4 極線圖

接下來我們看一下極線圖的繪製方法,我們可以使用plt.polar(theta,x)這樣的方式來進行圖形的繪製,如果你之前沒接觸過這種圖形,解釋起來有一點複雜,我們直接來看一下效果吧。

import matplotlib.pyplot as pltimport numpy as npbar_slices = 10 # 星星數量theta = np.linspace(0.0, 2*np.pi, bar_slices, endpoint=False)r = 30*np.random.rand(bar_slices)print(r)# linewidth為線條粗細,mfc為星星顏色,ms為星星大小plt.polar(theta, r, color='chartreuse', linewidth=2, marker='*', mfc='y', ms=10)plt.show()r輸出結果為:[19.19557439 9.80163298 14.72266501 25.96471826 17.43950265 27.16974937 24.16166493 8.32586511 1.07374567 21.5498875 ]

5 散點圖

接下來要學習的圖形叫做散點圖,也有叫做氣泡圖的。我們可以使用plt.scatter(x,y)這樣的方式來進行圖形的繪製。關於scatter的參數:

x就表示x軸上的值y就表示y軸上的值s表示散點標記的大小,這個是可選項c表示散點標記的顏色,可選項cmap表示將浮點數映射成顏色的顏色映射表讓我們通過一段代碼的演示,來看看實踐一下這些參數。自己可以根據我的說明嘗試著修改一下這些參數。

import matplotlib.pyplot as pltimport numpy as npimport matplotlib as mpla = np.random.randn(100)b = np.random.randn(100)"""cmap的參數非常多,cm後面的gist_rainbow可以有很多替代具體的可以在官網或者原始碼中查詢使用,不過都把差別不大,就是顏色上的區別"""plt.scatter(a, b, s=np.power(10*a+20*b, 2), c=np.random.rand(100), cmap=mpl.cm.gist_rainbow, marker='o') # marker表示散點的樣式,可以試試用o,*或者^plt.show()展示結果如圖所示:

6 棉棒圖

下面我們來講解一下棉棒圖的繪製方法,棉棒圖主要用來繪製離散有序的數據,使用方法是plt.stem(x,y)。關於它的參數有:

x:用來指定棉棒的x軸基線上的位置。y:棉棒的長度。linefmt:棉棒的樣式。markerfmt:棉棒末端的樣式。basefmt:指定基線的樣式。我們直接上代碼來看一下

import matplotlib.pyplot as pltimport numpy as np# linspace:在0.5和2*np.pi之間返回20個均勻間隔的數據x = np.linspace(0.5, 2 * np.pi, 20)# randn:返回20個服從標準正態分布的樣本數據y = np.random.randn(20)# --是虛線,-是實線plt.stem(x, y, linefmt='--', markerfmt='o', basefmt='-')plt.show()顯示結果如下圖所示:

7 箱線圖

接下來我們來繪製一下箱線圖,箱線圖的繪製方法也比較簡單,我們使用plt.boxplot(x)來實現,x就是我們要輸入的數據了。

import matplotlib.pyplot as pltimport numpy as npx = np.random.randn(1000)plt.boxplot(x)plt.show()顯示結果如下圖所示:

三 圖形參數說明

1 柱狀圖參數詳解

我們再次來看一下柱狀圖,柱狀圖在數據的可視化展示用應用的場景非常的多了,比如按照月份的商品銷量展示,銷售人員的業績統計等等場景我們都會用到。現在我在原有代碼基礎之上加入一些新的參數,代碼如下:

import matplotlib.pyplot as pltx = [1, 2, 3, 4, 5]y = [6, 10, 4, 5, 1]# 中文顯示plt.rcParams["font.family"] = 'Arial Unicode MS'plt.bar( # 1 柱體的標籤值 x, # 2 柱體的高度 y, # 3 柱體的對齊方式,兩個參數:edge或者center align='edge', # 4 顏色 color='b', # 5 刻度的標籤值,用字母把x中的數字替換 tick_label=['A', 'B', 'C', 'D', 'E'], # 6 透明度 alpha=0.5)plt.xlabel('產品代號')plt.ylabel('產品銷量')# 網格設置plt.grid( True, # 1 axis指的是對軸的設置,參數可以為x,y或者both axis='x', # 2 ls指的是網格的樣式,也可以寫成--或者: ls=':', color='r', alpha=0.9)plt.show()顯示結果如下圖所示:

2 條形圖參數詳解

條形圖其實就是把柱狀圖橫過來放,它們的使用方法一樣,只是調用的函數不同,參數全部相同,具體代碼如下:

import matplotlib.pyplot as pltx = [1, 2, 3, 4, 5]y = [6, 10, 4, 5, 1]# 中文顯示plt.rcParams["font.family"] = 'Arial Unicode MS'# 函數改為了barh,只是添加了一個h,代表horizontal水平橫放plt.barh( # 1 柱體的標籤值 x, # 2 柱體的高度 y, # 3 柱體的對齊方式,兩個參數:edge或者center align='edge', # 4 顏色 color='b', # 5 刻度的標籤值,用字母把x中的數字替換 tick_label=['A', 'B', 'C', 'D', 'E'], # 6 透明度 alpha=0.5)plt.xlabel('產品代號')plt.ylabel('產品銷量')# 網格設置plt.grid( True, # 1 axis指的是對軸的設置,參數可以為x,y或者both axis='x', # 2 ls指的是網格的樣式,也可以寫成--或者: ls=':', color='r', alpha=0.9)plt.show()顯示結果如下圖所示:

3 堆積圖參數詳解

import matplotlib.pyplot as pltx = [1, 2, 3, 4, 5]y = [6, 10, 4, 5, 1]y1 = [2, 6, 3, 4, 5]# 中文顯示plt.rcParams["font.family"] = 'Arial Unicode MS'plt.figure(figsize=(8, 5))plt.bar( x, y, align='center', color='#66c2a5', tick_label=['A', 'B', 'C', 'D', 'E'], label='男人')plt.bar( x, y1, align='center', bottom=y, # 指定哪一值在下面 color='#8da0cb', label='女人')plt.xlabel('城市代號')plt.ylabel('男女比例')plt.legend()plt.show()顯示結果如下圖所示:

4 堆積條形圖參數詳解

同理,堆積條形圖就是把堆積圖橫放,原來需要考慮底部的是哪一個值,現在需要思考的是左邊的是哪一個值,具體代碼如下:

import matplotlib.pyplot as pltx = [1, 2, 3, 4, 5]y = [6, 10, 4, 5, 1]y1 = [2, 6, 3, 4, 5]# 中文顯示plt.rcParams["font.family"] = 'Arial Unicode MS'plt.figure(figsize=(8, 5))plt.barh(x, y, align='center', color='#66c2a5', tick_label=['A', 'B', 'C', 'D', 'E'], label='男人')# 這裡修改了left 指定哪個值在這個圖的下邊plt.barh(x, y1, align='center', left=y, color='#8da0cb', label='女人')plt.xlabel('城市代號')plt.ylabel('男女比例')plt.legend()plt.show()顯示結果如下圖所示:

5 分塊圖參數詳解

堆積圖可以展示多數據形式上的差異,但有時不是特別明顯,這是用分塊圖就可以很直觀的比較出來。分塊圖可以分為多數據並列柱狀圖和多數據並列條形圖,我們先來一起看一下多數據並列柱狀圖,具體代碼如下:

import matplotlib.pyplot as pltimport numpy as np# 中文顯示plt.rcParams["font.family"] = 'Arial Unicode MS'x = np.arange(5)y = [6, 10, 4, 5, 1]y1 = [2, 6, 3, 8, 5]bar_width = 0.35tick_label = ['A', 'B', 'C', 'D', 'E']plt.figure(figsize=(8, 5))plt.bar( x, y, bar_width, color='c', align='center', label='男人', alpha=0.5)plt.bar( x+bar_width, y1, bar_width, color='b', align='center', label='女人', alpha=0.3)plt.xlabel('城市代號')plt.ylabel('男女比例')plt.xticks(x+bar_width/2, tick_label)plt.legend()plt.show()圖形顯示結果如下圖所示:

6 多數據並列條形圖詳解

根據我們的前面的講解,你應該已經知道了,我們只需要把函數bar改為barh就可以,代碼如下所示:

import matplotlib.pyplot as pltimport numpy as np# 中文顯示plt.rcParams["font.family"] = 'Arial Unicode MS'x = np.arange(5)y = [6, 10, 4, 5, 1]y1 = [2, 6, 3, 8, 5]bar_width = 0.35tick_label = ['A', 'B', 'C', 'D', 'E']plt.figure(figsize=(8, 5))plt.barh( x, y, bar_width, color='c', align='center', label='男人', alpha=0.5, hatch='\/' # 如果我們需要添加一些裝飾線可以使用hatch參數)plt.barh( x+bar_width, y1, bar_width, color='b', align='center', label='女人', alpha=0.3, hatch='\\' )plt.xlabel('城市代號')plt.ylabel('男女比例')plt.xticks(x+bar_width/2, tick_label)plt.legend()plt.show()圖形顯示結果如下圖所示:

7 堆積折線圖參數詳解

堆積折線圖是通過繪製不同數據集的折線圖而生成的,按照垂直方向上彼此堆疊且又不互相覆蓋的排列順序,繪製若干條折線圖而形成的組合圖形。

import matplotlib.pyplot as pltimport numpy as npx = np.arange(1, 6, 1)y = [0, 4, 3, 5, 6]y1 = [1, 3, 4, 2, 7]y2 = [3, 4, 1, 6, 5]labels = ['2018', '2019', '2020']colors = ['r', 'b', 'y']plt.stackplot(x, y, y1, y2, labels=labels, colors=colors)plt.legend()plt.show()圖形顯示結果如下圖所示:

8 間斷條形圖參數詳解

間斷條形圖是在條形圖的基礎之上繪製而成的,主要用來可視化定性數據的相同指標在時間維度上的指標值的變化情況,直觀比較並展現出定性數據的相同指標的變化情況。

import matplotlib.pyplot as pltimport numpy as np# 中文顯示plt.rcParams["font.family"] = 'Arial Unicode MS'plt.broken_barh( # 元組中第一個元素代表距離y軸的距離,第二個元素代表自身的寬度 [(10, 20), (190, 60), (270, 80), (370, 80)], # 元組中第一個元素代表距離x軸的距離,第二個元素代表自身的長度 (30, 9), facecolors='r')plt.broken_barh( [(30, 80), (190, 60), (270, 80), (360, 30)], (10, 5), facecolors=('b', 'y', 'g', 'purple'))# 定義坐標軸的範圍plt.xlim(0, 500)plt.ylim(5, 50)# 定義x軸的名稱plt.xlabel('上課時間')# 定義x軸的刻度plt.xticks(np.arange(0, 361, 60))# 定義y軸的刻度和名稱plt.yticks([15, 25], ['一班', '二班'])# 定義刻度的樣式plt.grid(ls='--', lw=1, color='gray')# 定義主題名稱plt.title('兩個班級的上課時間')plt.show()圖形顯示結果如下圖所示:

9 階梯圖參數詳解

階梯圖就如其名字那樣,像一臺階一樣,時而上升,時而下降,我們經常用它來展示數據的趨勢變化或周期顧慮。階梯圖經常使用在時間序列的數據的可視化任務中,比如商品的日銷量、月銷量,企業中每月的員工數量的變化等,這樣我們能夠很容易發現時序數據的波動周期和規律。

import matplotlib.pyplot as pltimport numpy as npx = np.linspace(1, 10, 10)print(x)y = np.sin(x)print(y)# 代碼1plt.step(x, y, color='b', where='pre', lw=2)plt.xlim(0, 12)plt.ylim(-1.2, 1.2)plt.xticks(np.arange(1, 13, 1))plt.grid(ls='--', lw=1, color='gray')plt.show()# 代碼2 plt.step(x, y, color='b', where='mid', lw=2)plt.xlim(0, 12)plt.ylim(-1.2, 1.2)plt.xticks(np.arange(1, 13, 1))plt.grid(ls='--', lw=1, color='gray')plt.show()# 代碼3plt.step(x, y, color='b', where='post', lw=2)plt.xlim(0, 12)plt.ylim(-1.2, 1.2)plt.xticks(np.arange(1, 13, 1))plt.grid(ls='--', lw=1, color='gray')plt.show()這裡有一個新的參數where,你可以分別運行這三段代碼,可以看到圖形好像是在往右邊移動,顯示結果如下圖所示:代碼1:

代碼2:

代碼3:

where參數主要用來定義step應該放在哪裡,我們把圖形中的每條橫線可以看作一個step,where欄位一共有三個取值,分別是:pre,mid和post,如果我們在x為1和2的兩個位置上畫一條橫線(如上圖紅線所示),你會發現,當where='pre'時,y取值的第一個點應該是在x第一個點左側一些,當where='mid'時,y取值的第一個點應該是在x第一個點中間,y取值的第一個點應該是在x第一個點右側。

四 實例項目自由繪圖

1 直方圖

直方圖擅長展示區間分布,比如某一科目的考試成績,按照地區統計的人均壽命,發達國家與發展中國家人均可支配收入等等,現在我們需要繪製某個班級中Python語言考試成績的分布區間圖。

import matplotlib.pyplot as pltimport numpy as np# 中文顯示plt.rcParams["font.family"] = 'Arial Unicode MS'scores = np.random.randint(0, 100, 100)bins = range(0, 101, 10)"""histtype在這裡有三個參數,分別是bar,step和stepfilled1 bar就是填滿相應顏色2 step是階梯圖3 histtype是生成一個默認的lineplot進行圖形填充填充,恰好這個參數的默認值就是bar"""plt.hist(x=scores, bins=bins, color='#3366FF', histtype='bar')plt.xlabel('Python考試成績')plt.ylabel('學生成績')plt.show()圖形顯示結果如下圖所示:

在這裡我們有必要重新再來說一下關於直方圖與柱狀圖,因為他們的樣子實在是太像了,只是柱體與柱體之間是否存在空隙,但恰恰是由於這一點,才讓它們有所區別,也讓它們分為擅長表示不同類型的數據。我們知道數據可以分為連續型數據和離散型數據,這裡我們可以對它們進行總結。直方圖擅長總結和描述連續型數據的分布,而柱狀圖更加的擅長描述和總結離散型數據的分布,所以你在未來的應用場景中,首先判斷數據的特點,然後再決定使用什麼圖形去描述這些數據。

2 堆疊直方圖

現在我們要繪製一個基於剛剛的場景之上的另外一個場景,就是我們要比較兩個班級的Python語言考試的成績,對它們的分布情況進行分別的比對,這時就需要用到堆疊直方圖。

import matplotlib.pyplot as pltimport numpy as np# 中文顯示plt.rcParams["font.family"] = 'Arial Unicode MS'# 1 分別生成兩個班級的分數scores1 = np.random.randint(0, 100, 100)scores2 = np.random.randint(0, 100, 100)# 2 把兩個班級的分數放在一個列表中x = [scores1, scores2]# 3 選擇兩個對比較鮮明的顏色colors = ['r', 'b']# 4 聲明兩個標籤labels = ['一班', '二班']# 5 設定x軸的範圍bins = range(0, 101, 10)"""新加入的參數的意義:1 rwidth:柱體的寬度,0.0-1.02 stack:上下排還是左右排"""plt.hist(x, color=colors, histtype='bar', rwidth=1.0, stacked=False, label=labels)plt.xlabel('Python成績分布')plt.ylabel('人數')plt.title('不同班級的Python成績直方圖')plt.legend(loc=1) # 原來用upper right這些,現在1表示右上,234分別對應逆時針旋轉位置plt.show()圖形顯示結果如下圖所示:

3 分裂式餅圖

餅圖是用來展示定性數據分布比例特徵的統計圖形,在數據可視化時應用的非常廣泛,我們可以通過繪製餅圖,直觀的觀察出數據的佔比情況。餅圖同樣適用於離散型數據的佔比情況,比如班級內男女性別比例,公司銷售業績每月在全年中的佔比情況等等。對於比例分布的場景,餅圖都是非常適合的。

import matplotlib.pyplot as pltimport numpy as npplt.rcParams["font.family"] = 'Arial Unicode MS'labels = ['第一季度', '第二季度', '第三季度', '第四季度']sale = [20, 40, 30, 70]colors = ['r', 'b', 'y', 'green']explode = (0.1, 0.1, 0.1, 0.1)plt.pie( sale, explode=explode, # 裂開的那條縫的寬度 labels=labels, autopct='%.2f%%', # %的精度 startangle=10, # 從x軸為起始位置,逆時針旋轉的角度 shadow=True, # 陰影 colors=colors)plt.title('每一季度銷售額', loc='right')plt.show()圖形顯示結果如下圖所示:

4 內嵌環形餅圖

內嵌環形餅圖式使得餅圖不僅可以展示單一數據集的比例情況,還可以對比展示多數據集的分布情況。

import matplotlib.pyplot as pltimport numpy as npplt.rcParams["font.family"] = 'Arial Unicode MS'development_language = ['Java', 'Python', 'C++', 'PHP', 'Scala']weight1 = [40, 20, 30, 15, 15]weight2 = [25, 35, 30, 12, 13]colors = ['#FF6600', '#9966FF', '#663333', '#3399CC', '#666600']wedges1, texts1, autotexts1 = plt.pie( weight1, autopct='%.1f%%', radius=1, pctdistance=0.85, colors=colors, textprops=dict(color='w'), wedgeprops=dict(width=0.3, edgecolor='w'))"""餅圖的創建其實是有三個返回值的:1 一個序列,matplotlib.patches.Wedge的實例2 一個列表,matplotlib.text.Text的實例,是label的列表3 一個列表,matplotlib.text.Text的實例,是數值的文本實例標籤,只有在參數autopct不為空的時候才有效"""print(wedges1)print(texts1)print(autotexts1)wedges2, texts2, autotexts2 = plt.pie( weight2, autopct='%.1f%%', radius=0.75, pctdistance=0.75, colors=colors, textprops=dict(color='w'), wedgeprops=dict(width=0.5, edgecolor='b') # 邊框)plt.legend( weight1, development_language, fontsize=5, title='開發語言佔比', loc='center left', bbox_to_anchor=(0.91, 0, 0.3, 1))# 調整餅圖外圈中的字體plt.setp(autotexts1, size=10, weight='bold')# 調整餅圖內圈中的字體plt.setp(autotexts2, size=15, weight='bold')plt.title('開發語言使用人數比例表')plt.show()圖形顯示結果如下圖所示:

綜上代碼,其實,餅圖的嵌套,就是畫兩個餅圖,不要讓他們重疊。

5 箱型圖

箱型圖主要應用在一系列測量或者比較數據的觀測中,比如學校與學校之間或者班級與班級之間的成績比較,各個運動員之間的體能比較,產品優化前和產品優化後的各項數據指標展現的結果比較等等,箱型圖是數據分析場景應用的比較多的一種數據可視化圖形。

import matplotlib.pyplot as pltimport numpy as npplt.rcParams["font.family"] = 'Arial Unicode MS'# 生成正態分布數據test1 = np.random.randn(5000)test2 = np.random.randn(5000)test_list = [test1, test2]labels = ['隨機數生成1', '隨機數生成2']colors = ['#3399FF', '#CCCCFF']box_plot = plt.boxplot( test_list, whis=1.5, # 上下四分位距離 widths=0.6, sym='o', labels=labels, patch_artist=True, # 是否給箱體添加顏色 notch=True # 是否中間v型凹陷)for patch, color in zip(box_plot['boxes'], colors): patch.set_facecolor(color)plt.ylabel('隨機數值')plt.title('生成器抗幹擾能力的穩定性比較')plt.grid(axis='y', ls=':', lw=1, color='gray', alpha=0.2)plt.show()圖形顯示結果如下圖所示:

以上是我們繪製的一些常用的圖形和一些常用的參數,當然Matplotlib繪製圖形的能力遠不止於此,但如果每一個圖形都一一講一遍的話,那麼內容會全部都由畫圖來組成了。畫圖的重點是要學習畫圖的思想,遇到問題先不要急於去畫,首先一定要選定一個合適的圖形,然後再動手。最核心的圖形無非就是那幾個常用的,我們都已經進行過了多次的練習。畫圖是數據分析、數據挖掘、AI方向的算法工程師必備的技能,所以一定要多多的練習它們的繪製。我們還會在後續的章節中不斷的去使用這些圖形的練習。最後會有一個小練習,請點擊下方連結下載題目和數據:chapter8-1.zip

相關焦點

  • 數據產品經理之數據分析與挖掘
    作為如今網際網路+過程中最火熱的關鍵詞之一,大數據越來越火,隨之而來的數據倉庫、數據安全、數據分析、數據挖掘等圍繞大數據的商業價值發掘利用相關的技術和知識越來越引起政府、企業和求職者的重視。其中,作為數據產品經理必備的專業知識之一的數據分析可以分為廣義的數據分析和狹義的數據分析,廣義的數據分析就包括狹義的數據分析和數據挖掘,人們常常提到的數據分析是指狹義的數據分析,數據挖掘和數據分析都是從數據中提取一些有價值的信息,但互相的側重點又有所不同。
  • 數據分析基礎內容介紹 — 模型、工具、統計、挖掘與展現
    第四層是Data Mining數據挖掘層,數據挖掘與數據分析(統計分析)有什麼區別呢,數據分析往往是統計量和算法比較清楚,數據挖掘往往是目標不是很清楚,在實現目標的過程中採用什麼方法不能確定,所以數據挖掘比數據分析難度要高很多。
  • 淺議概率拓撲與數據分析挖掘的關係
    數據挖掘分析,是一種在非結構化、雜亂無章的數據中,通過一定的數學方 法,挖掘出有用信息的過程。本文旨在通過研究一些常用算法的數學原理,並運 用一系列的數學知識加以解釋,從而闡釋一種數據挖掘分析的新思路。一、拓撲學簡介拓撲學,是一門研究幾何圖形不隨形狀改變而改變的性 質的學科,只考慮物體間的位置關係而不考慮其形狀與大小。
  • 如何使用 origin 繪製雙Y軸圖形?
    雙Y軸圖(Double-Y)圖形模板主要適用於試驗數據中自變量數據相同,但有兩個因變量的情況。
  • 12款實用的數據挖掘工具
    毫無疑問,這是世界領先的數據挖掘開源系統。該工具以Java程式語言編寫,通過基於模板的框架提供高級分析。它使得實驗可以由大量的可任意嵌套的操作符組成,這些操作符在XML文件中是詳細的,並且是由快速的Miner的圖形用戶界面完成的。最好的是用戶不需要編寫代碼。它已經有許多模板和其他工具,讓我們可以輕鬆地分析數據。2.
  • 數據分析神操作,第一個操作就跪了!(建議收藏)
    因此,企業需要大量專業人才來分析挖掘數據的價值,以提升企業利潤。所以市場上才會出現如此巨大的數據人才需求。可以說,數據分析將是每個從業者個人能力最重要的補充,也是BAT這類大公司急招人才的必備技能。基礎-Excel數據可視化 Excel經典10種數據表;Excel函數offset的3種動態圖表;Matplotlib 5個必會基礎用法;Matplotlib 5種常用圖表繪製;Matplotlib 2種三維圖形繪製。2.
  • R語言從入門到精通:Day8-圖形繪製
    1、本節內容重點內容較多,務必緊跟紅色標記  2、測試數據及代,見文末  圖形的組合  圖形的組合,顧名思義,就是將兩張或者更多圖形放在一起展示。在R中,一般使用函數par()或者layout()組合多幅圖形。
  • 在Linux下用Qt開發新一代DTS圖形數據系統的分析
    文中詳細分析和設計了該系統。本文第一次提出一個以Qt為底層圖形模塊、用C++和Qt圖形用戶界面類庫開發的DTS圖形數據一體化支撐環境的技術方案,本方案經過反覆測試以及用戶考驗證明,具有較高的穩定性和可靠性。2 相關技術分析2.1 作業系統在中國,EMS/DTS的主流作業系統是UNIX和NT。隨著計算機的發展,更多的用戶接受了Linux這種自由軟體形式。
  • AI繪製3D圖形
    3D立體文字與圖形效果,是平面設計中常見的一種設計元素。 製作3D效果,首先想到的是3dsmax, Rhino, C4D等。其實,Ai軟體也能夠簡便和快速地打造3D效果。既可以節約時間成本,又可以滿足設計需求。
  • 從零開始學Python可視化(二):掌握統計圖形的繪製
    這次我們會嘗試更多常見的統計圖形,比如條形圖、直方圖、餅圖等,我們的目標是掌握工作學習過程中使用最頻繁的圖形技能。1. 柱狀圖(條形圖) —— bar() / barh()柱狀圖又叫條形圖,用於繪製定性(分類)數據的分布特徵,比如不同國家的GDP、不同年齡段的平均體重等。這次,我們以一組學生的身高來演示它的作圖方法。
  • 辦公必備的大數據分析利器,數據分析工具推薦
    說到數據分析,很多小夥伴可能第一時間聯想到複雜的算法,龐大的數據,甚至是讓人眼花繚亂的代碼。但實際上,運營做數據分析並不需要懂這些,關鍵是你對業務流程的理解,以及用數據解決問題的思維。本文將介紹在一些領域被高頻率使用,且不可缺少的大數據分析利器,使用尚可的數據分析工具。
  • 利用ggforce繪製數據的分布規律
    在R語言中,有很多函數可以描繪數據的分布規律,如利用geom_boxplot繪製箱線圖,用geom_histogram繪製直方圖,利用geom_violet繪製小提琴圖,利用geom_jitter繪製抖動圖等等。然而這些函數大多只能反映數據分布的部分規律和特徵。
  • 辦公必備的大數據分析利器,值得推薦數據分析工具
    說到數據分析,很多小夥伴可能第一時間聯想到複雜的算法,龐大的數據,甚至是讓人眼花繚亂的代碼。但實際上,運營做數據分析並不需要懂這些,關鍵是你對業務流程的理解,以及用數據解決問題的思維。本文將介紹在一些領域被高頻率使用,且不可缺少的大數據分析利器,使用尚可的數據分析工具。
  • 數據不夠?生信分析幫你湊!學會深度挖掘快速發文章
    這個時候需要的是生信分析——深度的數據挖掘和分析處理,可以幫助臨床醫生不耗費大量的時間通過實驗攢數據,而是通過數據處理得到自己想要的信息,更快速地發文章。 學習哪種生信分析的工具?
  • SEER數據挖掘4.8分SCI發文思路
    或者不做生信數據挖掘的,可以嘗試一下別的發文思路,例如挖掘SEER資料庫的臨床數據進行發表SCI。本次分享的範文發表在FRONT ONCOL上,影響因子:4.848,中科院分區:2區。研究方法:從2010年到2015年,從SEER資料庫中分析了6,860名被診斷患有初始骨轉移的乳腺癌患者。採用單因素Cox和多因素Cox分析來確定預後因素。根據從Cox回歸結果中選擇的因素進行列線圖。根據不同的亞型,轉移負擔和通過列線圖區分的風險組繪製生存曲線。
  • CorelDRAW:CDR-如何繪製基礎圖形(下)
    釋放滑鼠即可完成繪製。在繪製過程中按住Ctrl鍵拖動進行繪製可以繪製出正圓。三、基本形狀「基本形狀」工具包含多種內置的圖形效果,選擇工具箱中的「基本形狀」工具,然後單擊屬性欄中的「完美形狀」按鈕,在下拉麵板中選擇一個合適的圖形。接著在畫面中按住滑鼠左鍵拖拽即可繪製出圖形。繪製出的圖形上方有一個紅色的控制點,使用「形狀工具」拖拽紅色控制點即可對形狀進行變形。
  • AI時代,數據挖掘過時了嗎?—企業數據挖掘成功之道(理論篇)
    數據挖掘涉及知識面廣,技術點多。在面對複雜多樣的業務分析場景時,如何做出有效的數據挖掘分析方案其實是有一套可遵循的方法體系。針對不同的分析數據和業務場景,數據挖掘的方法可以分為監督學習、無監督學習、半監督學習、增強學習,每種方法都有其適應的分析場景和數據基礎。
  • Python學習第90課-數據可視化之散點圖繪製
    今天我們學習散點圖,在統計學或者機器學習方面,或者在金融風險控制方面,金融風險控制經常要看異常交易、信貸風險,做這樣的分析就要用到一個圖--散點圖(scatter plot)。下面我們假設繪製一個散點圖需要的數據如下:x=[1,2,3,4,5,6,7,8,9,10]y=[2,5,3,1.6,4.3,5.8,6.2,7.5,8.1,9]根據之前學習繪製折線圖、柱狀圖、直方圖的經驗,我們可以總結出規律:用Python的matplotlib繪製圖形,就是plt.後面跟上要繪製的圖形的英文單詞的縮寫,或者截取該英文單詞的一部分作為一個函數
  • 數據挖掘與統計分析的區別
    1 模式識別*–CS/工程2 資料庫管理–CS/圖書館科學3 神經網絡*–心理學/CS/工程4 機器學習*-CS/AI5 圖形模型*(Beyes 網)-CS/AI6 遺傳工程–CS/工程7 化學統計學*–化學8 數據可視化**–CS/科學計算可以肯定地說,個別的統計學家已經致力於這些領域,但公平地說他們並未被我們的統計學學術圈接納
  • 數據可視化,職場數據分析都需要哪些常用的圖表?
    圖表是對數據的可視化展示,精美的圖表可以方便用戶解讀數字之間的關係,相比起枯燥的表格來講,有助於發現容易被忽視的趨勢和規律。通過對趨勢和規律的分析,可以幫助用戶做出正確的判斷。我們將常用的圖表類型歸類為基礎圖表和高級可視化圖表。