如何为两个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
相关产品推荐
相关产品推荐

