鋒哥原創的Matplotlib3 Python數據可視化視頻教程:
2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili
課程介紹
本課程講解利用python進行數據可視化 科研繪圖-Matplotlib,學習Matplotlib圖形參數基本設置,繪圖參數及主要函數,以及Matplotlib基礎繪圖,和Matplotlib高級繪圖。
繪制誤差條形圖
誤差條形圖是數據可視化中展示數據不確定性或變異性的重要工具。Matplotlib提供了強大的功能來創建各種類型的誤差條形圖,包括對稱誤差、非對稱誤差、水平誤差條等。
plt.errorbar()
是 Matplotlib 中用于繪制帶誤差線的數據點的核心函數,常用于科學可視化中展示數據的不確定性。以下是該方法的詳細解析:
plt.errorbar(x, y, yerr=None, xerr=None, fmt='', ecolor=None, elinewidth=None, capsize=None, barsabove=False, lolims=False, uplims=False, xlolims=False, xuplims=False, errorevery=1, capthick=None, **kwargs)
必需參數
參數 | 類型 | 說明 |
---|---|---|
x | array | 數據點的 x 坐標值 |
y | array | 數據點的 y 坐標值 |
🔍 誤差線控制參數
-
誤差方向
參數 | 默認值 | 說明 |
---|---|---|
yerr | None | y方向的誤差值,支持多種格式: - 標量:所有點使用相同誤差值 - 一維數組:每個點單獨誤差值 - 2xN數組:[下誤差, 上誤差] |
xerr | None | x方向的誤差值(格式同yerr ) |
-
誤差線樣式
參數 | 默認值 | 說明 |
---|---|---|
fmt | '' | 數據點標記格式(同plt.plot() 格式) 例如:'o-' (圓點連線),'s--' (方形虛線) |
ecolor | None | 誤差線顏色(默認與數據點相同) |
elinewidth | None | 誤差線寬度(默認1.5) |
capsize | None | 誤差線端帽長度(單位:點) |
capthick | None | 誤差線端帽厚度(默認同誤差線) |
-
特殊誤差類型
參數 | 默認值 | 說明 |
---|---|---|
lolims /uplims | False | 只顯示下/上限的單向誤差線 |
xlolims /xuplims | False | x方向的單向誤差線 |
barsabove | False | 誤差線顯示在數據點上方 |
我們看一個對稱誤差條形圖示例:
import matplotlib.pyplot as plt
import numpy as np
?
# 創建示例數據
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 56, 32, 67]
errors = [2.5, 3.2, 4.1, 2.8, 3.9] ?# 對稱誤差值
?
plt.figure(figsize=(10, 6))
?
# 繪制條形圖并添加誤差條
bars = plt.bar(categories, values, color='skyblue', edgecolor='black', alpha=0.8)
plt.errorbar(categories, values, yerr=errors, fmt='none',ecolor='red', elinewidth=2, capsize=8, capthick=2)
?
# 添加數據標簽
for bar in bars:height = bar.get_height()plt.text(bar.get_x() + bar.get_width() / 2., height + 1,f'{height:.1f}', ha='center', va='bottom', fontsize=10)
?
# 圖表裝飾
plt.title('基礎對稱誤差條形圖', fontsize=14, pad=20)
plt.xlabel('類別', fontsize=12)
plt.ylabel('測量值', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.ylim(0, 80)
plt.tight_layout()
plt.show()
我們在看一個非對稱誤差條形圖示例:
import matplotlib.pyplot as plt
import numpy as np
?
# 創建示例數據
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 56, 32, 67]
# 非對稱誤差數據
lower_errors = [1.8, 2.5, 3.0, 2.0, 3.2] ?# 下誤差
upper_errors = [3.2, 3.8, 5.2, 3.6, 4.6] ?# 上誤差
asymmetric_errors = [lower_errors, upper_errors] ?# 非對稱誤差格式
?
plt.figure(figsize=(10, 6))
?
# 繪制條形圖
bars = plt.bar(categories, values, color='lightgreen', edgecolor='black', alpha=0.8)
?
# 添加非對稱誤差條
plt.errorbar(categories, values, yerr=asymmetric_errors, fmt='none',ecolor='purple', elinewidth=2, capsize=8, capthick=2)
?
# 添加數據標簽
for bar in bars:height = bar.get_height()plt.text(bar.get_x() + bar.get_width() / 2., height + 1,f'{height:.1f}', ha='center', va='bottom', fontsize=10)
?
# 圖表裝飾
plt.title('非對稱誤差條形圖', fontsize=14, pad=20)
plt.xlabel('類別', fontsize=12)
plt.ylabel('測量值', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.ylim(0, 80)
plt.tight_layout()
plt.show()
分組誤差條形圖示例:
import numpy as np
?
# 創建多組數據
categories = ['Group 1', 'Group 2', 'Group 3', 'Group 4']
men_means = [22, 30, 35, 28]
women_means = [25, 32, 30, 35]
men_errors = [1.8, 2.5, 3.0, 2.5]
women_errors = [2.2, 2.8, 2.5, 3.0]
?
x = np.arange(len(categories)) ?# 標簽位置
width = 0.35 ?# 條形寬度
?
plt.figure(figsize=(12, 7))
?
# 繪制男性組條形圖
rects1 = plt.bar(x - width / 2, men_means, width,label='男性', color='royalblue', alpha=0.8,yerr=men_errors, error_kw=dict(elinewidth=2, ecolor='darkblue', capsize=6))
?
# 繪制女性組條形圖
rects2 = plt.bar(x + width / 2, women_means, width,label='女性', color='lightcoral', alpha=0.8,yerr=women_errors, error_kw=dict(elinewidth=2, ecolor='darkred', capsize=6))
?
?
# 添加數據標簽
def autolabel(rects):"""在條形圖上方附加文本標簽,顯示條形高度"""for rect in rects:height = rect.get_height()plt.annotate(f'{height:.1f}',xy=(rect.get_x() + rect.get_width() / 2, height),xytext=(0, 3), ?# 3點垂直偏移textcoords="offset points",ha='center', va='bottom', fontsize=10)
?
?
autolabel(rects1)
autolabel(rects2)
?
# 圖表裝飾
plt.title('分組誤差條形圖(按性別)', fontsize=14, pad=20)
plt.xlabel('實驗組', fontsize=12)
plt.ylabel('平均得分', fontsize=12)
plt.xticks(x, categories)
plt.legend(loc='upper right', frameon=True)
plt.grid(axis='y', linestyle='--', alpha=0.5)
plt.ylim(0, 45)
plt.tight_layout()
plt.show()
水平誤差條形圖:
import matplotlib.pyplot as plt
import numpy as np
?
# 創建水平數據
countries = ['挪威', '德國', '加拿大', '美國', '荷蘭']
gold_medals = [16, 12, 11, 9, 8]
errors = [1.2, 0.9, 1.1, 0.8, 0.7] ?# 水平誤差
?
plt.figure(figsize=(10, 6))
?
# 繪制水平條形圖
bars = plt.barh(countries, gold_medals, color='gold', edgecolor='darkorange', height=0.7, alpha=0.9)
?
# 添加水平誤差條
plt.errorbar(gold_medals, countries, xerr=errors, fmt='none',ecolor='darkred', elinewidth=2, capsize=6, capthick=2)
?
# 添加數據標簽
for bar in bars:width = bar.get_width()plt.text(width + 0.5, bar.get_y() + bar.get_height() / 2,f'{width:.0f}', ha='left', va='center', fontsize=10)
?
# 圖表裝飾
plt.title('冬奧會金牌數(含不確定性)', fontsize=14, pad=20)
plt.xlabel('金牌數量', fontsize=12)
plt.ylabel('國家', fontsize=12)
plt.xlim(0, 20)
plt.grid(axis='x', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()