Matplotlib(六)- 坐標軸定制

文章目錄

  • 一、坐標軸概述
    • 1. 坐標軸介紹
    • 2. 坐標軸相關屬性
  • 二、坐標軸
    • 1. axes() 方法介紹
    • 2. 示例:添加多個繪圖區域
  • 三、坐標軸的刻度
    • 1. 坐標軸的刻度介紹
    • 2. 刻度定位器和格式器
      • 2.1 刻度定位器
      • 2.2 刻度格式器
      • 2.3 示例:刻度定位和格式
    • 3. 刻度樣式
      • 3.1 tick_params()方法介紹
      • 3.2 示例:刻度樣式
    • 4. 示例:某地區24小時的平均風速
  • 四、軸脊(Spines)
    • 1. 軸脊介紹
    • 2. 隱藏軸脊
      • 2.1 通過 axis() 方法
      • 2.2 通過 `set_visible()` 方法
      • 2.3 示例:繪制多邊形(隱藏軸脊)
      • 2.4 示例:2018年到2022年的快遞業務量及其增長速度
    • 3. 移動軸脊
      • 3.1 通過 set_position() 方法
      • 3.2 示例:繪制多邊形(移動軸脊)


一、坐標軸概述

在 Matplotlib 中,坐標軸(Axes) 是繪圖的核心區域,它是圖形中實際繪制數據的部分,包含刻度、標簽、網格線以及數據曲線等元素。一個 Figure(畫布)可以包含一個或多個 Axes(子圖),每個 Axes 都擁有獨立的 x 軸和 y 軸(在三維圖中還包括 z 軸)。

1. 坐標軸介紹

Axes 并不是簡單的“坐標軸線”,而是指圖表中的繪圖區域,包括:

  • X 軸和 Y 軸:定義數據的數值尺度;
  • 刻度(Ticks):坐標軸上的標記點;
  • 刻度標簽(Tick Labels):刻度對應的數值或文字說明;
  • 軸標簽(Axis Labels):描述坐標軸含義的文字(如“時間”、“溫度”);
  • 標題(Title):子圖的標題;
  • 圖例(Legend):用于標識不同數據系列;
  • 網格線(Grid):輔助讀數的背景線。

🔹 注意:不要將 AxesAxis 混淆:

  • Axes:整個繪圖區域(可理解為“子圖”);
  • Axis:單個坐標軸對象(如 x 軸或 y 軸),是 Axes 的組成部分。

2. 坐標軸相關屬性

以下是 Matplotlib 中 Axes 和其子對象(如 AxisTick)常用屬性的詳細說明表:

屬性類型獲取方式描述
ax.xaxismatplotlib.axis.XAxisax.xaxisX 軸對象,控制 x 軸的刻度、標簽、方向等
ax.yaxismatplotlib.axis.YAxisax.yaxisY 軸對象,控制 y 軸的刻度、標簽、方向等
ax.xaxis.labelTextax.xaxis.labelX 軸標簽文本對象
ax.yaxis.labelTextax.yaxis.labelY 軸標簽文本對象
ax.titleTextax.title子圖標題對象
ax.xaxis.get_ticklocs() / get_ticks()arrayax.xaxis.get_ticklocs()獲取 x 軸刻度位置
ax.yaxis.get_ticklocs() / get_ticks()arrayax.yaxis.get_ticklocs()獲取 y 軸刻度位置
ax.xaxis.get_ticklabels()list of Textax.xaxis.get_ticklabels()獲取 x 軸刻度標簽對象列表
ax.yaxis.get_ticklabels()list of Textax.yaxis.get_ticklabels()獲取 y 軸刻度標簽對象列表
ax.xaxis.set_ticks()方法ax.xaxis.set_ticks(ticks)設置 x 軸刻度位置
ax.yaxis.set_ticks()方法ax.yaxis.set_ticks(ticks)設置 y 軸刻度位置
ax.xaxis.set_ticklabels()方法ax.xaxis.set_ticklabels(labels)設置 x 軸刻度標簽
ax.yaxis.set_ticklabels()方法ax.yaxis.set_ticklabels(labels)設置 y 軸刻度標簽
ax.grid()方法ax.grid(True)顯示網格線
ax.set_xlim() / ax.set_ylim()方法ax.set_xlim(left, right)設置坐標軸數據范圍
ax.set_xlabel() / ax.set_ylabel()方法ax.set_xlabel('文本')設置坐標軸標簽
ax.set_title()方法ax.set_title('標題')設置子圖標題
ax.spinesSpines 字典ax.spines['left']控制坐標軸邊框(如左、右、上、下 spine)的顯示與樣式

二、坐標軸

1. axes() 方法介紹

在 Matplotlib 中,plt.axes() 方法用于向當前圖形(figure)中添加一個新的坐標軸(Axes)。這個方法提供了非常靈活的方式來定義新的繪圖區域的位置和大小,也可以用來創建具有不同坐標系的子圖。通過調整參數,可以精確控制新坐標軸的位置、尺寸及其與其他元素的關系。

plt.axes() 方法的參數如下:

參數類型默認值描述
arglist or tuple or NoneNone定義新坐標軸的位置和大小。
- 當為 None 時,創建一個與默認坐標軸重疊的新坐標軸。
- 當為 [left, bottom, width, height] 列表或元組時,分別指定新坐標軸距離畫布左邊、底部的距離以及寬度和高度的比例(0到1之間)。
projectionstr or NoneNone指定坐標軸的投影類型。例如 'polar' 表示極坐標系。
polarboolFalse如果為 True,則使用極坐標系。此參數是為了向后兼容性而保留的;推薦直接使用 projection='polar'
sharex, shareyAxes object or NoneNone與其它坐標軸共享X軸或Y軸。這在創建多個子圖時很有用,以確保它們之間的尺度一致。

2. 示例:添加多個繪圖區域

import matplotlib.pyplot as plt  # 導入 matplotlib.pyplot 模塊,用于繪圖# 創建一個新的圖形(figure),并設置背景顏色為淺灰色
fig = plt.figure(facecolor='lightgray')# 在圖形上添加第一個坐標軸(ax1),位置和大小由矩形定義 [left, bottom, width, height]
# 這里 left=0.1, bottom=0.6, width=0.3, height=0.3 表示 ax1 的位置和大小
ax1 = plt.axes([0.1, 0.6, 0.3, 0.3])# 添加第二個坐標軸(ax2),參數含義同上
ax2 = plt.axes([0.5, 0.6, 0.3, 0.3])# 添加第三個坐標軸(ax3),但這次指定 projection='polar' 來創建極坐標圖
# 參數同樣定義了位置和大小
ax3 = plt.axes([0.1, 0.1, 0.3, 0.3], projection='polar')# 添加第四個坐標軸(ax4),這里使用 projection='3d' 創建三維坐標系
# 參數也定義了其位置和大小
ax4 = plt.axes([0.5, 0.1, 0.3, 0.3], projection='3d')# 顯示繪制好的圖形窗口
plt.show()

繪制的圖形如下圖所示:

在這里插入圖片描述


三、坐標軸的刻度

在 Matplotlib 中,坐標軸的刻度(ticks)是圖表中非常重要的元素之一。它們不僅幫助我們理解數據的數值范圍,還能通過適當的定位和格式化增強圖表的可讀性和美觀性。

1. 坐標軸的刻度介紹

坐標軸的刻度由兩部分組成:

  • 刻度定位器(Tick Locator):決定刻度的位置。
  • 刻度格式器(Tick Formatter):控制刻度標簽如何顯示。

通過自定義刻度定位器和格式器,可以實現對圖表外觀的高度定制,例如添加日期時間刻度、科學計數法表示的大數值等。

2. 刻度定位器和格式器

2.1 刻度定位器

刻度定位器決定了坐標軸上刻度的位置。Matplotlib 提供了多種內置的刻度定位器類,適用于不同的場景需求。

刻度定位器相關類及參數如下:

類名描述參數示例
MicrosecondLocator微秒級定位器,以微秒為單位定位刻度interval:微秒間隔ax.xaxis.set_major_locator(MicrosecondLocator(interval=100))
SecondLocator秒級定位器,以秒為單位定位刻度interval:秒間隔ax.xaxis.set_major_locator(SecondLocator(interval=30))
MinuteLocator分鐘級定位器,以分鐘為單位定位刻度interval:分鐘間隔ax.xaxis.set_major_locator(MinuteLocator(interval=15))
HourLocator小時級定位器,以小時為單位定位刻度interval:小時間隔ax.xaxis.set_major_locator(HourLocator(interval=2))
DayLocator天級定位器,以每月的指定日期為單位定位刻度interval:天數間隔ax.xaxis.set_major_locator(DayLocator(interval=7))
WeekdayLocator工作日級定位器,以工作日為單位定位刻度byweekday:指定工作日(如MO, TU等)ax.xaxis.set_major_locator(WeekdayLocator(byweekday=MO))
MonthLocator月份級定位器,以月為單位定位刻度interval:月間隔ax.xaxis.set_major_locator(MonthLocator(interval=3))
YearLocator年份級定位器,以年為單位定位刻度base:年份基數,month:起始月,day:起始日ax.xaxis.set_major_locator(YearLocator(base=2, month=1, day=1))
AutoLocator自動定位器,自動計算刻度位置ax.xaxis.set_major_locator(AutoLocator())
MaxNLocator最大值定位器,根據指定的最大數量計算刻度位置nbins:最大刻度數,steps:允許的步長列表ax.xaxis.set_major_locator(MaxNLocator(nbins=5))
LinearLocator線性定位器,根據線性間隔的要求計算刻度的位置numticks:刻度數量ax.xaxis.set_major_locator(LinearLocator(numticks=6))
LogLocator對數定位器,根據對數間隔的要求計算刻度的位置base:對數底,subs:次要刻度倍數ax.xaxis.set_major_locator(LogLocator(base=10))
MultipleLocator多點定位器,根據指定的基數(相鄰兩個刻度的間距)計算刻度的位置base:刻度間隔ax.xaxis.set_major_locator(MultipleLocator(base=0.5))
FixedLocator定點定位器,將指定坐標列表直接設置為刻度位置,完全跳過自動刻度計算過程locs:刻度位置列表ax.xaxis.set_major_locator(FixedLocator(locs=[0, 1, 2, 3]))
IndexLocator索引定位器,根據指定的整數數量計算刻度的位置base:步長,offset:偏移量ax.xaxis.set_major_locator(IndexLocator(base=2, offset=1))
NullLocator空定位器,沒有任何刻度ax.xaxis.set_major_locator(NullLocator())

2.2 刻度格式器

刻度格式器負責將刻度值轉換為字符串顯示。通過使用不同的格式器,可以靈活地調整刻度標簽的顯示格式。

刻度格式器相關類及參數如下:

類名描述參數示例
NullFormatter空格式器,不顯示任何刻度標簽-ax.xaxis.set_major_formatter(NullFormatter())
IndexFormatter索引格式器,用于顯示離散化的序列刻度值seq(序列)ax.xaxis.set_major_formatter(IndexFormatter(seq=[0, 1, 2, 3]))
FixedFormatter固定格式器,用于顯示固定列表中的刻度標簽seq(字符串列表)ax.xaxis.set_major_formatter(FixedFormatter(seq=['A', 'B', 'C']))
FuncFormatter函數格式器,用于執行用戶定義的函數以格式化刻度標簽func(格式化函數)ax.xaxis.set_major_formatter(FuncFormatter(lambda x, pos: f'{x:.2f}'))
StrMethodFormatter字符串方法格式器,使用內置的Python字符串方法格式化刻度標簽fmt(格式字符串)ax.xaxis.set_major_formatter(StrMethodFormatter('{x:.2f}'))
FormatStrFormatter格式字符串格式器,使用類似于格式化字符串等類型定義格式fmt(格式字符串)ax.xaxis.set_major_formatter(FormatStrFormatter('%.2f'))
ScalarFormatter標量格式器,用于顯示數值型刻度值,比如100000以科學計數法表示1E6useOffset, useMathTextax.xaxis.set_major_formatter(ScalarFormatter(useMathText=True))
LogFormatter對數格式器,基于對數刻度值顯示刻度標簽-ax.xaxis.set_major_formatter(LogFormatter())
LogFormatterExponent對數刻度指數格式器,以指數表示形式顯示刻度標簽labelOnlyBaseax.xaxis.set_major_formatter(LogFormatterExponent(labelOnlyBase=False))
LogFormatterMathtext對數刻度數學符號格式器,使數學公式來顯示刻度標簽-ax.xaxis.set_major_formatter(LogFormatterMathtext())
LogFormatterSciNotation對數刻度科學符號格式器,使用科學符號來顯示刻度標簽-ax.xaxis.set_major_formatter(LogFormatterSciNotation())
PercentFormatter百分比格式器,用于將刻度值轉換為百分比形式的刻度標簽xmax(最大值),decimals(小數位數)ax.xaxis.set_major_formatter(PercentFormatter(xmax=100, decimals=1))
AutoDateFormatter日期自動格式器,用于自動識別并格式化軸上的日期刻度,默認的格式為’%Y-%m-%d’,即年-月-日tz(時區),defaultfmt(默認格式)ax.xaxis.set_major_formatter(AutoDateFormatter(tz=None, defaultfmt='%Y-%m-%d'))
ConciseDateFormatter簡潔日期格式器,通常用于顯示連續時間范圍并使用日期偏移量格式化日期刻度locator(定位器)ax.xaxis.set_major_formatter(ConciseDateFormatter(locator=ax.xaxis.get_major_locator()))
DateFormatter日期格式器,用于手動指定坐標軸上的日期格式fmt(日期格式字符串)ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d'))

2.3 示例:刻度定位和格式

from datetime import datetime  # 導入datetime模塊,用于處理日期和時間import matplotlib.pyplot as plt  # 導入matplotlib.pyplot模塊,用于繪圖
from matplotlib.dates import HourLocator, DateFormatter  # 導入HourLocator和DateFormatter類,用于設置坐標軸的時間格式# 定義一個字符串列表,包含一些表示日期時間的信息
dates = ['202310240', '2023102402', '2023102404', '2023102406', '2023102408']
# 將這些字符串轉換為datetime對象列表,以便在圖表中使用。格式為'%Y%m%d%H',即年月日小時
x_date = [datetime.strptime(d, '%Y%m%d%H') for d in dates]# y軸的數據列表
y_data = [1, 2, 3, 4, 5]# 在圖形上創建一個新的坐標軸,位置和大小由矩形定義[left, bottom, width, height]
ax = plt.axes((0.2, 0.2, 0.6, 0.6))# 使用上述坐標軸繪制數據,x軸為日期時間,y軸為數值
ax.plot(x_date, y_data)# 創建一個HourLocator實例,用于每2小時顯示一個刻度
hour_loc = HourLocator(interval=2)
# 設置x軸的主要刻度定位器為上面創建的hour_loc
ax.xaxis.set_major_locator(hour_loc)# 創建一個DateFormatter實例,用于格式化x軸上的日期時間為'%H:%M'格式(小時:分鐘)
date_fmt = DateFormatter('%H:%M')
# 設置x軸的主要刻度格式化器為上面創建的date_fmt
ax.xaxis.set_major_formatter(date_fmt)# 顯示繪制好的圖形窗口
plt.show()

繪制的圖形如下圖所示:

在這里插入圖片描述

3. 刻度樣式

3.1 tick_params()方法介紹

tick_params() 方法在 Matplotlib 中用于更改刻度的樣式和外觀。通過此方法,可以控制刻度標記(ticks)、刻度標簽(tick labels)以及刻度網格線(grid lines)的顏色、寬度、大小等屬性。這使得對圖表細節進行微調變得簡單直接。

tick_params() 方法參數介紹:

參數類型說明
axisstr指定要設置哪個軸上的刻度參數。可選值有 'x', 'y', 和 'both'(默認)。
whichstr設置哪些刻度被影響。選項包括 'major', 'minor', 'both'(默認)。
directionstr刻度方向。選項包括 'in', 'out', 'inout'(默認是 'out')。
lengthfloat刻度線的長度(以點為單位)。
widthfloat刻度線的寬度(以點為單位)。
colorcolor刻度線的顏色。可以是任何 Matplotlib 支持的顏色格式。
padfloat刻度標簽與刻度線之間的距離(以點為單位)。
labelsizefloat/str刻度標簽字體大小。也可以是相對大小如 'smaller', 'x-large' 等。
labelcolorcolor刻度標簽顏色。
colorscolor一次性設置刻度線、刻度標簽顏色等所有支持顏色的屬性。
bottombool如果為 True,則繪制位于軸底部的刻度。
topbool如果為 True,則繪制位于軸頂部的刻度。
leftbool如果為 True,則繪制位于軸左側的刻度。
rightbool如果為 True,則繪制位于軸右側的刻度。
labelbottombool控制是否顯示 x 軸底部的刻度標簽。
labeltopbool控制是否顯示 x 軸頂部的刻度標簽。
labelleftbool控制是否顯示 y 軸左側的刻度標簽。
labelrightbool控制是否顯示 y 軸右側的刻度標簽。

3.2 示例:刻度樣式

import matplotlib.pyplot as plt
import matplotlib.pyplot as plt  # 導入matplotlib.pyplot模塊用于繪圖# 創建一個新的坐標軸對象
ax = plt.axes()# 使用tick_params()方法修改刻度樣式:
# axis='both' 表示同時應用到x軸和y軸;
# which='major' 表示這些參數將應用于主刻度(也可以是'minor'或'both');
# labelsize=10 設置刻度標簽的字體大小為10;
# colors='r' 將刻度的顏色設置為紅色('r'代表red);
# direction='in' 設置刻度線的方向向內;
# length=6 設置刻度線的長度為6點;
# width=2 設置刻度線的寬度為2點。
ax.tick_params(axis='both', which='major', labelsize=10, colors='r', direction='in', length=6, width=2)# 再次使用tick_params()方法對x軸單獨進行樣式修改:
# axis='x' 表示只應用于x軸;
# colors='b' 將x軸刻度顏色設置為藍色('b'代表blue);
# pad=10 設置刻度標簽與刻度線之間的間距為10點,增加了一些空間。
ax.tick_params(axis='x', colors='b', pad=10)# 顯示所創建的圖形窗口
plt.show()

繪制的圖形如下圖所示:

在這里插入圖片描述

4. 示例:某地區24小時的平均風速

數據如下圖所示,需要根據這個數據繪制圖形。

在這里插入圖片描述

實現代碼如下所示:

# 導入 datetime 模塊,用于處理時間數據
from datetime import datetime# 導入 matplotlib.pyplot 模塊,用于繪圖
import matplotlib.pyplot as plt
# 導入 pandas 模塊,用于讀取和處理 CSV 數據
import pandas as pd
# 從 matplotlib.dates 導入 DateFormatter 和 HourLocator
# 用于格式化時間軸的顯示方式(如小時、分鐘)和設置刻度間隔
from matplotlib.dates import DateFormatter, HourLocator# 設置中文字體為 SimHei(黑體),以確保中文可以正常顯示在圖表上
# 否則中文可能顯示為方框或亂碼
plt.rcParams['font.sans-serif'] = ['SimHei']# 解決坐標軸負號 '-' 顯示為方塊的問題
# 某些中文字體不支持 Unicode 負號,設置為 False 可正常顯示負數
plt.rcParams['axes.unicode_minus'] = False# 定義 CSV 文件的路徑,請根據實際文件位置修改
csv_file_path = './data/某地區24小時的平均風速.csv'# 使用 pandas 讀取 CSV 文件,返回一個 DataFrame(表格型數據結構)
df = pd.read_csv(csv_file_path)# 1. 創建畫布(Figure),用于承載圖表內容
# 不指定大小時使用默認尺寸
fig = plt.figure()# 2. 在畫布上添加一個自定義位置的繪圖區域(Axes)
# 參數 [left, bottom, width, height] 是相對于畫布的比例(0~1)
# 這里設置為從左下角 (0.1, 0.1) 開始,寬 0.8、高 0.8,留出邊距
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])# 將 '時間' 列的數據(如 2023102401)轉換為 datetime 對象
# 使用 apply 和 lambda 函數逐行處理字符串,并按 '%Y%m%d%H' 格式解析為日期時間
x_date = df['時間'].apply(lambda x: datetime.strptime(str(x), '%Y%m%d%H')).tolist()# 提取 '風速 (km/h)' 列的數據并轉換為 Python 列表
y_data = df['風速 (km/h)'].tolist()# 繪制折線圖
# x: 時間數據,y: 風速數據
# ls='-':線條樣式為實線
# marker='>':數據點使用右向三角形作為標記
# ms=6:標記大小為 6
# mfc='#FF9900':標記填充顏色為橙色(十六進制顏色)
ax.plot(x_date, y_data, ls='-', marker='>', ms=6, mfc='#FF9900')# 設置圖表標題
ax.set_title('深圳市24小時的平均風速')# 設置 Y 軸標簽
ax.set_ylabel('平均風速(km/h)')# 設置 Y 軸的顯示范圍為 5 到 25 km/h
# 突出風速變化,避免圖形壓縮或拉伸
ax.set_ylim(5, 25)# 在每個數據點上方添加數值標簽
# 使用 text() 方法在每個 (x, y) 點繪制文本
# s=y_data[i]:顯示當前風速值
# ha='center':水平居中對齊于數據點
# va='bottom':垂直方向在數據點下方顯示(避免遮擋)
for i in range(len(y_data)):ax.text(x=x_date[i], y=y_data[i], s=y_data[i], ha='center', va='bottom')# 設置 X 軸主刻度為每 2 小時一個
hour_loc = HourLocator(interval=2)
ax.xaxis.set_major_locator(hour_loc)# 設置 X 軸主刻度標簽的顯示格式為 "小時:分鐘"(如 08:00)
date_fmt = DateFormatter('%H:%M')
ax.xaxis.set_major_formatter(date_fmt)# 設置所有坐標軸的刻度樣式
# direction='in':刻度線向內
# length=6:刻度線長度
# width=2:刻度線粗細
# labelsize=12:刻度標簽字體大小
ax.tick_params(direction='in', length=6, width=2, labelsize=12)# 單獨設置 X 軸刻度標簽旋轉 45 度
# 防止時間標簽過長導致重疊,提升可讀性
ax.tick_params(axis='x', labelrotation=45)# 顯示繪制完成的圖表
plt.show()

繪制的圖形如下圖所示:

在這里插入圖片描述


四、軸脊(Spines)

1. 軸脊介紹

在 Matplotlib 中,軸脊(Spines) 是指坐標軸的邊界線,它們定義了繪圖區域的框架。每個坐標軸(Axes)默認有四條軸脊:

  • left:左側軸脊
  • right:右側軸脊
  • top:頂部軸脊
  • bottom:底部軸脊

軸脊不僅用于顯示坐標軸的邊界,還可以控制刻度和標簽的位置。通過自定義軸脊,可以實現多種視覺效果,例如:

  • 隱藏某些邊框以獲得更簡潔的圖表;
  • 將軸脊移動到數據原點(如繪制笛卡爾坐標系);
  • 改變軸脊的顏色、線寬或樣式。

軸脊對象可通過 ax.spines 字典訪問,例如 ax.spines['left'] 表示左側軸脊。

2. 隱藏軸脊

2.1 通過 axis() 方法

plt.axis()ax.axis() 方法不僅可以設置坐標軸的范圍,還可以控制坐標軸的整體顯示狀態,包括是否顯示邊框(軸脊)。

axis() 方法的參數取值說明:

參數值類型描述
'on'str恢復顯示所有坐標軸元素(默認狀態),包括軸脊、刻度、標簽等。
'off'str隱藏所有坐標軸元素,包括軸脊、刻度、標簽、標題等。整個坐標軸區域變為空白。
'equal'str設置等比例坐標軸(x 和 y 單位長度相等),不改變可見性。
'scaled'str類似 'equal',但通過調整繪圖區域大小實現。
'tight'str自動調整坐標軸范圍以緊密包圍數據。

2.2 通過 set_visible() 方法

更精細的控制方式是直接操作 spines 對象的 set_visible() 方法,可以單獨隱藏某一條軸脊,而保留其他部分(如刻度、標簽)可見。

方法簽名

ax.spines[spine_name].set_visible(False)

set_visible() 方法參數

參數類型默認值描述
bbool如果為 False,則隱藏該軸脊;如果為 True,則顯示該軸脊。

🔹 spine_name 可選值:'left', 'right', 'top', 'bottom'

2.3 示例:繪制多邊形(隱藏軸脊)

import matplotlib.pyplot as plt  # 導入 matplotlib 的 pyplot 模塊,用于繪制圖形# 設置繪圖時使用的字體為 SimHei(黑體),解決中文顯示問題
plt.rcParams['font.sans-serif'] = ['SimHei']
# 正常顯示負號(-),因為默認情況下使用某些中文字體可能無法正常顯示負號
plt.rcParams['axes.unicode_minus'] = False# 多邊形頂點 x 坐標列表
x = [0, 2, 4, 3]
# 多邊形頂點 y 坐標列表
y = [1, 3, 2, 0]# 使用 fill() 方法填充多邊形區域
plt.fill(x, y,  # 指定多邊形各頂點的坐標facecolor='lightgreen',  # 填充顏色為淺綠色alpha=0.5,  # 透明度設置為 0.5,值在 0 至 1 之間,0 為完全透明,1 為不透明edgecolor='green',  # 邊緣線條顏色設為綠色linewidth=2,  # 邊緣線條寬度設為 2linestyle='--',  # 邊緣線條樣式設為虛線label='多邊形填充'  # 圖例標簽名
)# 設置 x 軸的數值范圍
plt.xlim(-1, 5)
# 設置 y 軸的數值范圍
plt.ylim(-1, 4)# 添加圖例,展示圖表中的標記信息
plt.legend()# 設置圖表標題
plt.title('fill() 填充多邊形示例')# 關閉軸脊
plt.axis('off')# 獲取當前的坐標軸對象(Axes)
# plt.gca() 是 "get current axes" 的縮寫
# 它返回當前正在操作的子圖坐標軸,如果沒有則創建一個
# ax = plt.gca()# 隱藏圖表底部的邊框線
# 注意:這也會隱藏 x 軸的橫線,但刻度和標簽仍可單獨控制顯示
# ax.spines['top'].set_visible(False)# 隱藏圖表左側的邊框線
# 同樣,這會隱藏 y 軸的豎線,但不影響刻度和標簽
# ax.spines['right'].set_visible(False)# 顯示繪制出的圖表
plt.show()

繪制的圖形如下圖所示:

在這里插入圖片描述

在這里插入圖片描述

2.4 示例:2018年到2022年的快遞業務量及其增長速度

數據如下圖所示,需要根據這個數據繪制圖形。

在這里插入圖片描述

實現代碼如下所示:

# 導入 matplotlib.pyplot 模塊,用于繪圖
import matplotlib.pyplot as plt# 導入 pandas 模塊,用于讀取和處理 CSV 數據
import pandas as pd# 設置繪圖時使用的字體為 SimHei(黑體),解決中文無法正常顯示的問題
# 否則中文標簽、標題等可能顯示為方框或亂碼
plt.rcParams['font.sans-serif'] = ['SimHei']# 正常顯示負號(-)
# 某些中文字體不支持 Unicode 負號,會導致負數顯示為方塊
# 設置為 False 可確保負號正常顯示
plt.rcParams['axes.unicode_minus'] = False# 定義 CSV 文件的路徑,請根據實際路徑修改
csv_file_path = './data/2018年到2022年的快遞業務量及其增長速度.csv'# 使用 pandas 讀取指定路徑的 CSV 文件,返回一個 DataFrame(二維表格結構)
df = pd.read_csv(csv_file_path)# 創建一個新的圖形(Figure)對象,用于承載圖表內容
fig = plt.figure()# 在圖形上添加一個自定義位置的坐標軸(Axes)
# 參數 [left, bottom, width, height] 表示相對于畫布的比例(0~1)
# 這里設置為從 (0.1, 0.1) 開始,寬 0.8、高 0.8,留出邊距
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])# 從 DataFrame 中提取 '年份' 列,并轉換為 Python 列表作為 X 軸數據
x_year = df['年份'].tolist()# 提取 '快遞業務量 (億件)' 列數據,作為柱狀圖的 Y 軸數據
y_nums = df['快遞業務量 (億件)'].tolist()# 提取 '增長速度 (%)' 列數據,作為折線圖的 Y 軸數據
y_rate = df['增長速度 (%)'].tolist()# 繪制柱狀圖:顯示每年的快遞業務量
# x_year: X 軸(年份),y_nums: 柱子高度
# width=0.5: 柱子寬度
# color='lightblue': 柱子顏色為淺藍色
rect_nums = ax.bar(x_year, y_nums, width=0.5, color='lightblue')# 設置主坐標軸(ax)的圖表標題
ax.set_title('2018-2022年的快遞業務量及其增長速度')# 設置主坐標軸 Y 軸的標簽
ax.set_ylabel('業務量(億件)')# 設置主坐標軸 Y 軸的顯示范圍為 0 到 1400 億件
# 保證圖形空間合理,避免壓縮或拉伸
ax.set_ylim(0, 1400)# 在每個柱子的頂部添加數值標簽
# 使用 text() 方法逐個標注數據
for i in range(len(y_nums)):ax.text(x=x_year[i],  # X 位置:對應年份y=y_nums[i],  # Y 位置:柱子頂部s=y_nums[i],  # 顯示內容:業務量數值fontsize=11,  # 字體大小ha='center',  # 水平居中對齊于柱子va='bottom'  # 垂直方向在柱子上方顯示)# 創建一個與 ax 共享 X 軸的右側坐標軸(用于繪制增長速度)
ax_right = ax.twinx()# 繪制折線圖:顯示每年的增長速度
# x_year: X 軸(年份),y_rate: Y 軸(增長率)
# color='lightcoral': 線條顏色為淺珊瑚色
# marker='o': 數據點用圓形標記
# ms=6: 標記大小為 6
# mfc='white': 標記內部填充為白色
line_rate = ax_right.plot(x_year, y_rate, color='lightcoral', marker='o', ms=6, mfc='white')# 設置右側坐標軸 Y 軸的標簽
ax_right.set_ylabel('增長速度(%)')# 設置右側坐標軸 Y 軸的顯示范圍為 0 到 100%
ax_right.set_ylim(0, 100)# 在每個折線數據點上方添加增長率數值標簽
for i in range(len(y_rate)):ax_right.text(x=x_year[i],  # X 位置:對應年份y=y_rate[i],  # Y 位置:數據點位置s=y_rate[i],  # 顯示內容:增長率數值fontsize=11,  # 字體大小ha='center',  # 水平居中對齊va='bottom'  # 垂直方向在點上方顯示)# 手動創建圖例,合并柱狀圖和折線圖的圖例項
# [rect_nums, line_rate[0]]: 分別是柱狀圖對象和折線圖中的 Line2D 對象
# labels: 圖例文字
# loc='upper left': 圖例放在左上角
# ncol=2: 設置圖例為 2 列(但這里寫成了 26.6,可能是筆誤)
plt.legend([rect_nums, line_rate[0]], ['快遞業務量', '比去年增長'], loc='upper left', ncol=2)# 隱藏主坐標軸(ax)頂部的邊框線,使圖表更簡潔
ax.spines['top'].set_visible(False)# 隱藏右側坐標軸(ax_right)頂部的邊框線,保持風格統一
ax_right.spines['top'].set_visible(False)# 顯示最終繪制的圖表
plt.show()

繪制的圖形如下圖所示:

在這里插入圖片描述

3. 移動軸脊

在 Matplotlib 中,通過移動軸脊(Spines)的位置,可以創建更靈活、更具表現力的圖表樣式。例如,將坐標軸置于圖形中心,模擬數學中的笛卡爾坐標系,或實現類似于 R 語言 ggplot2 風格的“下方-左側”坐標軸布局。

3.1 通過 set_position() 方法

set_position()Spine 對象的一個方法,用于設置軸脊的位置。它可以將某條軸脊從默認邊緣位置移動到指定坐標或相對位置。

方法簽名

ax.spines[spine_name].set_position(position)

set_position() 方法參數取值說明:

位置類型(position)參數格式描述示例
'outward'(orientation, amount)將軸脊向外偏移指定距離(單位:點)。負值表示向內。('outward', 10)
'axes'(orientation, 0~1)相對于軸的歸一化位置(0 到 1)。0 表示起點,1 表示終點。('axes', 0.5) 表示移動到軸的中間
'data'(orientation, value)移動到數據空間中的某個具體數值位置。常用于將軸脊置于原點。('data', 0)
'center'簡寫形式等價于 'data' 類型中的 (orientation, 0),即將軸脊置于數據為 0 的位置。'center'
'zero'簡寫形式'center',語義更明確,表示移動到數據零點。'zero'

🔹 orientation 可選值:

  • 對于 left/right 軸脊:使用 'y'
  • 對于 bottom/top 軸脊:使用 'x'

3.2 示例:繪制多邊形(移動軸脊)

import matplotlib.pyplot as plt  # 導入 matplotlib 的 pyplot 模塊,用于繪制圖形# 設置繪圖時使用的字體為 SimHei(黑體),解決中文顯示問題
plt.rcParams['font.sans-serif'] = ['SimHei']
# 正常顯示負號(-),因為默認情況下使用某些中文字體可能無法正常顯示負號
plt.rcParams['axes.unicode_minus'] = False# 多邊形頂點 x 坐標列表
x = [0, 2, 4, 3]
# 多邊形頂點 y 坐標列表
y = [1, 3, 2, 0]# 使用 fill() 方法填充多邊形區域
plt.fill(x, y,  # 指定多邊形各頂點的坐標facecolor='lightgreen',  # 填充顏色為淺綠色alpha=0.5,  # 透明度設置為 0.5,值在 0 至 1 之間,0 為完全透明,1 為不透明edgecolor='green',  # 邊緣線條顏色設為綠色linewidth=2,  # 邊緣線條寬度設為 2linestyle='--',  # 邊緣線條樣式設為虛線label='多邊形填充'  # 圖例標簽名
)# 設置 x 軸的數值范圍
plt.xlim(-1, 5)
# 設置 y 軸的數值范圍
plt.ylim(-1, 4)# 添加圖例,展示圖表中的標記信息
plt.legend()# 設置圖表標題
plt.title('fill() 填充多邊形示例')# 獲取當前的坐標軸對象(Axes)
# plt.gca() 是 "get current axes" 的縮寫
# 它返回當前正在操作的子圖坐標軸,如果沒有則創建一個
ax = plt.gca()# 隱藏圖表底部的邊框線
# 注意:這也會隱藏 x 軸的橫線,但刻度和標簽仍可單獨控制顯示
ax.spines['top'].set_visible(False)# 隱藏圖表左側的邊框線
# 同樣,這會隱藏 y 軸的豎線,但不影響刻度和標簽
ax.spines['right'].set_visible(False)# 將左側(Y軸)邊框線(spine)移動到圖形的水平中心位置
# ('axes', 0.5) 表示位置是相對于整個坐標軸寬度的 50% 處
# 即:Y軸將顯示在圖形中間(常用于對稱數據或坐標原點居中)
ax.spines['left'].set_position(('axes', 0.5))# 將底部(X軸)邊框線(spine)移動到圖形的垂直中心位置
# ('axes', 0.5) 表示位置是相對于整個坐標軸高度的 50% 處
# 即:X軸將顯示在圖形中間,與上面的Y軸一起形成十字交叉坐標系
ax.spines['bottom'].set_position(('axes', 0.5))# 將左側(Y軸)邊框線重新定位到數據值為 3 的位置
# ('data', 3) 表示 Y軸 將移動到 X=3 的垂直線上
# 注意:這行會覆蓋上面第一行的設置(一個 spine 不能同時有兩個位置)
# 通常用于將坐標軸移動到某個特定的數據點上
# ax.spines['left'].set_position(('data', 3))# 顯示繪制出的圖表
plt.show()

繪制的圖形如下圖所示:

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92138.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92138.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92138.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【物聯網】基于樹莓派的物聯網開發【22】——樹莓派獲取傳感器數據實時存儲實戰

場景介紹 今天程序貓帶領大家如何實時獲取樹莓派傳感器溫濕度數據,并自動存儲到數據庫中。確保數據的持續性。 實現過程 硬件連接 樹莓派4b連接GPIO引腳與DHT11傳感器; 硬件只涉及樹莓派、DHT11傳感器。 DHT11的信號引腳連接樹莓派的GPIO17, DHT11的Vdd&…

Linux DNS緩存與Nginx DNS緩存運維文檔

一、Linux DNS緩存機制與配置 1. Linux DNS緩存原理 Linux系統中的DNS緩存主要通過以下幾種方式實現: ?** nscd(Name Service Caching Daemon)**?:系統級緩存服務,可緩存DNS解析、主機名解析等信息?dnsmasq?:輕量級DNS轉發器和…

Java開發時出現的問題---并發與資源管理深層問題

Java 并發模型基于 JVM 內存模型(JMM),資源管理涉及 IO、線程、鎖等關鍵組件。若對并發語義、資源生命周期理解不透徹,易引發死鎖、內存泄漏、數據錯亂等嚴重問題。1. 并發三大特性(可見性、原子性、有序性&#xff09…

從「同步」到「異步」:用 aiohttp 把 Python 網絡 I/O 榨到極致

目錄 一、寫在前面:為什么 IO 是瓶頸 二、同步模型:requests 的憂傷 三、線程池:用并發掩蓋阻塞 四、aiohttp:讓「等待」非阻塞 4.1 安裝與版本約定 4.2 異步客戶端:asyncio aiohttp 4.3 錯誤處理與超時 4.4 …

MySQL 在麒麟系統上部署使用 + DBeaver 遠程連接 + SQL 數據導入完整流程

🚀 MySQL 在麒麟系統上部署使用 DBeaver 遠程連接 SQL 數據導入完整流程適用于國產操作系統(如:麒麟 / 統信 / Ubuntu)和 MySQL 8.0。包含遠程配置、授權連接、SQL 導入、DBeaver連接配置等常見問題解決方案。📦 環境…

C語言-指針初級(指針定義、指針的作用、指針的計算、野指針、懸空指針、void類型指針)

本章概述思維導圖:C語言指針指針是C語言中最強大但也最容易混淆的特性之一。它提供了直接操作內存地址的能力,使得C語言具有高效性和靈活性。下面我將詳細介紹C語言指針的各個方面。指針定義指針的本質:指針是一個變量,其值為另一…

具身智能VLA困于“數據泥潭”,人類活動視頻數據是否是“破局之鑰”?

前言盡管當前的視覺-語言-動作(VLA)模型已展現出顯著進展,但其在新場景和與復雜物體交互中的性能會顯著下降,在遵循指令方面落后于像LLaVA 這樣的大型多模態模型(LMM)。這種局限性源于現有VLA模型對存在固有…

CIO如何規劃企業BI分析指標體系 —— 從經營出發到績效管理

如果你是一家企業的CIO,要啟動一個商業智能BI項目,負責規劃整個項目的商業智能BI分析內容,你該如何入手準備?要有什么樣的思路。如果是管理層、老板還不能清晰認識到商業智能BI的價值,也提不出很清晰的需求&#xff0c…

go學習筆記:panic是什么含義

anic 是 Go 語言中的一種運行時錯誤處理機制,用于處理程序中的異常情況。 基本含義 panic 會: 立即停止當前函數的執行 開始執行 defer 函數(如果有的話) 向上傳播到調用棧,逐層執行 defer 如果到達 main 函數&am…

OpenLayers 入門指南【五】:Map 容器

文章目錄 一、Map 對象核心參數 1. target 2. view 3. layers 4. controls 5. interactions 6. 其他重要參數 二、Map 對象常用方法 1. 圖層管理 2. 控件管理 3. 交互管理 4. 視圖與坐標操作 5. 事件監聽 6. 覆蓋物管理 7. 其他 三、總結 上一章節中我們通過修改OlMap.vue組件已…

關稅戰火中的技術方舟:新西蘭證券交易所的破局之道 ——從15%關稅沖擊到跨塔斯曼結算聯盟,解碼下一代交易基礎設施

一、今日焦點:全球關稅震蕩與新西蘭的“技術自衛” 1. 特朗普關稅大限落地,新西蘭啟動緊急游說 2025年8月1日,美國總統特朗普正式簽署行政令,對貿易順差國征收最低15%基準關稅。新西蘭貿易部長緊急聲明:“將提出有力證…

windows內核研究(軟件調試-軟件斷點)

軟件調試軟件斷點調試的本質是什么?就是在被調試程序中觸發異常,然后被調試程序就會向_DEBUG_OBJECT結構體添加調試事件,這里我們調試器就接管這個異常了(調試的過程就是異常處理的過程) 軟件斷點 在x64dbg中通過快捷鍵…

HarmonyOS】鴻蒙應用開發中常用的三方庫介紹和使用示例

🌟 鴻蒙應用開發常用三方庫指南(2025 最新版)適用版本:HarmonyOS NEXT / API 12 參考來源:HarmonyOS 三方庫中心 截止至 2025 年 8 月 1 日,本文整理了當前社區中下載量高、穩定性強、生態完善的熱門三方庫…

【通識】C Sharp

1. 使用 \p{名稱}構造匹配Unicode常規類別(該示例為Pd或“標點、短劃線”類別)和命名塊(IsGreek和IsBsicLatin命名塊) using System; using system.Text.RegularExpressions; public class Example {public static void main() {s…

國內首個開源SCA社區——OpenSCA開源社區

OpenSCA開源社區成果說明項目背景智能時代,軟件定義一切。隨著開發模式的敏捷化轉型,開源代碼在軟件制品中的占比越來越大,開源軟件已然成為軟件供應鏈的重要組成部分。由于其特殊性,開源代碼的引入增加了軟件應用的風險面&#x…

超聚變:智能體時代,AI原生重構城企數智化基因

2025 世界人工智能大會(WAIC)世博展覽館內,超聚變展臺前人頭攢動,其展示的AI落地全棧解決方案及上百個AI應用場景吸引了眾多參觀者駐足觀看。這是今年WAIC大會火爆的一角,更是當下AI應用爆發的一個縮影。當人工智能發展…

Traccar:開源GPS追蹤系統的核心價值與技術全景

Traccar:開源GPS追蹤系統的核心價值與技術全景 —— 從設備兼容到企業級定位管理的開源實踐 一、項目定位:多場景定位管理的開源基石 Traccar是一個高擴展性的開源GPS追蹤平臺,支持全球超過200種通信協議與2000款GPS設備(包括車…

編程與數學 03-002 計算機網絡 20_計算機網絡課程實驗與實踐

編程與數學 03-002 計算機網絡 20_計算機網絡課程實驗與實踐一、實驗環境搭建(一)使用模擬器(如Cisco Packet Tracer)搭建網絡實驗環境(二)實驗設備的配置與連接二、基礎網絡實驗(一&#xff09…

15個命令上手Linux!

1、id,顯示當前登錄系統的用戶信息2、pwd,顯示當前工作目錄的絕對路徑3、ls,顯示當前目錄下的內容(ls -r:按反向順序列出內容,ls -l:以詳細列表形式顯示)4、cd,切換工作目…

MongoDB分片技術實現

MongoDB分片技術實現概述MongoDB分片(Sharding)是MongoDB的水平擴展解決方案,通過將數據分布到多個分片(shard)上來處理大數據量和高吞吐量的需求。MongoDB分片架構1. 分片集群組件# MongoDB分片集群架構 version: 3.8…