如何在Matplotlib中使用fill_between处理含单值数组的列表数据?
解决Matplotlib fill_between的where条件报错问题
报错原因很明确:你用列表做元素级相乘,而Python列表的*运算符是用来重复列表元素的(比如[1,2]*3得到[1,2,1,2,1,2]),并非执行元素-wise的乘法,因此会抛出TypeError: can't multiply sequence by non-int of type 'list'。
解决步骤
核心是把包含0维数组和NaN的列表转换成numpy数组——numpy支持元素级运算,还能自动处理0维数组(转为标量)和NaN值:
- 导入numpy库(未导入的话需添加导入语句)
- 将
y_val和z_val转为numpy数组 - 用numpy数组计算
where条件的判断式
示例代码
import numpy as np import matplotlib.pyplot as plt # 假设你的列表推导生成的原始数据(仅作示例) x_val = [i for i in range(10)] y_val = [np.array(3) if i%2==0 else np.nan for i in range(10)] z_val = [np.array(1) if i%3==0 else np.nan for i in range(10)] # 关键操作:转成numpy数组 y_arr = np.array(y_val) z_arr = np.array(z_val) fig, ax = plt.subplots() # 原plot逻辑不受影响 ax.plot(x_val, y_val) ax.plot(x_val, z_val) # 使用numpy数组计算where条件 ax.fill_between( x_val, y_val, z_val, where=(y_arr * z_arr) > 0, # 用numpy数组执行元素级相乘 alpha=0.3, color='lightblue' ) plt.show()
为什么转float列表没用?
float列表本质还是Python列表,依然不支持元素级乘法操作,只有numpy数组才能实现你需要的“逐个元素相乘再判断”的逻辑。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

