Python:绘制等高线图时类型错误
尽管我使用了搜索功能,但还是找不到答案。我有两个猜测,但不确定它们是否适用。现在问题来了:
我想画一个轮廓图。为此,我有以下的Python代码:
import numpy as np
import matplotlib.pyplot as plt
xi=list_of_distance
yi=list_of_angle
x = np.arange(0,54,0.2)
y = np.arange(0,180,2.0)
Z = np.histogram2d(xi,yi,bins=(274,90))
X, Y = np.meshgrid(x, y)
plt.contour(X,Y,Z)
plt.ylabel('angles')
plt.xlabel('distance')
plt.colorbar()
plt.show()
xi和yi是包含浮点数的列表。 x和y定义了“区间”……比如说: x生成一个从0到54,步长为0.2的值列表; y生成一个从0到180,步长为2.0的值列表。
通过Z,我使用numpy的函数来创建二维直方图。实际上,这似乎是导致问题的地方。
当调用函数plt.contour(X,Y,Z)时,出现了以下错误信息:
... 文件 "/usr/lib/pymodules/python2.7/numpy/ma/core.py",第2641行,在 new _data = np.array(data, dtype=dtype, copy=copy, subok=True, ndmin=ndmin) ValueError: 用序列设置数组元素时出错。
现在来看看可能导致这个问题的猜测:
- 看起来它期望的是一个数组,但实际上收到了一个列表,而不是numpy数组。
或者
- 我们有一行的长度比其他行短(我想到这个是因为一年前有个同事遇到过类似的问题——当时是发现最后一行比其他行少了2个元素,才解决了这个问题……)
2 个回答
0
你的错误信息显示,这个问题不是因为调用了matplotlib,而是numpy引发了一个ValueError错误。
2
正如@rocksportrocker提到的,你需要注意的是,histogram2d
不仅会返回直方图的数据,还会返回边缘信息。还有一点就是,你可能需要明确指定一个范围,否则系统会根据你数据中的最小值和最大值自动选择一个范围。接下来,你需要把这些边缘转换成图表的单元中心。可以这样做:
import numpy as np
import matplotlib.pyplot as plt
n = 1000000 # how many data points
xmin, xmax = 0.0, 54.0 # distances
ymin, ymax = 0.0, 180.0 # angles
# make up some random data
xi=np.random.normal(xmax/2.0, xmax/4.0, n)
yi=np.random.normal(ymax/3.0, ymax/3.0, n)
Z, xedges, yedges = np.histogram2d(xi,yi, bins=(270,90), range=[[xmin, xmax], [ymin, ymax]])
# find the cell centers from the cell edges
x = 0.5*(xedges[:-1] + xedges[1:])
y = 0.5*(yedges[:-1] + yedges[1:])
# promote to 2D arrays
Y, X = np.meshgrid(y, x)
plt.contour(X,Y,Z)
plt.ylabel('angles')
plt.xlabel('distance')
plt.colorbar()
plt.savefig("hist2d.png")
这样就会生成一个像这样的轮廓图:
不过我个人觉得在这种情况下不应该使用轮廓图,因为直方图可能会比较嘈杂。