天天看點

資料分析(三)matplotlib ---資料可視化庫matplotlib介紹一、繪圖基礎文法與常用參數二、繪制圖形

matplotlib介紹

資料可視化的庫

不僅可以繪制 2-D圖,也可以繪制 3-D圖

# 導包
import matplotlib.pyplot as plt
           

繪圖三部曲:

  1. 建立畫布
  2. 繪圖
  3. 圖形展示

一、繪圖基礎文法與常用參數

1、基本繪圖流程

資料分析(三)matplotlib ---資料可視化庫matplotlib介紹一、繪圖基礎文法與常用參數二、繪制圖形

2、建立畫布與子圖

函數名稱 函數作用
plt.figure 建立一個空白畫布,可以指定畫布大小,像素。
figure.add_subplot 建立并選中子圖,可以指定子圖的行數、列數、與選中圖檔編号。

3、圖形修飾

函數名稱 函數作用
plt.title 給目前圖形添加标題
plt.xlabel 添加 x 軸名稱
plt.ylabel 添加 y 軸名稱
plt.xlim 指定目前圖形 x 軸的範圍,隻能确定一個數值區間,而無法使用字元串辨別
plt.ylim 指定目前圖形 y 軸的範圍,隻能确定一個數值區間,而無法使用字元串辨別
plt.xticks 指定 x 軸刻度的數目與取值,可以使用字元串進行辨別
plt.yticks 指定 y 軸刻度的數目與取值,可以使用字元串進行辨別
plt.legend 增加圖例,可以指定圖例的位置 loc
plt.text 标注具體數值

4、圖檔的儲存與展示

函數名稱 函數作用
plt.savefig 儲存繪制的圖檔,在圖形修飾完之後,圖形展示之前
plt.show 圖形展示

5、RC參數

# 設定RC參數,使其支援中文
plt.rcParams['font.sans-serif']='SimHei'
# 設定RC參數,使其支援負号
plt.rcParams['axes.unicode_minus']=False
           

線條

rc 參數名稱 解釋
color 線條的顔色
linestyle 線條的樣式
linewidth 線條的寬度
marker 點的形狀
markersize 點的大小
markerfacecolor 點的填充顔色
markeredgecolor 點的邊緣顔色
  • 常見線條類型解釋
linestyle取值 意義 linestyle取值 意義
- 實線 -. 點線
長虛線 : 短虛線
  • 線條标記解釋
marker取值 意義 marker取值 意義
“o” 圓圈 “.”
“D” 菱形 “s” 正方形
“h” 六邊形1 “*” 星号
“H” 六邊形2 “d” 小菱形
“-” 水準線 “v” 一角朝下的三角形
“8” 八邊形 “<” 一角朝左的三角形
“p” 五邊形 “>” 一角朝右的三角形
“,” 像素 “^” 一角朝上的三角形
“+” 加号 "\ " 豎線
“None” “x” X

如果想要參考更多線條樣式、顔色,請通路:

https://www.cnblogs.com/darkknightzh/p/6117528.html

二、繪制圖形

1、折線圖(plot)

plot 函數在官方文檔的文法中隻要求填入不定長參數,實際可以填入的參數主要如下:

參數名稱 說明
x,y 接收 array。表示 x 軸和 y 軸對應的資料。
color 接收特定 string。指定線條的顔色
linestyle 接收特定 string。指定線條類型。預設為”-“。
marker 接收特定 string。表示繪制的點的形狀。
alpha 接收 0-1的小數。表示點的透明度。
  • color 參數的 8 中常用顔色的縮寫。
顔色縮寫 代表的顔色 顔色縮寫 代表的顔色
b 藍色 m 品紅
g 綠色 y 黃色
r 紅色 k 黑色
c 青色 w 白色

案例一:

繪制下一周北京、廣州天氣溫度走勢圖

  • 注意:如果橫坐标是中文字元串形式的,先用序号代替,之後再用字元串替換
import matplotlib.pyplot as plt
import numpy as np

# 1、建立畫布
plt.figure()
# 修改RC參數,讓其支援中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 再去修改RC參數,讓其支援負号
plt.rcParams['axes.unicode_minus'] = False

# 2、繪圖
##  建構x,y軸資料
x = np.arange(1, 8)
y1 = np.array([-10, -8, -6, -10, -12, -4, 2]) # 北京天氣
y2 = np.array([26, 24, 22, 24, 25, 20, 18]) # 廣州天氣
##  繪制折線圖
plt.plot(x, y1, color='r', linestyle=':', linewidth=1.2, marker="*", markersize=7, markerfacecolor='b', markeredgecolor='g')
plt.plot(x, y2, color='b', linestyle='-.', linewidth=1.2, marker="o", markersize=7, markerfacecolor='r', markeredgecolor='r')

##  圖形修飾
##  1.增加标題
plt.title("下一周北京、廣州天氣溫度走勢圖")
##  2.增加x軸名稱
plt.xlabel("日期")
##  3.增加y軸名稱
plt.ylabel("溫度℃")
##  4.修改x軸刻度
# 用中文字元串替換序号
# 參數1 序号
# 參數2 中文字元串
xticks = ["周一","周二","周三","周四","周五","周六","周日"]
plt.xticks(x, xticks)
##  5.修改y軸刻度
# 如果隻是修改數值的取值範圍 ---重新設定刻度
# 參數 新的刻度
yticks = np.arange(-15, 31, 3)
plt.yticks(yticks)
##  6.增加圖例
# loc --調整圖例的位置
legend = ["北京","廣州"]
plt.legend(legend, loc=0)
##  7.進行标注
for i,j in zip(x,y1):
    # 參數1 标注的橫坐标
    # 參數2 标注的縱坐标
    # 參數3 标注的内容
    # horizontalalignment='center' --讓标注水準居中
    plt.text(i, j + 0.7, "%d℃" % j, horizontalalignment='center')

for i,j in zip(x,y2):
    plt.text(i, j + 0.7, "%d℃" % j, horizontalalignment='center')

# 儲存圖檔
plt.savefig("./下一周北京、廣州天氣溫度走勢.png")

# 3、圖形展示
plt.show()
           

案例二:

  1. 加載

    國民經濟核算季度資料.npz

    檔案

    連結:https://pan.baidu.com/s/1m3CcoWuCDsWZDRQWdzlzfg

    提取碼:c0gv

  2. 繪制

    2000-2017各産業生産總值折線圖.png

import matplotlib.pyplot as plt
import numpy as np

def build_data():
    """加載資料"""
    res = np.load("./國民經濟核算季度資料.npz", allow_pickle=True)
    # for tmp in res:
    #     print(tmp)
    columns = res['columns']
    values = res['values']
    return columns, values

def show_data(columns, values):
    """資料可視化"""
    # 1、建立畫布
    plt.figure(figsize=(10, 8), dpi=100)
    # 修改RC參數,讓其支援中文
    plt.rcParams['font.sans-serif'] = 'SimHei'
    # 再去修改RC參數,讓其支援負号
    plt.rcParams['axes.unicode_minus'] = False

    # 2、繪圖
    # 準備x軸和y軸資料
    x = np.arange(1, values.shape[0] + 1)
    # 第一産業總值
    y1 = values[:, 3]
    # 第二産業總值
    y2 = values[:, 4]
    # 第三産業總值
    y3 = values[:, 5]
    # 繪制折線圖
    # fmt = '[marker][line][color]'
    plt.plot(x, y1, 's-b')
    plt.plot(x, y2, 'o-.r')
    plt.plot(x, y3, 'o--g')

    # 圖形修飾
    # 增加标題
    plt.title("2000-2017年各産業季度生産總值折線圖")
    # 增加y軸名稱
    plt.ylabel("生産總值(億元)")
    # 修改x軸刻度
    # 用中文字元串替換序号
    xticks = values[:, 1]
    plt.xticks(x[::4], xticks[::4], rotation=45)
    # 增加圖例
    legend = [tmp[:4] for tmp in columns[3:6]]
    plt.legend(legend)

    # 儲存圖檔
    plt.savefig("./2000-2017各産業生産總值折線圖.png")

    # 3、圖形展示
    plt.show()

def main():
    # 1、加載資料
    columns, values = build_data()
    print("columns:\n", columns)
    print("values:\n", values)
    # 2、資料可視化
    show_data(columns, values)

if __name__ == '__main__':
    main()
           

結果展示:

資料分析(三)matplotlib ---資料可視化庫matplotlib介紹一、繪圖基礎文法與常用參數二、繪制圖形

那麼我們如何在一個畫布中,繪制多個圖形呢?

  • 繪制子圖
  • 調整子圖間距

繪制下圖:

資料分析(三)matplotlib ---資料可視化庫matplotlib介紹一、繪圖基礎文法與常用參數二、繪制圖形

代碼實作:

import matplotlib.pyplot as plt
import numpy as np

def build_data():
    """加載資料"""
    res = np.load("./國民經濟核算季度資料.npz", allow_pickle=True)
    # for tmp in res:
    #     print(tmp)
    columns = res['columns']
    values = res['values']
    return columns, values

def show_data(columns, values):
    # 1、建立畫布
    # 傳回一個畫布對象
    fig = plt.figure(figsize=(12, 10), dpi=100)
    # 調整子圖間距
    # hspace ---上下子圖的高度差
    # wspace ---左右子圖的寬度差
    # 給定值為小數,意義為占 子圖的占比
    fig.subplots_adjust(hspace=0.3)
    # 修改RC參數,讓其支援中文
    plt.rcParams['font.sans-serif'] = 'SimHei'
    # 再去修改RC參數,讓其支援負号
    plt.rcParams['axes.unicode_minus'] = False

    # 2、繪圖
    # 2行1列第一個子圖
    # 參數1 繪制的子圖的行數
    # 參數2 繪制子圖的列數
    # 參數3 第幾個子圖
    fig.add_subplot(2, 1, 1)
    # 準備x軸和y軸資料
    x = np.arange(1, values.shape[0] + 1)
    # 第一産業總值
    y1 = values[:, 3]
    # 第二産業總值
    y2 = values[:, 4]
    # 第三産業總值
    y3 = values[:, 5]
    # 繪制折線圖
    # fmt = '[marker][line][color]'
    plt.plot(x, y1, 's-b')
    plt.plot(x, y2, 'o-.r')
    plt.plot(x, y3, 'o--g')

    # 圖形修飾
    # 增加标題
    plt.title("2000-2017年各産業季度生産總值折線圖")
    # 增加y軸名稱
    plt.ylabel("生産總值(億元)")
    # 修改x軸刻度
    # 用中文字元串替換序号
    xticks = values[:, 1]
    plt.xticks(x[::4], xticks[::4], rotation=45)
    # 增加圖例
    legend = [tmp[:4] for tmp in columns[3:6]]
    plt.legend(legend)

    # 繪制第2個子圖
    fig.add_subplot(2, 1, 2)
    # 準備x軸和y軸資料
    color_list = ['k','g','b','yellow','lime','m','c','peru','orangered']
    num = 0
    for i in range(6, 15):
        y = values[:, i]
        plt.plot(x, y, '%s' % color_list[num])
        num += 1


    # y1 = values[:, 6]
    # y2 = values[:, 7]
    # y3 = values[:, 8]
    # y4 = values[:, 9]
    # y5 = values[:, 10]
    # y6 = values[:, 11]
    # y7 = values[:, 12]
    # y8 = values[:, 13]
    # y9 = values[:, 14]
    # # 繪制圖形
    # plt.plot(x, y1)
    # plt.plot(x, y2)
    # plt.plot(x, y3)
    # plt.plot(x, y4)
    # plt.plot(x, y5)
    # plt.plot(x, y6)
    # plt.plot(x, y7)
    # plt.plot(x, y8)
    # plt.plot(x, y9)

    # y = values[:, 6:]
    # # 繪制圖形
    # # 折線圖繪制的時候,每一個x,拿出一列又一列分别的去繪制折線圖
    # plt.plot(x, y)


    # 增加x軸名稱
    plt.xlabel("年份")
    # 增加y軸名稱
    plt.ylabel("生産總值(億元)")
    # 修改x軸刻度
    # 用中文字元串替換序号
    xticks = values[:, 1]
    plt.xticks(x[::4], xticks[::4], rotation=45)
    # 增加圖例
    legend = [tmp[:2] for tmp in columns[6:]]
    plt.legend(legend)

    # 儲存圖檔
    plt.savefig("./2000-2017各産業、行業生産總值折線圖.png")

    # 3、圖形展示
    plt.show()

def main():
    # 1、加載資料
    columns, values = build_data()
    print("columns:\n", columns)
    print("values:\n", values)
    # 2、資料可視化
    show_data(columns, values)
    # 3、結論
    # xxxxxxxxx

if __name__ == '__main__':
    main()
           
  • 應用場景

檢視資料的發展趨勢、變化、走勢

如:遊戲的線上人數在每天不同的時間段的變化趨勢

如:某公司上線的産品在不同的時間段的人數變化

2、散點圖(scatter)

常用參數及說明如下表所示:

參數名稱 說明
x , y 接收 array。表示 x軸和 y 軸對應的資料。
s 指定點的大小,可以傳單個大小,也可以傳 array_like。
c 指定點的顔色,可以傳單個顔色,也可以傳 array_like
marker 點的形狀。隻能傳入單個形狀,不能傳入 array_like

任務實作:

資料分析(三)matplotlib ---資料可視化庫matplotlib介紹一、繪圖基礎文法與常用參數二、繪制圖形

代碼實作:

import matplotlib.pyplot as plt
import numpy as np

def build_data():
    """加載資料"""
    res = np.load("./國民經濟核算季度資料.npz", allow_pickle=True)
    # for tmp in res:
    #     print(tmp)
    columns = res['columns']
    values = res['values']
    return columns, values

def show_data(columns, values):
    """資料可視化"""
    # 1、建立畫布
    plt.figure(figsize=(10, 8), dpi=100)
    # 修改RC參數,讓其支援中文
    plt.rcParams['font.sans-serif'] = 'SimHei'
    # 再去修改RC參數,讓其支援負号
    plt.rcParams['axes.unicode_minus'] = False

    # 2、繪圖
    # 建構橫縱坐标資料
    x = np.arange(values.shape[0])
    y1 = values[:,3]
    y2 = values[:,4]
    y3 = values[:,5]
    # 繪制散點圖
    plt.scatter(x, y1, c='r', marker="o")
    plt.scatter(x, y2, c='b', marker='s')
    plt.scatter(x, y3, c='yellow', marker='v')

    # 圖形修飾
    plt.title("2000-2017年各産業季度生産總值散點圖")
    plt.ylabel("生産總值(億元)")
    xticks = values[:,1]
    plt.xticks(x[::4], xticks[::4], rotation=45)
    legend = [tmp[:4] for tmp in columns[3:6]]
    plt.legend(legend)
    # 儲存圖檔
    plt.savefig("./2000-2017年各産業季度生産總值散點圖.png")

    # 3、圖形展示
    plt.show()

def main():
    # 1、加載資料
    columns, values = build_data()
    print("columns:\n", columns)
    print("values:\n", values)
    # 2、資料可視化
    show_data(columns, values)
    # 3、結論

if __name__ == '__main__':
    main()
           
  • 應用場景
  1. 類似于折線圖的這種散點圖,可以用來觀察資料的走勢
  2. 一堆一堆的散點圖,可以用來檢視資料的緊密聯系程度
  3. 也可以用來對比不同的類别—(一般不用)

3、直方圖與柱狀圖的差別

直方圖:

  • 由緊密結合的多個柱子組成
  • 橫軸為資料的分布範圍區間
  • 縱軸為資料落在各個區間内的數量
  • 一般用于檢視資料的分布範圍
  • 應用于大量資料的場景

柱狀圖:

  • 由多個分開的柱子組成
  • 橫軸一般為資料的各個類别
  • 縱軸為各個類别所對應的數量
  • 一般用于各個類别之間的對比
  • 一般用于少量資料類别的對比

4、柱狀圖(bar)

常用參數及說明如下表所示:

參數名稱 說明
left 接收 array。表示 x 軸資料。
height 接收 array。表示 x 所代表資料的數量。
width 接收 0-1 之間的 float。指定直方圖寬度。預設為 0.8.
color 接收特定 string 或者包含顔色字元串的 array。 表示直方圖顔色。預設為 None。

任務實作:

資料分析(三)matplotlib ---資料可視化庫matplotlib介紹一、繪圖基礎文法與常用參數二、繪制圖形

代碼實作:

import matplotlib.pyplot as plt
import numpy as np

def build_data():
    """加載資料"""
    res = np.load("./國民經濟核算季度資料.npz", allow_pickle=True)
    columns = res['columns']
    values = res['values']
    return columns, values

def show_data(columns, values):
    """資料可視化"""
    # 1、建立畫布
    plt.figure()
    # 修改RC參數,讓其支援中文
    plt.rcParams['font.sans-serif'] = 'SimHei'
    # 再去修改RC參數,讓其支援負号
    plt.rcParams['axes.unicode_minus'] = False
    
    # 2、繪圖
    # 橫軸--第一産業、第二産業、第三産業
    x = np.arange(3)
    # 縱軸--各個産業--在2000年的值
    y = values[0,3:6] / 1000
    
    # 繪制柱狀圖
    # width ---柱子的寬度
    # color--可以給定一個具體的顔色,也可以給一個顔色 array_like
    plt.bar(x, y, width=0.3, color=['r', 'g', 'b'])
    
    # 圖形修飾
    plt.title("2000年第一季度國民生產毛額産業構成分布柱狀圖") # 增加标題
    plt.xlabel("産業") # 橫軸名稱
    plt.ylabel("生産總值(千億元)") # 縱軸名稱
    # 修改橫軸刻度
    xticks = [tmp[:4] for tmp in columns[3:6]]
    plt.xticks(x, xticks)
    
    # 進行标注
    for i,j in zip(x, y):
        plt.text(i, j + 0.1, "%.2f千億元" % j, horizontalalignment='center')
    
    # 柱狀圖不需要增加圖例
    # 儲存圖檔
    plt.savefig("./2000年第一季度國民生產毛額産業構成分布柱狀圖.png")
    
    # 3、圖形展示
    plt.show()

def main():
    # 1、加載資料
    columns, values = build_data()
    print("columns:\n", columns)
    print("values:\n", values)
    # 2、資料可視化
    # 3、結論

if __name__ == '__main__':
    main()
           

5、直方圖(hist)

import matplotlib.pyplot as plt
import numpy as np

# 1、建立畫布
plt.figure()
# 2、繪制圖形
# 繪制某班同學身高分布情況 ---30位同學
high = np.random.uniform(low=140, high=190, size=30)
# print("high:\n", high)
# 将身高保留一位小數
high = np.array([float("%.1f" % i) for i in high])
print("high:\n", high)

# 繪制直方圖
# 預設分組
# plt.hist(high, bins=5)
# 自定義分組
# bins = [140, 150, 160, 170, 180, 190]
# plt.hist(high, bins)

# 按照資料進行自定義等寬分組
# (1)确定分組個數
group_num = 5
# (2)确定每一組的步長
# 确定最大值
max_high = np.max(high)
# 确定最小值
min_high = np.min(high)
# 确定最大值與最小值的差距 ---極差
ptp = max_high - min_high
# 确定步長
step = np.ceil(ptp / group_num)
# (3)确定bins
bins = np.arange(min_high, max_high + step, step)

print("max_high:\n", max_high)
print("min_high:\n", min_high)
print("bins:\n", bins)

# 繪制直方圖
plt.hist(high, bins=bins, color="b", edgecolor="k")

# 設定刻度
plt.xticks(bins)

yticks = np.arange(11)
plt.yticks(yticks)

# 不能标注
# 增加網格線
plt.grid(b=True, axis="y")

# 直方圖不能增加圖例


# 3、圖形展示
plt.show()
           

結果展示:

資料分析(三)matplotlib ---資料可視化庫matplotlib介紹一、繪圖基礎文法與常用參數二、繪制圖形

6、餅圖(pie)

餅圖 ----将各部分全部繪制在同一個餅中,可以展現出各部分的占比。

  • 應用場景:
    • 對比各部分的占比情況
    • 也可以對比部分與整體的關系
import matplotlib.pyplot as plt
import numpy as np

def build_data():
    """加載資料"""
    res = np.load("./國民經濟核算季度資料.npz", allow_pickle=True)
    columns = res['columns']
    values = res['values']
    return columns, values

def show_data():
    """資料可視化"""
    # 1、建立畫布
    plt.figure()
    # 2、繪制圖形
    # 建構繪制餅圖的資料
    x = values[-1, 3:6]
    
    # explode ---表示各部分距離圓心的半徑 ---也可以了解為 各部分之間的間隙
    explode = (0.01, 0.02, 0.01) # 占半徑的占比
    
    # labels ---每一項的名稱
    labes = [tmp[:4] for tmp in columns[3:6]]
    
    # colors --- 設定顔色
    colors = ["r", "g", "b"]
    
    # autopct ---用來顯示各部分占比
    autopct = "%.1f%%"
    
    # pctdistance ---控制着标注的位置,預設為距離圓心0.6個半徑的位置
    pctdistance = 0.6
    
    # labeldistance ---控制着名稱的位置,預設為距離圓心1.1個半徑的位置
    labeldistance = 1.1
    
    # radius ---表示餅圖的半徑
    radius = 1.0
    
    # 繪制餅圖
    plt.pie(x, explode=explode, labels=labels, colors=colors, autopct=autopct, pctdistance=pctdistance, labeldistance=labeldistance, radius=radius)
    
    # 将餅圖由橢圓 變為圓形
    # 橢圓裡面 有個長軸、短軸 ---> 長軸=短軸 --->圓
    plt.axis('equal')
    
    # 增加标題
    plt.title("2017年各個産業的增加總值占比情況")
    # 設定圖例
    plt.legend(labels)
    
    # 儲存圖檔
    plt.savefig("./2017年各個産業的增加總值占比情況.png")
    
    # 3、圖形展示
    plt.show()

def main():
    # 1、加載資料
    columns, values = build_data()
    print("columns:\n", columns)
    print("values:\n", values)
    # 2、資料可視化
    show_data(columns, values)

if __name__ == '__main__':
    main()
           

結果展示:

資料分析(三)matplotlib ---資料可視化庫matplotlib介紹一、繪圖基礎文法與常用參數二、繪制圖形

7、箱線圖(boxplot)

箱線圖 —利用最小值、下四分位數、中位數、上四分位數、最大值來進行描述資料。

應用場景:

  • 可以用來檢視資料的是否對稱、離散、分布
  • 借助箱線圖分析剔除異常值(遠離正常範圍的錯誤的值)
import matplotlib.pyplot as plt
import numpy as np

def build_data():
    """加載資料"""
    res = np.load("./國民經濟核算季度資料.npz", allow_pickle=True)
    columns = res['columns']
    values = res['values']
    return columns, values

def show_data(columns, values):
    """資料可視化"""
    # 1、建立畫布
    plt.figure()
    # 2、繪制圖形
    x = values[:,3:6]
    
    # notch ---是否有缺口
    # meanline=True, showmeans=True 同時使用,才能在箱線圖上顯示出均值
    # vert=False ---繪制水準的箱子
    # labels 名稱
    labels = [tmp[:4] for tmp in columns[3:6]]
    
    # 繪制箱線圖
    plt.boxplot(x, notch=True, meanline=True, showmeans=True, labels=labels)
    # 3、圖形展示
    plt.show()

def main():
    # 1、加載資料
    columns, values = build_data()
    print("columns:\n", columns)
    print("values:\n", values)

if __name__ == '__main__':
    main()
           

結果實作:

資料分析(三)matplotlib ---資料可視化庫matplotlib介紹一、繪圖基礎文法與常用參數二、繪制圖形