plt.plot与plt.scatter处理双变量(x和f(x,y))的使用差异疑问
问题解答
1. 为什么尺寸不一致时plt.plot正常,plt.scatter报错
两者的底层设计逻辑不同:
plt.plot支持自动适配多列数组,会将二维数组的每一列作为单独的一组序列绘制,只要x和y的第一维度(行数量)匹配,就可以正常运行,不需要整体元素总数完全相同。plt.scatter是逐点映射的散点绘制逻辑,要求每个x坐标严格对应一个y坐标,所以强制要求输入的x和y数组的形状完全一致、总元素数相等,只要不匹配就会抛出尺寸错误。
你当前代码里的u是形状为(4,1)的二维数组,调用vis_cal(u,a)后,a是形状为(1,2)的数组,经过numpy广播计算后的返回值形状为(4,2),总共有8个元素,和u的4个元素数量不匹配,所以scatter会报错,而plt.plot会自动把y的两列作为两条线用同一组x值绘制,所以可以正常运行。
注:你代码中
a = a([[-np.pi, -np.pi/6]])属于笔误,正确写法应该是a = np.array([[-np.pi, -np.pi/6]]),否则会触发变量未定义错误。
2. 是不是scatter必须要求数组尺寸一致,否则只能用plot
是的,plt.scatter 必须保证输入的x和y数组形状完全匹配,每个x值对应唯一的y值。但这不等于尺寸不匹配时只能用plt.plot,你可以通过调整数组形状适配scatter的要求,例如将两个数组都展平为一维,或者对x数组做重复操作使其和y的元素数匹配:
# 展平数组适配scatter plt.scatter(np.tile(u, 2).flatten(), vis_cal(u, a).flatten(), marker='o', color='blue', label="Vij_ind")
如果你的业务逻辑只需要用a中的一个值计算y,直接调整a的形状为(1,),就可以让vis_cal(u,a)的输出形状和u保持一致,也可以正常调用scatter。
内容的提问来源于stack exchange,提问作者Dimosthenis Zografos
相关产品推荐
相关产品推荐

