【Python 可视化】x 、y 轴截断图

Python 城市风 5/30/2024 774 次 0 条

在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库

另一种方法是使用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值范围内绘制数据变得简单。