matplotlib调用set_yscale传float值报AttributeError如何解决
报错原因
你误用了set_yscale方法才会触发这个错误:
set_yscale()的作用是设置Y轴的缩放类型,仅接受字符串参数,比如传入"linear"使用线性刻度、"log"使用对数刻度,方法内部会对传入的参数调用.lower()做字符串标准化,你传入浮点型的strain_amplitude自然会抛出float对象没有lower方法的错误。- 你的实际需求是让第二个Y轴的刻度匹配动态变化的应变幅值,方便和第一个Y轴的应力数据做对比,这属于坐标轴范围、刻度值设置的场景,和缩放类型无关。
解决方案
两种实现方式都完全支持strain_amplitude为动态浮点值,无需硬编码:
方案1:直接按应变幅值设置第二个Y轴范围(适配绝大多数应力-应变循环绘图场景)
核心是用set_ylim设置第二个Y轴的上下限,用set_yticks自定义和应变幅值对齐的刻度点,修正后的可运行代码如下:
import matplotlib.pyplot as plt import numpy as np # 应变幅值为动态变量,运行时可根据计算结果自动赋值,无需硬编码 strain_amplitude = 0.12 # 模拟绘图数据,替换成你自己的实际数据即可 cycles = np.linspace(0, 1000, 100) stress = 200 + 50 * np.sin(cycles / 200) strain = strain_amplitude * np.sin(cycles / 200) fig, ax = plt.subplots() # 绘制第一个Y轴的应力数据 ax.plot(cycles, stress, label="Stress", color="C0") ax.set_xlabel("Cycles") ax.set_ylabel("Stress", color="C0") ax.tick_params(axis="y", labelcolor="C0") ax2 = ax.twinx() # 绘制第二个Y轴的应变对比数据 ax2.plot(cycles, strain, label="Strain", color="C1", linestyle="--") ax2.set_ylabel("Strain", color="C1") ax2.tick_params(axis="y", labelcolor="C1") # 核心配置:根据动态应变幅值设置第二个Y轴范围,留10%余量避免数据贴边 ax2.set_ylim(-strain_amplitude * 1.1, strain_amplitude * 1.1) # 可选:手动设置刻度点和应变幅值对齐 ax2.set_yticks([ -strain_amplitude, -strain_amplitude / 2, 0, strain_amplitude / 2, strain_amplitude ]) plt.title("Stress and Strain vs. Cycles") # 合并两个轴的图例,避免第二个轴的图例不显示 line1, label1 = ax.get_legend_handles_labels() line2, label2 = ax2.get_legend_handles_labels() legend = ax.legend( line1 + line2, label1 + label2, loc="lower right", shadow=True, fontsize="small" ) legend.get_frame().set_facecolor("C0") plt.show()
方案2:按比例映射两个Y轴的数值对应关系
如果你需要让两个Y轴的数值严格按比例对应(比如应力0点对齐应变0点,应力峰值对齐应变幅值),可以在绘制完所有数据后,先获取第一个Y轴的实际范围,再按比例换算第二个Y轴的范围,替换掉方案1里的set_ylim部分即可:
# 所有数据绘制完成后执行 # 获取第一个Y轴(应力轴)的实际数值范围 stress_min, stress_max = ax.get_ylim() # 按比例换算应变轴的范围,保证两个轴的0点对齐,应力峰值对应应变幅值 scale_ratio = strain_amplitude / stress_max ax2.set_ylim(stress_min * scale_ratio, stress_max * scale_ratio)
注意:
set_yscale仅用于切换线性/对数这类缩放模式,永远不要向这个方法传入数值类参数。
内容的提问来源于stack exchange,提问作者Murray Ross
相关产品推荐
相关产品推荐

