You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python放大matplotlib箱线图y轴0-20区间?

实现箱线图局部y轴放大的两种方案

当然可以实现!你遇到的这个问题,用Matplotlib的断裂轴(broken axis)或者局部放大子图就能完美解决——对数轴不适用是因为你的数据包含0,对数轴无法处理0值,咱们换个思路就行。下面给你两种具体的实现方法:

方案一:断裂轴(Broken Y-Axis)

这种方法是把y轴分成两段,一段专门展示0-20的区间,另一段展示20以上的部分,用视觉断裂的方式区分,既保留整体数据的展示,又放大了细节区间。

示例代码如下:

import matplotlib.pyplot as plt
import numpy as np

# 模拟你的箱线图数据,假设第二个箱体数值集中在0-20之间
data = [
    np.random.normal(50, 15, 100),
    np.random.normal(10, 5, 100),  # 第二个箱体数据集中在0-20
    np.random.normal(60, 20, 100)
]

# 创建画布和两个子图,上下排列
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6), sharex=True)
fig.subplots_adjust(hspace=0.05)  # 减小子图间距

# 在上方子图绘制0-20区间的箱线图
ax1.boxplot(data)
ax1.set_ylim(0, 20)  # 限制y轴范围在0-20
ax1.spines.bottom.set_visible(False)  # 隐藏下方边框
ax1.tick_params(axis='x', bottom=False)  # 隐藏x轴刻度

# 在下方子图绘制20以上区间的箱线图
ax2.boxplot(data)
ax2.set_ylim(20, 100)  # 限制y轴范围在20-100
ax2.spines.top.set_visible(False)  # 隐藏上方边框

# 添加断裂标记(斜线)
d = .5  # 斜线长度
kwargs = dict(marker=[(-1, -d), (1, d)], markersize=12,
              linestyle="none", color='k', mec='k', mew=1, clip_on=False)
ax1.plot([0, 1], [0, 0], transform=ax1.transAxes, **kwargs)
ax2.plot([0, 1], [1, 1], transform=ax2.transAxes, **kwargs)

# 设置标题和标签
plt.suptitle('Boxplot with Broken Y-Axis (0-20 Zoomed)')
ax2.set_xticklabels(['Group 1', 'Group 2', 'Group 3'])

plt.show()

方案二:局部放大子图(Inset Axes)

如果不想拆分y轴,可以在主图的某个角落添加一个小的子图,专门放大0-20的区间,这样既能看到整体数据,又能聚焦细节。

示例代码:

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
import numpy as np

# 同样使用模拟数据
data = [
    np.random.normal(50, 15, 100),
    np.random.normal(10, 5, 100),
    np.random.normal(60, 20, 100)
]

fig, ax = plt.subplots(figsize=(8, 6))
ax.boxplot(data)
ax.set_title('Boxplot with Inset Zoom (0-20)')
ax.set_xticklabels(['Group 1', 'Group 2', 'Group 3'])

# 创建局部放大子图,位置在右上角
ax_inset = inset_axes(ax, width="30%", height="30%", loc='upper right')
ax_inset.boxplot(data)
ax_inset.set_ylim(0, 20)  # 放大0-20区间
# 隐藏子图的x轴标签,避免重复
ax_inset.set_xticklabels([])

plt.show()

这两种方法都能帮你清晰展示第二个箱体的细节,你可以根据自己的需求选择其中一种。如果你的实际数据有特殊格式,只需要把示例中的data替换成你自己的数据集就行。

内容的提问来源于stack exchange,提问作者dani_anyman

火山引擎 最新活动