文章目錄
- 一、坐標軸概述
- 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):輔助讀數的背景線。
🔹 注意:不要將
Axes
與Axis
混淆:
Axes
:整個繪圖區域(可理解為“子圖”);Axis
:單個坐標軸對象(如 x 軸或 y 軸),是Axes
的組成部分。
2. 坐標軸相關屬性
以下是 Matplotlib 中 Axes
和其子對象(如 Axis
、Tick
)常用屬性的詳細說明表:
屬性 | 類型 | 獲取方式 | 描述 |
---|---|---|---|
ax.xaxis | matplotlib.axis.XAxis | ax.xaxis | X 軸對象,控制 x 軸的刻度、標簽、方向等 |
ax.yaxis | matplotlib.axis.YAxis | ax.yaxis | Y 軸對象,控制 y 軸的刻度、標簽、方向等 |
ax.xaxis.label | Text | ax.xaxis.label | X 軸標簽文本對象 |
ax.yaxis.label | Text | ax.yaxis.label | Y 軸標簽文本對象 |
ax.title | Text | ax.title | 子圖標題對象 |
ax.xaxis.get_ticklocs() / get_ticks() | array | ax.xaxis.get_ticklocs() | 獲取 x 軸刻度位置 |
ax.yaxis.get_ticklocs() / get_ticks() | array | ax.yaxis.get_ticklocs() | 獲取 y 軸刻度位置 |
ax.xaxis.get_ticklabels() | list of Text | ax.xaxis.get_ticklabels() | 獲取 x 軸刻度標簽對象列表 |
ax.yaxis.get_ticklabels() | list of Text | ax.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.spines | Spines 字典 | ax.spines['left'] | 控制坐標軸邊框(如左、右、上、下 spine)的顯示與樣式 |
二、坐標軸
1. axes() 方法介紹
在 Matplotlib 中,plt.axes()
方法用于向當前圖形(figure)中添加一個新的坐標軸(Axes)。這個方法提供了非常靈活的方式來定義新的繪圖區域的位置和大小,也可以用來創建具有不同坐標系的子圖。通過調整參數,可以精確控制新坐標軸的位置、尺寸及其與其他元素的關系。
plt.axes()
方法的參數如下:
參數 | 類型 | 默認值 | 描述 |
---|---|---|---|
arg | list or tuple or None | None | 定義新坐標軸的位置和大小。 - 當為 None 時,創建一個與默認坐標軸重疊的新坐標軸。- 當為 [left, bottom, width, height] 列表或元組時,分別指定新坐標軸距離畫布左邊、底部的距離以及寬度和高度的比例(0到1之間)。 |
projection | str or None | None | 指定坐標軸的投影類型。例如 'polar' 表示極坐標系。 |
polar | bool | False | 如果為 True ,則使用極坐標系。此參數是為了向后兼容性而保留的;推薦直接使用 projection='polar' 。 |
sharex , sharey | Axes object or None | None | 與其它坐標軸共享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以科學計數法表示1E6 | useOffset , useMathText | ax.xaxis.set_major_formatter(ScalarFormatter(useMathText=True)) |
LogFormatter | 對數格式器,基于對數刻度值顯示刻度標簽 | - | ax.xaxis.set_major_formatter(LogFormatter()) |
LogFormatterExponent | 對數刻度指數格式器,以指數表示形式顯示刻度標簽 | labelOnlyBase | ax.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()
方法參數介紹:
參數 | 類型 | 說明 |
---|---|---|
axis | str | 指定要設置哪個軸上的刻度參數。可選值有 'x' , 'y' , 和 'both' (默認)。 |
which | str | 設置哪些刻度被影響。選項包括 'major' , 'minor' , 'both' (默認)。 |
direction | str | 刻度方向。選項包括 'in' , 'out' , 'inout' (默認是 'out' )。 |
length | float | 刻度線的長度(以點為單位)。 |
width | float | 刻度線的寬度(以點為單位)。 |
color | color | 刻度線的顏色。可以是任何 Matplotlib 支持的顏色格式。 |
pad | float | 刻度標簽與刻度線之間的距離(以點為單位)。 |
labelsize | float/str | 刻度標簽字體大小。也可以是相對大小如 'smaller' , 'x-large' 等。 |
labelcolor | color | 刻度標簽顏色。 |
colors | color | 一次性設置刻度線、刻度標簽顏色等所有支持顏色的屬性。 |
bottom | bool | 如果為 True,則繪制位于軸底部的刻度。 |
top | bool | 如果為 True,則繪制位于軸頂部的刻度。 |
left | bool | 如果為 True,則繪制位于軸左側的刻度。 |
right | bool | 如果為 True,則繪制位于軸右側的刻度。 |
labelbottom | bool | 控制是否顯示 x 軸底部的刻度標簽。 |
labeltop | bool | 控制是否顯示 x 軸頂部的刻度標簽。 |
labelleft | bool | 控制是否顯示 y 軸左側的刻度標簽。 |
labelright | bool | 控制是否顯示 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()
方法參數
參數 | 類型 | 默認值 | 描述 |
---|---|---|---|
b | bool | 無 | 如果為 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()
繪制的圖形如下圖所示: