Matplotlib绘制正态分布时自定义X轴不显示问题求助
修复Matplotlib中移除所有轴后X轴无法显示的问题
问题出在ax.axis('off')这个操作——它不仅会隐藏所有坐标轴的spine,还会禁用刻度(ticks)和刻度标签(tick labels)的显示,所以你后续仅恢复底部spine的可见性,刻度和标签还是处于关闭状态,自然看不到完整的X轴样式。
下面是两种可行的修复方案:
方案1:精准控制不需要的轴(推荐)
不用一次性关闭所有轴,而是逐个隐藏不需要的spine和坐标轴元素,更灵活可控:
import numpy as np from scipy.stats import norm from matplotlib import rcParams import matplotlib.pyplot as plt import matplotlib as mpl # 恢复默认参数并支持希腊符号 rcParams.update(mpl.rcParamsDefault) mean = 0 standard_deviation = 1 num_points = 10**6 # 生成绘图数据 x = np.linspace(mean - 3*standard_deviation, mean + 3*standard_deviation, num_points) kde = norm.pdf(x, mean, standard_deviation) # 生成X轴刻度(覆盖±4σ范围) num_std_ticks = 4 ticks = np.arange(mean - num_std_ticks * standard_deviation, mean + (num_std_ticks + 1) * standard_deviation, standard_deviation) plt.plot(x, kde) plt.suptitle("Normal Distribution", fontsize=14, fontweight='bold', y=1) plt.title("(Empirical Rule)", fontsize=12, x=0.5, y=1.025) plt.text(0.5, 1, r'$\mu = ' + str(mean) + r',\sigma = ' + str(standard_deviation) + r'$', transform=plt.gca().transAxes, ha='center', fontsize=10) ax = plt.gca() # 仅保留底部spine,隐藏其他三个 ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) ax.spines['left'].set_visible(False) # 关闭Y轴的刻度和标签 ax.yaxis.set_ticks([]) ax.yaxis.set_ticklabels([]) # 设置X轴刻度 ax.set_xticks(ticks) # 可选:自定义刻度标签为μ±nσ格式 # ax.set_xticklabels([f'$\mu-{abs(tick)}\sigma$' if tick <0 else f'$\mu+{tick}\sigma$' if tick>0 else '$\mu$' for tick in ticks]) plt.show()
方案2:从ax.axis('off')恢复X轴
如果一定要保留ax.axis('off')的操作,需要手动恢复X轴的刻度、标签和可见性:
# ... 前面的代码保持不变 ... ax = plt.gca() ax.axis('off') # 恢复底部spine ax.spines['bottom'].set_visible(True) # 恢复X轴的可见性(包括刻度和标签) ax.xaxis.set_visible(True) # 设置刻度位置和刻度值 ax.xaxis.set_ticks_position('bottom') ax.set_xticks(ticks) plt.show()
关键说明
ax.axis('off')会将ax.xaxis和ax.yaxis的visible属性设为False,所以必须用ax.xaxis.set_visible(True)才能完整恢复X轴显示- 方案1的优势在于避免了全局关闭再恢复的副作用,更适合精细化控制坐标轴样式
内容的提问来源于stack exchange,提问作者nsinghphd
相关产品推荐
相关产品推荐

