首页 > 解决方案 > ValueError:轮廓级别必须增加 - 如何绘制 3 个特征数据

问题描述

import numpy as np
from matplotlib import pyplot as plt

data = np.random.normal(0,1,[100,3])

x = data[:,0]
y = data[:,1]

z = data[:,2]

plt.contour([x,y],z)

当我使用虚拟数据运行此代码时,我得到:

ValueError: Contour levels must be increasing

您知道这意味着什么以及我该如何解决吗?

标签: numpymatplotlib

解决方案


plt.contour对其输入有点特殊,z 值必须在矩形 2D 网格上的值上,例如:

import matplotlib.pyplot as plt
import numpy as np

x = np.expand_dims(np.arange(1,11,1), axis=1)
y = np.expand_dims(np.arange(2,21,2), axis=0)
z = y * x

print(x.shape)
print(y.shape)
print(z.shape)

plt.figure()
plt.contour(z)
plt.show()

plt.contour您还可以使用以下方法提供 x 和 y 值np.meshgrid

XX,YY = np.meshgrid(x,y)
plt.figure()
plt.contour(XX, YY, z)
plt.show()

如果您的 z 值具有不规则的 x 和 y 值,您可以使用plt.tricontour,请参见以下示例:

from matplotlib.tri import Triangulation

data = np.random.normal(0,1,[100,3])
x = data[:,0]
y = data[:,1]
#z = data[:,2]
z = x * y

tri = Triangulation(x,y)

plt.figure()
plt.tricontour(tri, z, )
plt.scatter(x,y, c=z)
plt.show()

编辑:从 JohanC 的评论中我了解到,这可以在不导入matplotlib.tri的情况下简化:

plt.figure()
plt.tricontour(x,y,z)
plt.scatter(x,y, c=z)
plt.show()

推荐阅读