numpy 为什么等高线图的外观会因数据输入而异?

m0rkklqb  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(100)

我在用正态分布的最大值生成等高线图。然而,由于某些原因,我的等值线图看起来不同,这取决于单个最大值的值。我有三个例子

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import multivariate_normal

data_1=[8.58 ,8.584 ,8.569 ,8.538]
data_2=[119.614, 119.633, 119.697, 119.96 ]

#data_1=[8.601 ,8.605 ,8.607 ,8.624]
#data_2=[120.976 ,120.988 ,120.961, 120.988]

#data_1=[8.901, 8.907 ,8.902, 8.89 ]
#data_2= [121.547, 121.56,  121.547 ,121.514]
x_axis=np.linspace((min(data_1)-0.01),(max(data_1)+0.01),100)
y_axis=np.linspace((min(data_2)-0.01),(max(data_2)+0.01),100)
spread=[[2e-6, 1e-9], [1e-9, 2e-6]]
x,y=np.meshgrid(x_axis,y_axis)
pos=np.dstack((x,y))
pdf_sum=np.zeros_like(x)
for points in np.stack((data_1,data_2),axis=-1):
    pdf_sum+=(multivariate_normal(points,spread)).pdf(pos)
plt.contour(x,y,pdf_sum,levels=5,colors='black')

plt.show()

不同数据集的比较显示了奇怪的行为。第二组是最好看的,但我不知道第一组数据中的黑线是什么,或者为什么第三组数据中的一些轮廓只有3个级别而不是5个。
编辑:看起来我的轮廓周围也有一个巨大的圆圈,我不太明白为什么(我相信黑线来自这个)。

6ojccjat

6ojccjat1#

正如@Brian61354270和@Mike 'Pomax' Kamermans的评论所指出的。这些数字看起来不同的原因是因为matplotlib试图找到最好的5个级别来客观地使用。等高线密度将取决于您的数据,但如果您想分析结果,查看等高线标签会很有帮助。我用等值线标签和填充的等值线重新制作了你的图形(对我来说更容易看到定量)。尝试使用levels,了解如何更改以更好地理解您的数据。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import multivariate_normal

def get_pdf(data_1,data_2,spread):
    x_axis=np.linspace((min(data_1)-0.01),(max(data_1)+0.01),100) # Try changing the resolution here
    y_axis=np.linspace((min(data_2)-0.01),(max(data_2)+0.01),100) # Try changing the resolution here
    
    x,y=np.meshgrid(x_axis,y_axis)
    pos=np.dstack((x,y))
    pdf_sum=np.zeros_like(x)
    for points in np.stack((data_1,data_2),axis=-1):
        pdf_sum+=(multivariate_normal(points,spread)).pdf(pos)
    return pdf_sum
    
# Decalre the Figure    
fig = plt.figure(figsize=(16,4))
ax1 = plt.subplot(131)
ax2 = plt.subplot(132)
ax3 = plt.subplot(133)

#
clevels = [0,.0000000001,.0001,1,10,100,1000]

# Subplot 1
#-------------------

data_1=[8.58 ,8.584 ,8.569 ,8.538]
data_2=[119.614, 119.633, 119.697, 119.96 ]
spread=[[2e-6, 1e-9], [1e-9, 2e-6]]

IM = ax1.contourf(x,y,get_pdf(data_1,data_2,spread),alpha=.5,cmap=plt.cm.gist_ncar_r)
CS = ax1.contour(x,y,get_pdf(data_1,data_2,spread),levels=clevels,colors='black')
plt.colorbar(IM,ax=ax1)
plt.clabel(CS)

# Subplot 2
#-------------------

data_1=[8.601 ,8.605 ,8.607 ,8.624]
data_2=[120.976 ,120.988 ,120.961, 120.988]
spread=[[2e-6, 1e-9], [1e-9, 2e-6]]

IM = ax2.contourf(x,y,get_pdf(data_1,data_2,spread),alpha=.5,cmap=plt.cm.gist_ncar_r)
CS = ax2.contour(x,y,get_pdf(data_1,data_2,spread),levels=clevels,colors='black')
plt.colorbar(IM,ax=ax2)
plt.clabel(CS)

# Subplot 3
#-------------------

data_1=[8.901, 8.907 ,8.902, 8.89 ]
data_2= [121.547, 121.56,  121.547 ,121.514]
spread=[[2e-6, 1e-9], [1e-9, 2e-6]]

IM = ax3.contourf(x,y,get_pdf(data_1,data_2,spread),alpha=.5,cmap=plt.cm.gist_ncar_r)
CS = ax3.contour(x,y,get_pdf(data_1,data_2,spread),levels=clevels,colors='black')
plt.colorbar(IM,ax=ax3)
plt.clabel(CS)


plt.show()

相关问题