You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为两个Matplotlib子图设置相同数量的刻度?

解决Matplotlib双水平条形图刻度数量不一致的问题

首先得揪出问题的根源:你对Matplotlib里ticks_params和locator_params的作用理解错啦!

  • axes.ticks_params(nbins=...)这个参数只对colorbar生效,完全不会改变坐标轴的刻度数量!第一个子图看起来刻度符合预期,其实是因为你后面手动调用了set_xticklabels(x),用x列表里的5个标签覆盖了默认刻度,和你写的nbins=6半毛钱关系都没有。
  • 第二个子图用locator_params(nbins=6)是正确设置坐标轴刻度数量的方式,但因为和第一个子图的手动设置逻辑不一致,所以才会出现刻度数量不匹配的情况。

下面给你两种统一刻度的解决方案,选一种适合你的就行:

方案一:统一手动指定刻度和标签(和第一个子图逻辑对齐)

既然第一个子图是手动指定刻度标签,那第二个子图也照搬这套逻辑,确保两者完全一致:

import matplotlib.pyplot as plt
import numpy as np

# 原代码保留,修改第二个子图的刻度设置部分
fig, (axes1, axes2) = plt.subplots(nrows=1, ncols=2, sharex=False, sharey=False, figsize=(15,10))
labels = list(out.index)
x = ["20%", "40%", "60%", "80%", "100%"]
y = np.arange(len(out))
width = 0.5

# 第一个子图(保留你的逻辑,顺便去掉没用的ticks_params)
axes1.barh(y, female_distr, width, color="olive", align="center", alpha=0.8)
# 去掉axes1.ticks_params(nbins=6),这个完全没用
axes1.set_yticks(y)
axes1.set_yticklabels(labels)
# 手动设置x轴刻度位置(假设你的数据是0-100的百分比)
axes1.set_xticks(np.linspace(0, 100, len(x)))
axes1.set_xticklabels(x)
axes1.yaxis.grid(False)
axes1.set_xlabel("Occurence (%)")
axes1.set_ylabel("Language")
axes1.set_title("Language Distribution (Women)")

# 第二个子图(和第一个子图刻度逻辑统一)
axes2.barh(y, male_distr, width, color="chocolate", align="center", alpha=0.8)
# 去掉axes2.locator_params(nbins=6),换成和第一个子图一样的手动设置
axes2.set_yticks(y)
axes2.set_yticklabels(labels)
axes2.set_xticks(np.linspace(0, 100, len(x)))
axes2.set_xticklabels(x)
axes2.yaxis.grid(False)
axes2.set_xlabel("Occurence (%)")
axes2.set_ylabel("Language")
axes2.set_title("Language Distribution (Men)")

plt.tight_layout()
plt.show()

方案二:统一使用定位器控制刻度数量(更适合动态数据)

如果你的数据可能变化,不想手动写死刻度标签,那两个子图都用locator_params来控制刻度数量,确保参数完全一致:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import PercentFormatter

fig, (axes1, axes2) = plt.subplots(nrows=1, ncols=2, sharex=False, sharey=False, figsize=(15,10))
labels = list(out.index)
y = np.arange(len(out))
width = 0.5

# 第一个子图:用locator_params统一控制刻度数量
axes1.barh(y, female_distr, width, color="olive", align="center", alpha=0.8)
# 指定x轴设置6个刻度,避免影响y轴
axes1.locator_params(axis='x', nbins=6)
axes1.set_yticks(y)
axes1.set_yticklabels(labels)
# 自动转换为百分比标签(如果你的数据是0-1的小数,就用PercentFormatter(1);是0-100就用PercentFormatter())
axes1.xaxis.set_major_formatter(PercentFormatter(1))
axes1.yaxis.grid(False)
axes1.set_xlabel("Occurence (%)")
axes1.set_ylabel("Language")
axes1.set_title("Language Distribution (Women)")

# 第二个子图:和第一个子图用完全相同的刻度设置
axes2.barh(y, male_distr, width, color="chocolate", align="center", alpha=0.8)
axes2.locator_params(axis='x', nbins=6)
axes2.set_yticks(y)
axes2.set_yticklabels(labels)
axes2.xaxis.set_major_formatter(PercentFormatter(1))
axes2.yaxis.grid(False)
axes2.set_xlabel("Occurence (%)")
axes2.set_ylabel("Language")
axes2.set_title("Language Distribution (Men)")

plt.tight_layout()
plt.show()

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:49:34