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
相关产品推荐
相关产品推荐

