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

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")

异常效果

Y轴次要刻度显示异常

问题原因与解决方法

原因

AutoMinorLocator依赖Matplotlib自动识别主刻度区间,当手动设置主刻度(plt.yticks())的顺序在次要刻度设置之前时,可能导致自动识别逻辑失效,无法正确生成全轴的次要刻度。此外,AutoMinorLocator(n=2)的计算逻辑在手动指定主刻度时,可能因主刻度起始值的偏移(如从10开始)出现适配问题。

解决方法

推荐使用MultipleLocator手动指定次要刻度步长,精度更高且适配手动主刻度场景:

  1. 导入MultipleLocator:
from matplotlib.ticker import MultipleLocator
  1. 替换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:00:54