如何在Matplotlib子图Y轴用字母替换数值标签?
自定义Matplotlib Y轴刻度标签为字母/符号
没问题!要把Matplotlib Y轴的数值标签替换成你想要的-V₀、0、V₀这类自定义符号,最通用的方法就是手动指定刻度位置和对应的标签文本。下面是针对你的代码的具体修改方案:
核心方法
使用Matplotlib轴对象的两个关键方法:
set_yticks():定义要显示刻度的数值位置set_yticklabels():给每个刻度位置分配自定义的文本标签(支持LaTeX语法渲染下标、特殊符号)
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt # 示例参数(你可以替换成自己的实际值) ang_freq = 2 * np.pi times = np.linspace(0, 2, 1000) v1 = np.sin(ang_freq * times) # V_0sin(wt) v2 = ang_freq * np.cos(ang_freq * times) fig, axs = plt.subplots(2, sharex=True) fig.suptitle('Sinusoidal driving wave') # 处理输入电压子图(V1) axs[0].plot(times, v1) axs[0].set_title('Input voltage $V_1$') axs[0].set_ylabel('Voltage / V') axs[0].autoscale(enable=True, axis='x', tight=True) # 自定义Y轴刻度:把-1.0、0、1.0替换为-$V_0$、0、$V_0$ axs[0].set_yticks([-1.0, 0.0, 1.0]) axs[0].set_yticklabels(['-$V_0$', '0', '$V_0$']) # 处理输出电压子图(V2) axs[1].plot(times, v2) axs[1].set_title('Output voltage $V_2$') axs[1].set_ylabel('Voltage / V') axs[1].autoscale(enable=True, axis='x', tight=True) # V2的极值是±ang_freq,对应替换为-$V_0$、0、$V_0$ v2_scale = [-ang_freq, 0, ang_freq] axs[1].set_yticks(v2_scale) axs[1].set_yticklabels(['-$V_0$', '0', '$V_0$']) plt.xlabel('Times / s') plt.show()
扩展:保留中间刻度并替换
如果你希望保留-0.5、0.5这些中间刻度,同时替换成对应的标签(比如-$V_0$/2、$V_0$/2),只需要扩展刻度和标签列表即可:
# 针对V1替换所有提到的刻度值 axs[0].set_yticks([-1.0, -0.5, 0.0, 0.5, 1.0]) axs[0].set_yticklabels(['-$V_0$', '-$V_0$/2', '0', '$V_0$/2', '$V_0$'])
注意事项
- 确保
set_yticks的位置数量和set_yticklabels的标签数量完全匹配,否则会触发报错 - 用
$...$包裹LaTeX语法可以让下标V_0渲染得更规范,和你图表标题的格式保持统一 - 对于V2这类极值不是±1的曲线,通过动态获取极值(或直接使用
-ang_freq、ang_freq)设置刻度,能让代码更通用
内容的提问来源于stack exchange,提问作者jp88357
相关产品推荐
相关产品推荐

