Python:绘制等高线图时类型错误

-1 投票
2 回答
3392 浏览
提问于 2025-04-17 03:06

尽管我使用了搜索功能,但还是找不到答案。我有两个猜测,但不确定它们是否适用。现在问题来了:

我想画一个轮廓图。为此,我有以下的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: 用序列设置数组元素时出错。

现在来看看可能导致这个问题的猜测:

  1. 看起来它期望的是一个数组,但实际上收到了一个列表,而不是numpy数组。

或者

  1. 我们有一行的长度比其他行短(我想到这个是因为一年前有个同事遇到过类似的问题——当时是发现最后一行比其他行少了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")

这样就会生成一个像这样的轮廓图:

hist2d.png

不过我个人觉得在这种情况下不应该使用轮廓图,因为直方图可能会比较嘈杂。

撰写回答