鱼C论坛

 找回密码
 立即注册
查看: 1987|回复: 5

[已解决]matplotlib画图

[复制链接]
发表于 2023-8-6 17:13:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为什么变化了y1,y2图就不一样。
图1:
IMG_3816.PNG
x1 = np.arange(1600,2200,1)  
x2 = np.arange(600,1000,1)
x3 = 1.2
x4 = 150
y1, y2 = np.meshgrid(x1, x2)
...
plt.figure()
plt.subplot(111)
plt.scatter(y1, y2, c=z, cmap=plt.cm.rainbow, vmin=min(z), vmax=max(z))
plt.colorbar()
plt.show()

图2:
IMG_3815.PNG
x1 = np.arange(1600,2200,1)  
x2 = np.arange(600,1000,1)
x3 = 1.2
x4 = 150
y1, y2 = np.meshgrid(x2, x1)
...
plt.figure()
plt.subplot(111)
plt.scatter(y1, y2, c=z, cmap=plt.cm.rainbow, vmin=min(z), vmax=max(z))
plt.colorbar()
plt.show()
最佳答案
2023-8-6 17:14:05
问题出在y1和y2的赋值上。在图1中,y1和y2的赋值是通过np.meshgrid(x1, x2)得到的,而在图2中,y1和y2的赋值是通过np.meshgrid(x2, x1)得到的。这两个函数的参数顺序是不同的,导致了y1和y2的值在图1和图2中的排列方式不同。

在图1中,y1的取值范围是从1600到2200,y2的取值范围是从600到1000。而在图2中,y1的取值范围是从600到1000,y2的取值范围是从1600到2200。这就导致了图1中y1和y2的排列方式是以x1为行、x2为列的网格,而图2中y1和y2的排列方式是以x2为行、x1为列的网格。

因此,当你使用plt.scatter绘制散点图时,图1和图2的结果就会不同。在图1中,x轴对应的是y1的取值,y轴对应的是y2的取值;而在图2中,x轴对应的是y2的取值,y轴对应的是y1的取值。

要使得图1和图2的结果一致,你需要保持y1和y2的赋值顺序一致,即使用相同的np.meshgrid(x1, x2)或np.meshgrid(x2, x1)来赋值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-6 17:14:02 | 显示全部楼层
根据您提供的代码和描述,可以看出图形不同的原因是因为在两个代码块中交换了 y1y2 的顺序。

在第一个代码块中,您使用了 y1, y2 = np.meshgrid(x1, x2),将 x1 和 x2 组成了网格点 (y1, y2),然后进行绘制。这样得到的图像是将 x1 轴作为横轴,x2 轴作为纵轴,而颜色信息由 z 控制。

在第二个代码块中,您使用了 y1, y2 = np.meshgrid(x2, x1),将 x2 和 x1 组成了网格点 (y1, y2),然后进行绘制。这样得到的图像是将 x2 轴作为横轴,x1 轴作为纵轴,而颜色信息由 z 控制。

因此,两个图形的 x 轴和 y 轴的显示方式发生了变化,导致图形展示不同。

如果您希望两个图形的展示方式一致,需要保持一致的 y1y2 的顺序。可以根据您的需求选择一个代码块,并将另一个代码块注释掉。

希望能解决您的问题!如果还有其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-6 17:14:05 | 显示全部楼层    本楼为最佳答案   
问题出在y1和y2的赋值上。在图1中,y1和y2的赋值是通过np.meshgrid(x1, x2)得到的,而在图2中,y1和y2的赋值是通过np.meshgrid(x2, x1)得到的。这两个函数的参数顺序是不同的,导致了y1和y2的值在图1和图2中的排列方式不同。

在图1中,y1的取值范围是从1600到2200,y2的取值范围是从600到1000。而在图2中,y1的取值范围是从600到1000,y2的取值范围是从1600到2200。这就导致了图1中y1和y2的排列方式是以x1为行、x2为列的网格,而图2中y1和y2的排列方式是以x2为行、x1为列的网格。

因此,当你使用plt.scatter绘制散点图时,图1和图2的结果就会不同。在图1中,x轴对应的是y1的取值,y轴对应的是y2的取值;而在图2中,x轴对应的是y2的取值,y轴对应的是y1的取值。

要使得图1和图2的结果一致,你需要保持y1和y2的赋值顺序一致,即使用相同的np.meshgrid(x1, x2)或np.meshgrid(x2, x1)来赋值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-6 17:14:09 | 显示全部楼层
为什么变化了y1, y2图就不一样?

y1y2 的取值范围发生变化时,影响了散点图中数据点的位置和分布,从而导致图形的变化。具体来说,y1y2 是用来标识散点图中每个数据点的 x 坐标和 y 坐标的网格矩阵。

在图1中,通过 np.meshgrid(x1, x2) 创建的网格矩阵 y1y2 分别以 x1x2 的取值范围作为基准来生成。因此,图1中的散点图会根据 x1x2 的范围进行绘制,x 和 y 的坐标数值是匹配的。

而在图2中,通过 np.meshgrid(x2, x1) 创建的网格矩阵 y1y2 分别以 x2x1 的取值范围作为基准来生成。因此,图2中的散点图会根据 x2x1 的范围进行绘制,x 和 y 的坐标数值是颠倒的。

以下给出修改后的完整代码,供您参考:
import numpy as npimport matplotlib.pyplot as plt# 图1x1 = np.arange(1600, 2200, 1)x2 = np.arange(600, 1000, 1)z = np.random.rand(len(x1), len(x2))y1, y2 = np.meshgrid(x1, x2)plt.figure()plt.subplot(111)plt.scatter(y1, y2, c=z, cmap=plt.cm.rainbow, vmin=min(z), vmax=max(z))plt.colorbar()plt.title('图1')plt.show()# 图2x1 = np.arange(1600, 2200, 1)x2 = np.arange(600, 1000, 1)z = np.random.rand(len(x1), len(x2))y1, y2 = np.meshgrid(x2, x1)plt.figure()plt.subplot(111)plt.scatter(y1, y2, c=z, cmap=plt.cm.rainbow, vmin=min(z), vmax=max(z))plt.colorbar()plt.title('图2')plt.show()
希望对您有所帮助!如果还有其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-6 18:28:26 | 显示全部楼层
isdkz 发表于 2023-8-6 17:14
问题出在y1和y2的赋值上。在图1中,y1和y2的赋值是通过np.meshgrid(x1, x2)得到的,而在图2中,y1和y2的赋 ...

我的意思是为什么第一个图看起来极不均匀,一条一条的,而第二个图渐变很均匀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-6 19:19:50 | 显示全部楼层
isdkz 发表于 2023-8-6 17:14
问题出在y1和y2的赋值上。在图1中,y1和y2的赋值是通过np.meshgrid(x1, x2)得到的,而在图2中,y1和y2的赋 ...

z的值未按照对应的y1和y2进行设置,导致第一种图像错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 21:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表