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

Matplotlib右侧Y轴无法设置中间刻度?如何用代码添加?

解决Matplotlib副Y轴无中间刻度的问题

问题重现

运行以下代码后,右侧Y轴仅显示最值刻度,缺少中间刻度:

# 1. 导入绘图所需模块
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd

# 2. 创建绘图数据
df=pd.DataFrame({'close':np.random.uniform(19, 36, 200)})

# 3. 创建画布与轴对象并绘图
fig, ax = plt.subplots()
ax.plot(df.index,df['close'])

# 4. 计算X轴、左侧Y轴、右侧Y轴的最值
xmin,xmax = df.index[0],df.index[-1]
p_min,p_max = min(df['close']),max(df['close'])
c_min,c_max = 100*p_min/p_max,100

# 5. 使用secondary_yaxis方法创建右侧轴
t_price_change = lambda t_p: 100* t_p/p_max
t_change_price = lambda t_c: t_c*p_max /100    
ax_right = ax.secondary_yaxis("right", functions=(t_price_change, t_change_price))

# 6. 创建各轴刻度
ticks_x = np.append(ax.get_xticks(), (xmin,xmax))
ticks_yleft =  np.append(ax.get_yticks(), (p_min,p_max))
ticks_yright = np.append(ax_right.get_yticks(), (c_min,c_max))

# 7. 设置各轴刻度
ax.set_xticks(ticks_x)
ax.set_yticks(ticks_yleft)
ax_right.set_yticks(ticks_yright)

# 8. 设置轴范围
ax.set_xlim(xmin, xmax)
ax.set_ylim(p_min, p_max)
ax_right.set_ylim(c_min, c_max)

# 9. 展示图像
plt.show()

问题原因

原代码中ax_right.get_yticks()在副轴刚创建时,尚未根据设定范围生成合适的中间刻度,返回的刻度数组为空或仅包含默认值,导致最终ticks_yright只有最值刻度,没有中间刻度。

解决方案

方法一:直接生成右侧均匀刻度

基于右侧Y轴的范围(c_min到c_max),用np.linspace生成均匀分布的刻度,替换原步骤6、7中右侧刻度的代码:

# 6. 创建各轴刻度
ticks_x = np.append(ax.get_xticks(), (xmin,xmax))
ticks_yleft = np.append(ax.get_yticks(), (p_min,p_max))
# 生成右侧Y轴的中间刻度,这里设置为5个刻度(包含最值)
ticks_yright = np.linspace(c_min, c_max, 5)

# 7. 设置各轴刻度
ax.set_xticks(ticks_x)
ax.set_yticks(ticks_yleft)
ax_right.set_yticks(ticks_yright)

方法二:基于左侧刻度转换生成右侧刻度

利用左右轴的线性转换关系,将左侧Y轴的所有刻度转换为右侧对应的刻度值,确保左右刻度完全对应:

# 6. 创建各轴刻度
ticks_x = np.append(ax.get_xticks(), (xmin,xmax))
ticks_yleft = np.append(ax.get_yticks(), (p_min,p_max))
# 将左侧刻度转换为右侧刻度
ticks_yright = t_price_change(ticks_yleft)

# 7. 设置各轴刻度
ax.set_xticks(ticks_x)
ax.set_yticks(ticks_yleft)
ax_right.set_yticks(ticks_yright)

完整修正代码示例(方法二)

from matplotlib import pyplot as plt
import numpy as np
import pandas as pd

df=pd.DataFrame({'close':np.random.uniform(19, 36, 200)})

fig, ax = plt.subplots()
ax.plot(df.index,df['close'])

xmin,xmax = df.index[0],df.index[-1]
p_min,p_max = min(df['close']),max(df['close'])
c_min,c_max = 100*p_min/p_max,100

t_price_change = lambda t_p: 100* t_p/p_max
t_change_price = lambda t_c: t_c*p_max /100    
ax_right = ax.secondary_yaxis("right", functions=(t_price_change, t_change_price))

ticks_x = np.append(ax.get_xticks(), (xmin,xmax))
ticks_yleft = np.append(ax.get_yticks(), (p_min,p_max))
ticks_yright = t_price_change(ticks_yleft)

ax.set_xticks(ticks_x)
ax.set_yticks(ticks_yleft)
ax_right.set_yticks(ticks_yright)

ax.set_xlim(xmin, xmax)
ax.set_ylim(p_min, p_max)
ax_right.set_ylim(c_min, c_max)

plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:17:32