趋近智
Matplotlib 默认会合理地设置坐标轴范围以包含你的数据。然而,在许多情况下,你可能希望手动控制这些范围。你可能需要:
Matplotlib 提供了简单函数来调整 X 轴和 Y 轴的范围。
xlim 和 ylim设置坐标轴范围的主要方式取决于你是直接使用 pyplot 接口,还是使用带有 Axes 对象的面向对象方法。
1. pyplot 接口
如果你直接使用 matplotlib.pyplot 中的函数(通常导入为 plt)创建简单图表,你可以使用 plt.xlim() 和 plt.ylim()。
import matplotlib.pyplot as plt
import numpy as np
# 示例数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
plt.title("正弦波 - 默认范围")
plt.xlabel("X 值")
plt.ylabel("sin(X)")
plt.show() # 显示使用默认范围的图表
# 现在,设置特定范围
plt.plot(x, y)
plt.title("正弦波 - 自定义范围")
plt.xlabel("X 值")
plt.ylabel("sin(X)")
# 设置 X 轴范围从 2 到 8
plt.xlim(2, 8)
# 设置 Y 轴范围从 -0.5 到 0.5
plt.ylim(-0.5, 0.5)
plt.show() # 显示使用自定义范围的图表
plt.xlim() 和 plt.ylim() 函数各自接受两个参数:相应坐标轴的最小和最大所需范围。
2. 面向对象接口
如“Matplotlib 图表结构”一节所述,使用面向对象方法可以提供更多控制,尤其是在有多个子图时。当你有一个 Axes 对象(通常命名为 ax)时,你可以使用其方法:ax.set_xlim() 和 ax.set_ylim()。
import matplotlib.pyplot as plt
import numpy as np
# 示例数据
x = np.linspace(0, 10, 100)
y = np.cos(x) # 本次使用余弦函数
# 创建图形和坐标轴对象
fig, ax = plt.subplots()
# 在坐标轴上绘制数据
ax.plot(x, y)
ax.set_title("余弦波 - 自定义范围 (OO)")
ax.set_xlabel("X 值")
ax.set_ylabel("cos(X)")
# 设置 X 轴范围从 0 到 5
ax.set_xlim(0, 5)
# 设置 Y 轴范围从 -1 到 0
ax.set_ylim(-1, 0)
plt.show()
这种方法通常更受推荐,因为它更明确,并且能更好地应用于更复杂的图示。参数的使用方式与 pyplot 版本相同。
有时,你可能只想调整最小值或最大值,让 Matplotlib 自动确定另一个。你可以通过为希望自动确定的范围传入 None,或者使用关键字参数来实现这一点。
使用 None:
import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(50) * 10
y = np.random.rand(50) * 5
fig, ax = plt.subplots()
ax.scatter(x, y)
ax.set_title("散点图 - 调整下限")
ax.set_xlabel("随机 X")
ax.set_ylabel("随机 Y")
# 仅设置 X 轴下限(X 最小值为 0)
ax.set_xlim(0, None) # 或者 ax.set_xlim(left=0)
# 仅设置 Y 轴下限(Y 最小值为 1)
ax.set_ylim(bottom=1) # 或者 ax.set_ylim(1, None)
plt.show()
使用关键字参数(left、right、bottom、top):
import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(50) * 10
y = np.random.rand(50) * 5
fig, ax = plt.subplots()
ax.scatter(x, y)
ax.set_title("散点图 - 调整上限")
ax.set_xlabel("随机 X")
ax.set_ylabel("随机 Y")
# 仅设置 X 轴上限(X 最大值为 8)
ax.set_xlim(right=8)
# 仅设置 Y 轴上限(Y 最大值为 4)
ax.set_ylim(top=4)
plt.show()
让我们看看设置坐标轴范围如何有助于聚焦数据的特定部分。我们将绘制一些在某个区域有集中分布的数据,并使用 set_xlim 和 set_ylim 进行局部放大。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd # 使用 pandas 方便数据处理
# 生成一些具有密集数据点的数据
np.random.seed(42) # 用于结果重现
data = pd.DataFrame({
'x': np.random.normal(loc=5, scale=2, size=200),
'y': np.random.normal(loc=3, scale=1, size=200)
})
# 添加一些更远处的稀疏点
data = pd.concat([data, pd.DataFrame({
'x': np.random.uniform(-5, 15, 20),
'y': np.random.uniform(-2, 8, 20)
})], ignore_index=True)
# --- 图 1:默认范围 ---
fig1, ax1 = plt.subplots(figsize=(6, 4))
ax1.scatter(data['x'], data['y'], alpha=0.6, color='#228be6') # 蓝色
ax1.set_title("默认坐标轴范围的数据")
ax1.set_xlabel("特征 X")
ax1.set_ylabel("特征 Y")
ax1.grid(True, linestyle='--', alpha=0.5)
plt.show()
# --- 图 2:自定义范围 ---
fig2, ax2 = plt.subplots(figsize=(6, 4))
ax2.scatter(data['x'], data['y'], alpha=0.6, color='#228be6') # 蓝色
ax2.set_title("自定义范围聚焦的数据")
ax2.set_xlabel("特征 X")
ax2.set_ylabel("特征 Y")
# 设置范围以聚焦 x=5, y=3 附近的主要数据组
ax2.set_xlim(0, 10)
ax2.set_ylim(0, 6)
ax2.grid(True, linestyle='--', alpha=0.5)
plt.show()
# --- Plotly 交互式版本 ---
# (动态展示效果,但此处无法直接运行)
# 此 JSON 表示第二个图表(聚焦的)
```plotly
{"layout": {"title": "自定义范围聚焦的数据 (Plotly)", "xaxis": {"title": "特征 X", "range": [0, 10], "gridcolor": "#dee2e6"}, "yaxis": {"title": "特征 Y", "range": [0, 6], "gridcolor": "#dee2e6"}, "width": 600, "height": 400, "plot_bgcolor": "#e9ecef"}, "data": [{"type": "scatter", "mode": "markers", "x": [5.99342831, 4.7234714, 5.29537708, 7.04605971, 3.53169325, 5.53178596, 5.88193508, 4.73106404, 4.67904912, 3.1129166, 5.15443918, 3.73796791, 4.41137694, 3.89192033, 5.30875361, 6.07371768, 2.9903949, 6.15729178, 5.18807565, 5.19967068, 3.47603678, 5.17939696, 2.86186388, 3.37494904, 6.31116861, 3.08974181, 4.96868498, 6.44724269, 4.40152448, 3.33313626, 4.06413627, 6.2114819, 3.40800185, 5.76103768, 6.23129146, 5.46007955, 5.44128025, 6.32969017, 3.57759154, 3.07656328, 5.02333502, 7.00475885, 6.21870665, 4.02990718, 5.19598151, 4.93057701, 2.56752764, 3.80027069, 4.62414199, 5.45919274, 2.94948242, 7.71158868, 3.42573621, 7.9322453, 6.1987419, 2.53543463, 3.82278924, 4.23064537, 6.33126328, 5.6833387, 5.36415735, 5.30629247, 3.03136103, 3.80044622, 4.54288611, 6.24660957, 6.14677797, 6.38478059, 3.31508899, 5.26495647, 5.41605859, 5.18461864, 4.22907593, 5.3172371, 5.83898644, 5.51669339, 4.39317192, 4.6116638, 5.75667008, 4.50781731, 2.20375605, 4.36759876, 4.88962333, 5.30392731, 4.92317364, 4.74515108, 7.02684599, 5.28114768, 4.8219325, 5.7048188, 6.11509506, 2.95546685, 4.24919914, 2.85729161, 3.91515227, 4.80378575, 5.05445153, 6.37316539, 5.88448027, 6.65884813, 4.81836102, 3.84347076, 4.61057746, 4.01604999, 3.83041876, 2.21704911, 5.94883436, 7.38314519, 5.08625671, 6.33463028, 4.5134659, 5.45920396, 4.59389813, 4.15854653, 5.61721678, 3.38644216, 5.26777027, 4.23377341, 7.85446908, 6.02220342, 4.26903219, 4.65607024, 2.48462532, 3.1543206, 5.29584324, 6.05542407, 6.99834276, 4.35921964, 4.74826596, 4.08606821, 3.0065799, 4.96583696, 4.9427689, 7.68897174, 5.86605737, 6.34930996, 2.00103307, 5.9749268, 3.83767966, 5.01875477, 5.3218687, 7.40712306, 4.41588695, 3.3965872, 5.05865075, 4.14241682, 5.03946585, 4.89912807, 3.38922787, 3.79301851, 2.21521497, 4.74672081, 5.30029186, 4.4403457, 5.18014435, 3.98927397, 7.31719726, 4.52615615, 5.43588608, 5.18706783, 5.54913716, 3.91256357, 4.58784245, 7.33256269, 4.87834265, 3.11069516, 5.95309955, 5.36223027, 3.20420008, 5.52994169, 2.86200514, 5.87450577, 4.08791362, 5.65019723, 7.75618655, 5.12622647, 3.76590953, 6.96342985, 4.94736567, 3.01605378, 7.12971742, 4.11322524, 5.13187434, 4.60168775, 7.01912021, 2.76351486, 2.13726149, 3.37387813, 3.89389036, 4.34267421, 3.51175597, 6.76778929, 3.51450354, 4.81894493, 7.17438023, 8.1211046, -4.64509123, -1.89343733, 13.3285109, 7.01487776, 8.4577438, 13.12138685, 13.06002212, 7.60516572, -3.89582248, 12.98003844, 1.23556089, 13.14776349, 11.83862029, -3.1083832, -3.5846578, 7.8735861, 14.43067622, 13.45166577, -4.3077043], "y": [2.99671423, 2.8617357, 3.64768854, 4.52302986, 2.76584663, 3.8858043, 3.83182732, 3.71632721, 3.33902766, 1.7327034, 3.07921276, 2.82486138, 3.36139582, 2.60932368, 3.69998546, 4.14882551, 2.19471129, 3.61828103, 3.2620926, 3.06446313, 2.82471867, 3.61649116, 2.46604413, 2.61673671, 3.75677219, 2.02641135, 3.1940303, 3.85089451, 2.70285945, 2.35639622, 2.77648717, 4.30018695, 2.35700329, 3.38594174, 3.9439049, 3.42763149, 3.55456096, 3.6331307, 2.70219197, 2.39762741, 3.24279199, 4.49806555, 4.06833808, 2.85658619, 3.28028166, 3.13209186, 1.90994304, 2.81007358, 3.06512335, 3.60034199, 2.16988391, 4.82522215, 2.6220075, 5.03542948, 3.81791827, 2.16172491, 2.89028059, 3.02728516, 4.03037102, 3.74345408, 3.66013937, 3.62846034, 2.29300413, 2.85566789, 3.25314452, 4.08217935, 4.02998815, 4.14555791, 2.5374788, 3.5873595, 3.72074093, 3.46576947, 2.98973041, 3.63804066, 3.90599091, 3.68475353, 2.95507178, 3.04707562, 3.86759482, 3.12115692, 1.65142368, 3.04046566, 3.37506503, 3.61136504, 3.32270932, 3.21006127, 4.55240113, 3.57480866, 3.25674793, 3.75171872, 3.95847457, 2.21485664, 3.01261749, 2.43455117, 2.86263509, 3.28022253, 3.40040893, 4.11062082, 3.90781253, 4.33703431, 3.27558396, 2.80243469, 3.16414065, 2.88689791, 2.80922924, 1.72453091, 3.96958335, 4.69670742, 3.41615714, 4.11164715, 3.07209557, 3.6536325, 3.08956666, 2.93304939, 3.70019193, 2.43021578, 3.5846021, 2.98488734, 4.96339057, 3.93970104, 2.99243413, 3.16969176, 1.91077529, 2.35292758, 3.58560264, 4.01249744, 4.49810307, 3.0259879, 3.21735184, 2.92537723, 2.24020143, 3.35297525, 3.33406348, 4.85335569, 3.89555497, 4.08801402, 1.60277109, 3.97963167, 2.79208358, 3.38110453, 3.60180289, 4.69698797, 3.03441102, 2.45036875, 3.39908167, 2.93891534, 3.39146328, 3.33406865, 2.4807182, 2.82710693, 1.77081884, 3.21011504, 3.60199328, 3.02757869, 3.48460469, 2.88213526, 4.64249243, 3.10075328, 3.68603027, 3.49782787, 3.7223756, 2.84576392, 3.13718257, 4.6563391, 3.34337932, 2.33054697, 3.96572785, 3.64602858, 2.37908052, 3.7062429, 2.43939233, 3.90639413, 2.92001477, 3.73980622, 4.8743766, 3.4607109, 2.78294593, 4.47400114, 3.34642603, 2.26461219, 4.55102355, 2.91660423, 3.45958134, 3.12379175, 4.49726814, 2.0485717, 1.72467339, 2.46815372, 2.84832245, 3.04930952, 2.63595258, 4.32918818, 2.63831377, 3.28429744, 4.57652829, -0.95023271, 2.70335848, -1.01469935, 3.73287184, -0.11605978, 7.82433383, 3.65875152, 6.44532446, -0.72200027, 4.11801331, 2.75295421, -0.11895329, 7.16958735, 0.7027769, 1.1314149, 5.50408347, 3.75467174, 5.8933783, 1.47469572], "marker": {"color": "#228be6", "opacity": 0.6}}]}
散点图显示数据分布。右侧的图表使用
set_xlim(0, 10)和set_ylim(0, 6)来放大密集区域,与左侧的默认视图(由生成fig1的代码表示)形成对比。
设置坐标轴范围是改善图表的基本方法,能让图表更清晰、更聚焦,更适合比较或展示。在创建更复杂的图示时,你会频繁使用 set_xlim 和 set_ylim。
这部分内容有帮助吗?
pyplot接口设置X轴限制的官方文档,包括参数和示例。plt.ylim函数具有类似的文档。Axes对象上设置X轴限制的方法,这是Matplotlib面向对象API的一部分,包括单独控制限制的选项。ax.set_ylim方法具有类似的文档。© 2026 ApX Machine Learning用心打造