在Matplotlib中,如果想要在y轴上仅显示特定的数据区间,而忽略其他区间,可以使用plt.ylim()来设定y轴的范围,但这种方法仅适用于连续的范围。对于非连续范围(例如,同时显示[50, 100]和[900, 1200]),Matplotlib 本身并不直接支持设置多个不连续的y轴范围。
不过,可以通过一些变通的方法来实现这一效果,比如通过绘制两个子图(subplots),每个子图设置不同的y轴范围,然后将它们放置在同一个图中,或者使用BrokenAxes这样的第三方库来创建断裂的轴。
以下是使用matplotlib的GridSpec来模拟非连续y轴范围的一个简单示例:
import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpec # 创建图表和网格 fig = plt.figure(figsize=(10, 6)) grid = GridSpec(2, 1, hspace=0, height_ratios=[4, 1]) # 调整高度比例以符合您的需求 # 创建第一个子图,显示[50, 100]区间 ax1 = fig.add_subplot(grid[0, 0]) ax1.plot([1, 2, 3, 4], [60, 70, 90, 80]) # 示例数据 ax1.set_ylim(50, 100) # 设置y轴范围 ax1.spines['bottom'].set_visible(False) # 隐藏底部轴线,因为会与下一个子图重叠 # 创建第二个子图,显示[900, 1200]区间 ax2 = fig.add_subplot(grid[1, 0], sharex=ax1) ax2.plot([1, 2, 3, 4], [950, 1050, 1150, 1100]) # 示例数据 ax2.set_ylim(900, 1200) # 设置y轴范围 # 可以选择隐藏上方子图的x轴标签和刻度,以避免重复 plt.setp(ax2.get_xticklabels(), visible=False) # 显示图表 plt.show()
在这个例子中,我们创建了两个子图,并分别设置了它们的y轴范围。第一个子图显示y值在[50, 100]范围内的数据,而第二个子图显示y值在[900, 1200]范围内的数据。注意,这种方法可能需要在布局和美观上进行一些调整,以确保两个子图在视觉上形成一个连贯的图表。
另一种方法是使用BrokenAxes库,这个库专门设计来处理断裂的轴或跳过的数据范围。不过,这不是Matplotlib的标准部分,需要单独安装。
安装BrokenAxes可以使用pip:
pip install brokenaxes
然后,可以使用BrokenAxes来创建一个具有断裂y轴的图表:
from brokenaxes import brokenaxes import matplotlib.pyplot as plt import numpy as np # 创建带有断裂y轴的图表 bax = brokenaxes(subplot_spec=None, despine=False, ylims=((50, 100), (900, 1200)), hspace=0.05) # 示例数据 x = np.linspace(0, 10, 100) y1 = 70 + 20 * np.sin(x) y2 = 1000 + 50 * np.sin(x) # 在断裂轴上绘图 bax.plot(x, y1, label='range 1') bax.plot(x, y2, label='range 2', linestyle=':') bax.legend(loc='best') plt.show()
在这个例子中,BrokenAxes负责处理y轴的不连续性,使得在不同的y值范围内绘制数据变得简单。