Python 數據分析三劍客之 Matplotlib(八):等高線 / 等值線圖的繪製

CSDN 課程推薦:《Python 數據分析與挖掘》,講師劉順祥,浙江工商大學統計學碩士,數據分析師,曾擔任唯品會大數據部擔任數據分析師一職,負責支付環節的數據分析業務。曾與聯想、亨氏、網魚網咖等企業合作多個企業級項目。


Matplotlib 系列文章:


另有 NumPy、Pandas 系列文章已更新完畢,歡迎關注:


推薦學習資料與網站(博主參與部分文檔翻譯):



這裏是一段防爬蟲文本,請讀者忽略。
本文原創首發於 CSDN,作者 TRHX。
博客首頁:https://itrhx.blog.csdn.net/
本文鏈接:https://itrhx.blog.csdn.net/article/details/106066852
未經授權,禁止轉載!惡意轉載,後果自負!尊重原創,遠離剽竊!

【1x00】等高線概念

參考百度百科,等高線概念總結如下:等高線指的是地形圖上高程相等的相鄰各點所連成的閉合曲線。把地面上海拔高度相同的點連成的閉合曲線,並垂直投影到一個水平面上,並按比例縮繪在圖紙上,就得到等高線。等高線也可以看作是不同海拔高度的水平面與實際地面的交線,所以等高線是閉合曲線。在等高線上標註的數字爲該等高線的海拔。

  • 位於同一等高線上的地面點,海拔高度相同。但海拔高度相同的點不一定位於同一條等高線上;
  • 在同一幅圖內,除了陡崖以外,不同高程的等高線不能相交;
  • 在圖廓內相鄰等高線的高差一般是相同的,因此地面坡度與等高線之間的等高線平距成反比,等高線平距愈小,等高線排列越密,說明地面坡度越大;等高線平距愈大,等高線排列越稀,則說明地面坡度愈小;
  • 等高線是一條閉合的曲線,如果不能在同一幅內閉合,則必在相鄰或者其他圖幅內閉合。
  • 等高線經過山脊或山谷時改變方向,因此,山脊線或者山谷線應垂直於等高線轉折點處的切線,即等高線與山脊線或者山谷線正交。

在 Matplotlib 等高線的繪製中,需要傳遞三個基本參數:某個點的 x、y 軸座標以及其高度。

01

02

【2x00】理解 numpy.meshgrid()

numpy.meshgrid() 方法用於生成網格點座標矩陣。

import numpy as np

a = np.array([1, 2, 3])
b = np.array([7, 8, 9])
res = np.meshgrid(a, b)
print(res)

輸出結果:

[array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]]),
 array([[7, 7, 7],
       [8, 8, 8],
       [9, 9, 9]])]

給定兩個數組,a[1, 2, 3]b[7, 8, 9],a 作爲 x 軸數據,b 作爲 y 軸數據,那麼一共可以繪製出 9 個點: (1,7)、(1,8)、(1,9)、(2,7)、(2,8)、(2,9)、(3,7)、(3,8)、(3,9),而 numpy.meshgrid() 方法就是起這樣的作用,返回的兩個二維數組,橫座標矩陣 a 中的每個元素,與縱座標矩陣 b 中對應位置元素,共同構成一個點的完整座標。

因爲在 matplotlib.pyplot.contour() 等高線繪製函數中接收的是二維座標信息,所以在繪製等高線圖之前要將原數據經過 numpy.meshgrid() 方法處理,也可以自己構建類似於上述的二維數組。

分割線

【3x00】繪製方法 matplotlib.pyplot.contour()

matplotlib.pyplot.contour() 方法可用於繪製等高線圖。

基本語法:matplotlib.pyplot.contour(\*args, data=None, \*\*kwargs)

通用格式:matplotlib.pyplot.contour([X, Y,] Z, [levels], **kwargs)

基本參數:

參數 描述
X, Y 數組形式的點的 x 和 y 軸座標,兩者都必須是二維的,形狀與 Z 相同
Z 繪製輪廓的高度值,二維數組,每個元素是其對應點的高度
levels 確定等高線的數目和位置,如果是整數 N,則使用 N 個數據間隔,即繪製 N+1 條等高線
如果是數組形式,則繪製指定的等高線。值必須按遞增順序排列

其他參數:

參數 描述
colors 等高線的顏色,顏色字符串或顏色序列
cmap 等高線的顏色,字符串或者 Colormap
通常包含一系列的漸變色或其他顏色組合,取值參見【6x00】Colormap 取值
alpha 透明度,介於0(透明)和1(不透明)之間
origin 通過指定 Z[0,0] 的位置來確定 Z 的方向和確切位置,僅當未指定 X, Y 時纔有意義
None:Z[0,0] 位於左下角的 X=0, Y=0 處
'lower':Z [0, 0] 位於左下角的 X = 0.5, Y = 0.5 處
'upper':Z[0,0] 位於左上角的 X=N+0.5, Y=0.5 處
'image':使用 rcParams[“image.origin”] = 'upper'的值
antialiased 是否啓用抗鋸齒渲染,默認 True
linewidths 等高線的線寬,如果是數字,則所有等高線都將使用此線寬
如果是序列,則將按指定的順序以升序打印線寬
默認爲 rcParams[“lines.linewidth”] = 1.5
linestyles 等高線的樣式,如果線條顏色爲單色,則負等高線默認爲虛線
'-' or 'solid', '--' or 'dashed', '-.' or 'dashdot' ':' or 'dotted', 'none' or ' ' or ''

分割線

【4x00】填充方法 matplotlib.pyplot.contourf()

matplotlib.pyplot.contourf() 方法與 matplotlib.pyplot.contour() 的區別在於:contourf() 會對等高線間的區域進行顏色填充(filled contours)。除此之外兩者的函數簽名和返回值都相同。

基本語法:matplotlib.pyplot.contourf(\*args, data=None, \*\*kwargs)

通用格式:matplotlib.pyplot.contour([X, Y,] Z, [levels], **kwargs)

基本參數:

參數 描述
X, Y 數組形式的點的 x 和 y 軸座標,兩者都必須是二維的,形狀與 Z 相同
Z 繪製輪廓的高度值,二維數組,每個元素是其對應點的高度
levels 確定等高線的數目和位置,如果是整數 N,則使用 N 個數據間隔,即繪製 N+1 條等高線
如果是數組形式,則繪製指定的等高線。值必須按遞增順序排列

其他參數:

參數 描述
colors 等高線的填充顏色,顏色字符串或顏色序列
cmap 等高線的填充顏色,字符串或者 Colormap
通常包含一系列的漸變色或其他顏色組合,取值參見【6x00】Colormap 取值
alpha 透明度,介於0(透明)和1(不透明)之間
origin 通過指定 Z[0,0] 的位置來確定 Z 的方向和確切位置,僅當未指定 X, Y 時纔有意義
None:Z[0,0] 位於左下角的 X=0, Y=0 處
'lower':Z [0, 0] 位於左下角的 X = 0.5, Y = 0.5 處
'upper':Z[0,0] 位於左上角的 X=N+0.5, Y=0.5 處
'image':使用 rcParams[“image.origin”] = 'upper'的值
antialiased 是否啓用抗鋸齒渲染,默認 True
linewidths 等高線的線寬,如果是數字,則所有等高線都將使用此線寬
如果是序列,則將按指定的順序以升序打印線寬
默認爲 rcParams[“lines.linewidth”] = 1.5
linestyles 等高線的樣式,如果線條顏色爲單色,則負等高線默認爲虛線
'-' or 'solid', '--' or 'dashed', '-.' or 'dashdot' ':' or 'dotted', 'none' or ' ' or ''

分割線

【5x00】標記方法 matplotlib.pyplot.clabel()

matplotlib.pyplot.clabel(CS, \*args, \*\*kwargs) 方法可用於標記等高線圖。

參數 描述
CS ContourSet(等高線集)對象,即 pyplot.contour() 返回的對象
levels 需要標記的等高線集,數組類型,如果未指定則默認標記所有等高線
fontsize 標記的字體大小,可選項:
'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'
colors 標記的顏色,顏色字符串或顏色序列
inline 是否在標籤位置移除輪廓顯示,bool 類型,默認 True
inline_spacing 標籤位置移除輪廓的寬度,float 類型,默認爲 5
fmt 標籤的格式字符串。str 或 dict 類型,默認值爲 %1.3f
rightside_up 是否將標籤旋轉始終與水平面成正負90度,bool 類型,默認 True
use_clabeltext 默認爲 False,如果爲 True,則使用 ClabelText 類(而不是 Text)創建標籤
ClabelText 在繪圖期間重新計算文本的旋轉角度,如果軸的角度發生變化,則可以使用此功能

分割線


這裏是一段防爬蟲文本,請讀者忽略。
本文原創首發於 CSDN,作者 TRHX。
博客首頁:https://itrhx.blog.csdn.net/
本文鏈接:https://itrhx.blog.csdn.net/article/details/106066852
未經授權,禁止轉載!惡意轉載,後果自負!尊重原創,遠離剽竊!

【6x00】Colormap 取值

matplotlib.pyplot.contour()matplotlib.pyplot.contourf()cmap 參數用於設置等高線的顏色,取值通常爲 Colormap 中的值,通常包含一系列的漸變色或其他顏色組合。具體參加下圖。

官方文檔:https://matplotlib.org/tutorials/colors/colormaps.html

03

分割線

【7x00】簡單示例

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

x = np.arange(-2.0, 2.0, 0.01)
y = np.arange(-2.0, 2.0, 0.01)
m, n = np.meshgrid(x, y)        # 生成網格點座標矩陣


# 指定一個函數用於計算每個點的高度,也可以直接使用二維數組儲存每個點的高度
def f(a, b):
    return (1 - b ** 5 + a ** 5) * np.exp(-a ** 2 - b ** 2)


# 繪製等高線圖,8 個數據間隔,顏色爲黑色
plt.contour(m, n, f(m, n), 8, colors='k')
plt.title('等高線圖簡單示例')
plt.xlabel('x axis label')
plt.ylabel('y axis label')

plt.show()

03

分割線

【8x00】添加標記

matplotlib.pyplot.clabel() 方法用於給等高線添加標記。

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

x = np.arange(-2.0, 2.0, 0.01)
y = np.arange(-2.0, 2.0, 0.01)
m, n = np.meshgrid(x, y)        # 生成網格點座標矩陣


# 指定一個函數用於計算每個點的高度,也可以直接使用二維數組儲存每個點的高度
def f(a, b):
    return (1 - b ** 5 + a ** 5) * np.exp(-a ** 2 - b ** 2)


# 繪製等高線圖,8 個數據間隔,顏色爲黑色
C = plt.contour(m, n, f(m, n), 8, colors='k')
# 添加標記,標記處不顯示輪廓線,顏色爲黑紅綠藍四種,保留兩位小數
plt.clabel(C, inline=True, colors=['k', 'r', 'g', 'b'], fmt='%1.2f')
plt.title('等高線圖添加標記示例')
plt.xlabel('x axis label')
plt.ylabel('y axis label')

plt.show()

04

分割線

【9x00】輪廓線顏色和樣式

matplotlib.pyplot.contour() 方法中,colors 參數即可爲等高線輪廓設置顏色,可以是單色,也可以是一個顏色列表,linestyles 參數可以設置輪廓線樣式,注意,如果線條顏色爲單色,則負等高線(高度值爲負)默認爲虛線。

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

x = np.arange(-2.0, 2.0, 0.01)
y = np.arange(-2.0, 2.0, 0.01)
m, n = np.meshgrid(x, y)        # 生成網格點座標矩陣


# 指定一個函數用於計算每個點的高度,也可以直接使用二維數組儲存每個點的高度
def f(a, b):
    return (1 - b ** 5 + a ** 5) * np.exp(-a ** 2 - b ** 2)


colors = ['k', 'r', 'g', 'b']
# 繪製等高線圖,8 個數據間隔,顏色爲黑色,線條樣式爲 --
C = plt.contour(m, n, f(m, n), 8, colors=colors, linestyles='--')
# 添加標記,標記處不顯示輪廓線,顏色爲黑紅綠藍四種,保留兩位小數
plt.clabel(C, inline=True, colors=colors, fmt='%1.2f')
plt.title('等高線圖設置顏色/樣式示例')
plt.xlabel('x axis label')
plt.ylabel('y axis label')

plt.show()

05

如果想啓用漸變色,則可以設置 cmap,取值參見【6x00】Colormap 取值colorbar() 方法可以顯示顏色對照條。

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

x = np.arange(-2.0, 2.0, 0.01)
y = np.arange(-2.0, 2.0, 0.01)
m, n = np.meshgrid(x, y)        # 生成網格點座標矩陣


# 指定一個函數用於計算每個點的高度,也可以直接使用二維數組儲存每個點的高度
def f(a, b):
    return (1 - b ** 5 + a ** 5) * np.exp(-a ** 2 - b ** 2)


# 繪製等高線圖,8 個數據間隔,顏色爲 plasma
C = plt.contour(m, n, f(m, n), 8, cmap='plasma')
# 添加標記,標記處不顯示輪廓線,顏色爲黑色,保留兩位小數
plt.clabel(C, inline=True, colors='k', fmt='%1.2f')
# 顯示顏色條
plt.colorbar()
plt.title('等高線圖設置漸變色示例')
plt.xlabel('x axis label')
plt.ylabel('y axis label')

plt.show()

07

分割線

【10x00】顏色填充

matplotlib.pyplot.contourf() 方法用於對等高線之間的地方進行顏色填充。

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

x = np.arange(-2.0, 2.0, 0.01)
y = np.arange(-2.0, 2.0, 0.01)
m, n = np.meshgrid(x, y)        # 生成網格點座標矩陣


# 指定一個函數用於計算每個點的高度,也可以直接使用二維數組儲存每個點的高度
def f(a, b):
    return (1 - b ** 5 + a ** 5) * np.exp(-a ** 2 - b ** 2)


# 繪製等高線圖,8 個數據間隔,顏色爲 plasma
plt.contourf(m, n, f(m, n), 8, cmap='plasma')
C = plt.contour(m, n, f(m, n), 8, cmap='plasma')
# 添加標記,標記處不顯示輪廓線,顏色爲黑色,保留兩位小數
plt.clabel(C, inline=True, colors='k', fmt='%1.2f')
# 顯示顏色條
plt.colorbar()
plt.title('等高線圖顏色填充示例')
plt.xlabel('x axis label')
plt.ylabel('y axis label')

plt.show()

08


這裏是一段防爬蟲文本,請讀者忽略。
本文原創首發於 CSDN,作者 TRHX。
博客首頁:https://itrhx.blog.csdn.net/
本文鏈接:https://itrhx.blog.csdn.net/article/details/106066852
未經授權,禁止轉載!惡意轉載,後果自負!尊重原創,遠離剽竊!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章