使用twinx创建双Y轴散点图时遇numpy.ndarray无twinx属性错误
错误修复:'numpy.ndarray' object has no attribute 'twinx'
错误原因
cx是plt.subplots返回的子图数组(numpy.ndarray类型),你直接对整个数组调用twinx(),但twinx()是单个Axes对象的专属方法,数组没有这个属性,因此触发报错。
修正后的完整代码
import matplotlib.pyplot as plt import pandas as pd # 假设已完成数据导入:Helium1 = pd.read_excel("你的Excel文件路径.xlsx") fig, cx = plt.subplots(nrows=1, ncols=4, figsize=(15,5)) # 第一个子图:双Y轴配置 # 主Y轴:Pref (Bar) ax_main = cx[0] ax_main.scatter(Helium1['ΔT(s)'], Helium1['Pref (Bar)'], marker='x', color='black') ax_main.set_xlabel('ΔT(s)') ax_main.set_ylabel('Pref (Bar)') ax_main.set_title('Uncorrected Pressure') ax_main.tick_params(axis='y', labelcolor='black') # 副Y轴:Temp(°C) ax_twin = ax_main.twinx() ax_twin.scatter(Helium1['ΔT(s)'], Helium1['Temp(°C)'], marker='x', color='red') ax_twin.set_ylabel('Temp(°C)') ax_twin.tick_params(axis='y', labelcolor='red') # 第二个子图:温度修正压力 cx[1].scatter(Helium1['ΔT(s)'], Helium1['Pref,t (Bar)'], marker='v', color='orange') cx[1].set_xlabel('ΔT(s)') cx[1].set_ylabel('Pref,t (Bar)') cx[1].set_title('Temperature Corrected Pressure') cx[1].tick_params(axis='y', labelcolor='black') # 第三个子图:泄漏修正(修复重复绘图问题) cx[2].scatter(Helium1['ΔT(s)'], Helium1['Pref,l (Bar)'], marker='v', color='yellow', label='Pref,l') cx[2].scatter(Helium1['ΔT(s)'], Helium1['Pref,t (Bar)'], marker='^', color='orange', label='Pref,t') cx[2].set_xlabel('ΔT(s)') cx[2].set_ylabel('Pressure (Bar)') cx[2].set_title('Leak Correction') cx[2].legend() cx[2].tick_params(axis='y', labelcolor='black') # 第四个子图:泄漏修正后压力 cx[3].scatter(Helium1['ΔT(s)'], Helium1['Pref,l (Bar)'], marker='v', color='yellow') cx[3].set_xlabel('ΔT(s)') cx[3].set_ylabel('Pref,l (Bar)') cx[3].set_title('Leak Corrected Pressure') cx[3].tick_params(axis='y', labelcolor='black') plt.tight_layout() # 自动调整子图间距,避免标签重叠 plt.show()
额外修正说明
- 修正双Y轴副轴的标签错误,将原错误的
Pref (Bar)改为Temp(°C) - 修复第三个子图重复调用
scatter和设置标题的问题,添加图例区分两组数据 - 统一颜色字符串为小写,符合matplotlib常用规范
- 增加
plt.tight_layout()避免子图标题、标签出现重叠
内容的提问来源于stack exchange,提问作者Ashtu
相关产品推荐
相关产品推荐

