Matplotlib Y轴次要刻度显示异常问题求助
Matplotlib Y轴次要刻度显示异常问题
问题描述
设置AutoMinorLocator(n=2)后,预期每个Y轴主刻度之间显示1个次要刻度,但实际仅Y轴底部有次要刻度,中间和顶部均无显示。
相关代码
import numpy as np import matplotlib.pyplot as plt import pandas as pd from matplotlib.ticker import (AutoMinorLocator) from matplotlib.pyplot import figure minor_locator = AutoMinorLocator(n=2) #a je 2-->1 a_1_2 = np.array([0,12.3787177960363,0,12.3787177960363,0,0,0,13.4102776123727,0,0,0,13.4102776123727,0,10.3155981633636,0,10.3155981633636,0,14.441837428709,0,14.441837428709,0,15.4733972450454,0,15.4733972450454,0,13.4102776123727,0,20.6311963267272,0,20.6311963267272,0,0,0,18.5680766940545,0,18.5680766940545]) a_1_2[a_1_2==0] = np.nan #b je 1-->2 b_1_2 = np.array([12.3787177960363,0,12.3787177960363,0,13.4102776123727,0,0,0,13.4102776123727,0,0,0,10.3155981633636,0,10.3155981633636,0,14.441837428709,0,14.441837428709,0,15.4733972450454,0,15.4733972450454,0,13.4102776123727,0,20.6311963267272,0,20.6311963267272,0,18.5680766940545,0,0,0,18.5680766940545,0]) b_1_2[b_1_2==0] = np.nan #c je 2-->3 c = np.array([0,0,0,0,0,13.4102776123727,0,0,0,13.4102776123727,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18.5680766940545,0,0,0,0]) c[c==0] = np.nan #d je 3-->2 d = np.array([0,0,0,0,0,0,13.4102776123727,0,0,0,13.4102776123727,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18.5680766940545,0,0,0]) d[d==0] = np.nan vykon_1_2 = np.array([70,37,68,33,62,131,125,21,58,118,114,19,64,21,60,21,90,78,80,71,74,71,70,70,82,54,75,44,68,61,70,129,123,56,71,53]) a_1_04 = np.array([0,16.480541444427,0,16.480541444427,0,13.7337845370225,0,13.7337845370225,0,10.987027629618,0,10.987027629618,0,0,8.24027072221352,16.480541444427,0,0,15.1071629907248,0,15.1071629907248,0,19.2272983518315,0,12.3604060833203,0,9.61364917591577]) a_1_04[a_1_04==0] = np.nan b_1_04 = np.array([16.480541444427,0,16.480541444427,0,16.480541444427,0,13.7337845370225,0,13.7337845370225,0,10.987027629618,0,10.987027629618,8.24027072221352,0,0,16.480541444427,15.1071629907248,0,15.1071629907248,0,19.2272983518315,0,12.3604060833203,0,9.61364917591577,0]) b_1_04[b_1_04==0] = np.nan vykon_1_04 = np.array([80,44,65,44,67,36,78,36,79,60,79,61,80,99,90,54,70,85,39,85,39,72,67,102,48,128,127]) a_0_8 = np.array([0,27.8521150410817,0,27.8521150410817,0,32.4941342145953,0,32.4941342145953]) a_0_8[a_0_8==0] = np.nan b_0_8 = np.array([27.8521150410817,0,27.8521150410817,0,32.4941342145953,0,32.4941342145953,0]) b_0_8[b_0_8==0] = np.nan vykon_0_8 = np.array([105,100,101,97,97,95,98,94]) R_a_1_2 = 1.78*a_1_2*1.2e-3/(5.04e-5) R_b_1_2 = 1.78*b_1_2*1.2e-3/(5.04e-5) R_a_1_04 = 1.78*a_1_04*1.04e-3/(5.04e-5) R_b_1_04 = 1.78*b_1_04*1.04e-3/(5.04e-5) R_a_0_8 = 1.78*a_0_8*0.8e-3/(5.04e-5) R_b_0_8 = 1.78*b_0_8*0.8e-3/(5.04e-5) a_1_2 = pd.DataFrame(a_1_2) b_1_2 = pd.DataFrame(b_1_2) c = pd.DataFrame(c) d = pd.DataFrame(d) R_a_1_2 = pd.DataFrame(R_a_1_2) R_b_1_2 = pd.DataFrame(R_b_1_2) vykon_1_2 = pd.DataFrame(vykon_1_2) a_1_04 = pd.DataFrame(a_1_04) b_1_04 = pd.DataFrame(b_1_04) R_a_1_04 = pd.DataFrame(R_a_1_04) R_b_1_04 = pd.DataFrame(R_b_1_04) vykon_1_04 = pd.DataFrame(vykon_1_04) a_0_8 = pd.DataFrame(a_0_8) b_0_8 = pd.DataFrame(b_0_8) R_a_0_8 = pd.DataFrame(R_a_0_8) R_b_0_8 = pd.DataFrame(R_b_0_8) vykon_0_8 = pd.DataFrame(vykon_0_8) data_1_2 = pd.concat([vykon_1_2, a_1_2,b_1_2,c,d], axis = 1) data_1_04 = pd.concat([vykon_1_04, a_1_04,b_1_04], axis = 1) data_0_8 = pd.concat([vykon_0_8, a_0_8,b_0_8], axis = 1) data_R_1_2 = pd.concat([vykon_1_2, R_a_1_2,R_b_1_2,], axis = 1) data_R_1_04 = pd.concat([vykon_1_04, R_a_1_04,R_b_1_04], axis = 1) data_R_0_8 = pd.concat([vykon_0_8, R_a_0_8,R_b_0_8], axis = 1) fig, ax = plt.subplots(figsize=(8,5), dpi = 100) plt.ylabel('Výkon [W]') plt.xlabel('Rychlost plynu [m/s]') ax.plot(data_1_2.iloc[:,2],data_1_2.iloc[:,0],"v", color="#000000", label = "1,2 mm průměr") ax.plot(data_1_04.iloc[:,2],data_1_04.iloc[:,0],"s", color="#ff0000", label = "1,04 mm průměr") ax.plot(data_0_8.iloc[:,2],data_0_8.iloc[:,0],"o", color="#0000ff", label = "0,8 mm průměr") ax.legend() plt.yticks(np.arange(10,130+1, step=20)) ax.yaxis.set_minor_locator(minor_locator) plt.xticks(np.arange(5, 35+1, step=2.5)) ax.xaxis.set_minor_locator(minor_locator) plt.savefig("prechod_z_1_na_2.pdf")
异常效果

问题原因与解决方法
原因
AutoMinorLocator依赖Matplotlib自动识别主刻度区间,当手动设置主刻度(plt.yticks())的顺序在次要刻度设置之前时,可能导致自动识别逻辑失效,无法正确生成全轴的次要刻度。此外,AutoMinorLocator(n=2)的计算逻辑在手动指定主刻度时,可能因主刻度起始值的偏移(如从10开始)出现适配问题。
解决方法
推荐使用MultipleLocator手动指定次要刻度步长,精度更高且适配手动主刻度场景:
- 导入
MultipleLocator:
from matplotlib.ticker import MultipleLocator
- 替换Y轴次要刻度设置代码:
plt.yticks(np.arange(10,130+1, step=20)) # 主刻度步长为20,次要刻度设为10,正好在主刻度中间 ax.yaxis.set_minor_locator(MultipleLocator(10))
或者调整设置顺序,先设置次要刻度再设置主刻度:
ax.yaxis.set_minor_locator(minor_locator) plt.yticks(np.arange(10,130+1, step=20))
两种方法都能保证Y轴每个主刻度间显示1个次要刻度,解决仅底部显示的问题。
内容的提问来源于stack exchange,提问作者Jan K
相关产品推荐
相关产品推荐

