Matplotlib基礎繪圖功能

流楚丶格念發表於2020-10-23

一、Matplotlib之HelloWorld

1 什麼是Matplotlib

matplotlib是專門用於開發2D圖表(包括3D圖表)以漸進、互動式方式實現資料視覺化。

2 為什麼要學習Matplotlib

視覺化是在整個資料探勘的關鍵輔助工具,可以清晰的理解資料,從而調整我們的分析方法。

能將資料進行視覺化,更直觀的呈現
使資料更加客觀、更具說服力
例如下面兩個圖為數字展示和圖形展示:
在這裡插入圖片描述

3 實現一個簡單的Matplotlib畫圖 — 以折線圖為例

3.1 matplotlib.pyplot模組

matplotlib.pytplot包含了一系列類似於matlab的畫圖函式。

import matplotlib.pyplot as plt

3.2 圖形繪製流程:

  1. 建立畫布 – plt.figure()
plt.figure(figsize=(), dpi=)
    figsize:指定圖的長寬
    dpi:影像的清晰度
    返回fig物件

2.繪製影像 – plt.plot(x, y)

以折線圖為例

3.顯示影像 – plt.show()

3.3 折線圖繪製與顯示

舉例:展現上海一週的天氣,比如從星期一到星期日的天氣溫度如下

import matplotlib.pyplot as plt

# 1.建立畫布
plt.figure(figsize=(10, 10), dpi=100)

# 2.繪製折線圖
plt.plot([1, 2, 3, 4, 5, 6 ,7], [17,17,18,15,11,11,13])

# 3.顯示影像
plt.show()

折線圖
折線圖

4 認識Matplotlib影像結構(瞭解)

在這裡插入圖片描述

二、基礎繪圖功能 — 以折線圖為例

1 完善原始折線圖 — 給圖形新增輔助功能

為了更好地理解所有基礎繪圖功能,我們通過天氣溫度變化的繪圖來融合所有的基礎API使用

需求:畫出某城市11點到12點1小時內每分鐘的溫度變化折線圖,溫度範圍在15度~18度

效果:
在這裡插入圖片描述

1.1 準備資料並畫出初始折線圖

import matplotlib.pyplot as plt
import random
# 畫出溫度變化圖

# 0.準備x, y座標的資料
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]

# 1.建立畫布
plt.figure(figsize=(20, 8), dpi=80)

# 2.繪製折線圖
plt.plot(x, y_shanghai)

# 3.顯示影像
plt.show()

在這裡插入圖片描述

1.2 新增自定義x,y刻度

  • plt.xticks(x, **kwargs)
    x:要顯示的刻度值

  • plt.yticks(y, **kwargs)
    y:要顯示的刻度值

# 剛才的程式碼增加以下兩行

# 構造x軸刻度標籤
x_ticks_label = ["11點{}分".format(i) for i in x]
# 構造y軸刻度
y_ticks = range(40)

# 修改x,y軸座標的刻度顯示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])

在這裡插入圖片描述

如果沒有解決過中文問題的話,會顯示這個樣子:
解決方案:https://yangyongli.blog.csdn.net/article/details/109232609

1.4 新增網格顯示

為了更加清楚地觀察圖形對應的值

plt.grid(True, linestyle='--', alpha=0.5)

在這裡插入圖片描述

1.5 新增描述資訊

新增x軸、y軸描述資訊及標題

通過fontsize引數可以修改影像中字型的大小


plt.xlabel("時間")
plt.ylabel("溫度")
plt.title("中午11點0分到12點之間的溫度變化圖示", fontsize=20)

在這裡插入圖片描述

1.6 影像儲存

# 儲存圖片到指定路徑
plt.savefig("test.png")

注意:plt.show()會釋放figure資源,如果在顯示影像之後儲存圖片將只能儲存空圖片。
完整程式碼:

import matplotlib.pyplot as plt
import random
from pylab import mpl

# 設定顯示中文字型
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 設定正常顯示符號
mpl.rcParams["axes.unicode_minus"] = False

# 0.準備資料
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]

# 1.建立畫布
plt.figure(figsize=(20, 8), dpi=100)

# 2.繪製影像
plt.plot(x, y_shanghai)

# 2.1 新增x,y軸刻度
# 構造x,y軸刻度標籤
x_ticks_label = ["11點{}分".format(i) for i in x]
y_ticks = range(40)

# 刻度顯示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])

# 2.2 新增網格顯示
plt.grid(True, linestyle="--", alpha=0.5)

# 2.3 新增描述資訊
plt.xlabel("時間")
plt.ylabel("溫度")
plt.title("中午11點--12點某城市溫度變化圖", fontsize=20)

# 2.4 影像儲存
plt.savefig("./test.png")

# 3.影像顯示
plt.show()

2 在一個座標系中繪製多個影像

2.1 多次plot

需求:再新增一個城市的溫度變化

收集到北京當天溫度變化情況,溫度在1度到3度。怎麼去新增另一個在同一座標系當中的不同圖形,其實很簡單隻需要再次plot即可,但是需要區分線條,如下顯示

在這裡插入圖片描述


# 增加北京的溫度資料
y_beijing = [random.uniform(1, 3) for i in x]

# 繪製折線圖
plt.plot(x, y_shanghai)
# 使用多次plot可以畫多個折線
plt.plot(x, y_beijing, color='r', linestyle='--')
我們仔細觀察,用到了兩個新的地方,一個是對於不同的折線展示效果,一個是新增圖例。

2.2 設定圖形風格

在這裡插入圖片描述

2.3 顯示圖例

注意:如果只在plt.plot()中設定label還不能最終顯示出圖例,還需要通過plt.legend()將圖例顯示出來。

# 繪製折線圖
plt.plot(x, y_shanghai, label="上海")
# 使用多次plot可以畫多個折線
plt.plot(x, y_beijing, color='r', linestyle='--', label="北京")

# 顯示圖例
plt.legend(loc="best")
Location String	Location Code


在這裡插入圖片描述

完整程式碼:

# 0.準備資料
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1,3) for i in x]

# 1.建立畫布
plt.figure(figsize=(20, 8), dpi=100)

# 2.繪製影像
plt.plot(x, y_shanghai, label="上海")
plt.plot(x, y_beijing, color="r", linestyle="--", label="北京")

# 2.1 新增x,y軸刻度
# 構造x,y軸刻度標籤
x_ticks_label = ["11點{}分".format(i) for i in x]
y_ticks = range(40)

# 刻度顯示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])

# 2.2 新增網格顯示
plt.grid(True, linestyle="--", alpha=0.5)

# 2.3 新增描述資訊
plt.xlabel("時間")
plt.ylabel("溫度")
plt.title("中午11點--12點某城市溫度變化圖", fontsize=20)

# 2.4 影像儲存
plt.savefig("./test.png")

# 2.5 新增圖例
plt.legend(loc=0)


# 3.影像顯示
plt.show()

3 多個座標系顯示— plt.subplots(物件導向的畫圖方法)

如果我們想要將上海和北京的天氣圖顯示在同一個圖的不同座標系當中,效果如下:
在這裡插入圖片描述

可以通過subplots函式實現(舊的版本中有subplot,使用起來不方便),推薦subplots函式

  • matplotlib.pyplot.subplots(nrows=1, ncols=1, **fig_kw) 建立一個帶有多個axes(座標系/繪圖區)的圖

      Parameters:    
      
      nrows, ncols : 設定有幾行幾列座標系
          int, optional, default: 1, Number of rows/columns of the subplot grid.
      
      Returns:    
      fig : 圖物件
      axes : 返回相應數量的座標系
      
      設定標題等方法不同:
          set_xticks
          set_yticks
          set_xlabel
          set_ylabel
    

關於axes子座標系的更多方法:參考https://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes

  • 注意:plt.函式名()相當於程式導向的畫圖方法,axes.set_方法名()相當於物件導向的畫圖方法。

# 0.準備資料
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1, 5) for i in x]

# 1.建立畫布
# plt.figure(figsize=(20, 8), dpi=100)
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100)


# 2.繪製影像
# plt.plot(x, y_shanghai, label="上海")
# plt.plot(x, y_beijing, color="r", linestyle="--", label="北京")
axes[0].plot(x, y_shanghai, label="上海")
axes[1].plot(x, y_beijing, color="r", linestyle="--", label="北京")

# 2.1 新增x,y軸刻度
# 構造x,y軸刻度標籤
x_ticks_label = ["11點{}分".format(i) for i in x]
y_ticks = range(40)

# 刻度顯示
# plt.xticks(x[::5], x_ticks_label[::5])
# plt.yticks(y_ticks[::5])
axes[0].set_xticks(x[::5])
axes[0].set_yticks(y_ticks[::5])
axes[0].set_xticklabels(x_ticks_label[::5])
axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_ticks[::5])
axes[1].set_xticklabels(x_ticks_label[::5])

# 2.2 新增網格顯示
# plt.grid(True, linestyle="--", alpha=0.5)
axes[0].grid(True, linestyle="--", alpha=0.5)
axes[1].grid(True, linestyle="--", alpha=0.5)

# 2.3 新增描述資訊
# plt.xlabel("時間")
# plt.ylabel("溫度")
# plt.title("中午11點--12點某城市溫度變化圖", fontsize=20)
axes[0].set_xlabel("時間")
axes[0].set_ylabel("溫度")
axes[0].set_title("中午11點--12點某城市溫度變化圖", fontsize=20)
axes[1].set_xlabel("時間")
axes[1].set_ylabel("溫度")
axes[1].set_title("中午11點--12點某城市溫度變化圖", fontsize=20)

# # 2.4 影像儲存
plt.savefig("./test.png")

# # 2.5 新增圖例
# plt.legend(loc=0)
axes[0].legend(loc=0)
axes[1].legend(loc=0)


# 3.影像顯示
plt.show()

4 折線圖的應用場景

呈現公司產品(不同區域)每天活躍使用者數

呈現app每天下載數量

呈現產品新功能上線後,使用者點選次數隨時間的變化

擴充:畫各種數學函式影像

注意:plt.plot()除了可以畫折線圖,也可以用於畫各種數學函式影像
在這裡插入圖片描述

程式碼:


import numpy as np
# 0.準備資料
x = np.linspace(-10, 10, 1000)
y = np.sin(x)

# 1.建立畫布
plt.figure(figsize=(20, 8), dpi=100)

# 2.繪製函式影像
plt.plot(x, y)
# 2.1 新增網格顯示
plt.grid()

# 3.顯示影像
plt.show()

相關文章