我有一组数据,我需要识别模式,所以我尝试使用plt.contours
和plt.contourf
来完成该任务并且效果很好,现在我可以绘制轮廓并以图形方式显示超密度在数据中。在这一步中,我试图获取表面轮廓的信息(我的意思是,将变量中定义轮廓的值保存在以后使用它。)没有成功:有没有办法做到这一点?
另外,我怀疑颜色条中的值意味着什么,我知道这是数据过密度的程度,但如果有人能告诉我更多细节,那就太棒了。
我附上我目前使用的代码(我在这种情况下生成数据),以及代码图。
import scipy.interpolate
import numpy as np
import scipy.stats as st
import matplotlib.pyplot as plt
np.random.seed(20)
data = np.random.rand(400,2)
x = data[:,0]
y = data[:,1]
plt.figure(figsize=(12,7))
# Set up a regular grid of points
xi, yi = np.linspace(x.min(), x.max(), 100), np.linspace(y.min(), y.max(), 100)
xi, yi = np.meshgrid(xi, yi)
#contours:
n_contours = 6
positions = np.vstack([xi.ravel(), yi.ravel()])
values = np.vstack([x, y])
kernel = st.gaussian_kde(values)
f = np.reshape(kernel(positions).T, xi.shape)
cfset = plt.contourf(xi, yi, f,n_contours, cmap='Greens')
cset = plt.contour(xi, yi, f,n_contours, colors='k')
#For the points data:
positions = np.vstack([x.ravel(), y.ravel()])
values = np.vstack([x, y])
kernel = st.gaussian_kde(values)
z = np.reshape(kernel(positions).T, x.shape)
#plot:
plt.scatter(x, y, c=z)
plt.colorbar(cfset)
plt.show()
谢谢!
编辑:
我使用get_paths()功能创建了一种方法,所以基本上,您需要选择轮廓,然后选择获取值(x,y)所需的段数,例如:
#contour 3, section 0
p = cset.collections[3].get_paths()[0]
v = p.vertices
x0 = v[:,0]
y0 = v[:,1]
#contour 3, section 1
p = cset.collections[3].get_paths()[1]
v = p.vertices
x1 = v[:,0]
y1 = v[:,1]
#contour 3, section 2
p = cset.collections[3].get_paths()[2]
v = p.vertices
x2 = v[:,0]
y2 = v[:,1]
plt.plot(x0,y0,'-',x1,y1,'-',x2,y2,'-')
有了这个,你得到: