Python:绘制等高线图时键入错误

时间:2011-09-26 14:17:46

标签: python numpy matplotlib

尽管使用了搜索功能,我一直无法找到答案。我有两个假设,但不知道它们可以适用多远。现在问题是:

我想画一个轮廓。为此,我在这里得到以下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定义'interval'...例如: x生成一个列表,其值为0到54,步长为0.2 y生成一个列表,其值为0到180,步长为2.0步

使用Z我使用numpy函数创建2D直方图。实际上这似乎是造成麻烦的地方。

调用函数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-array就会收到一个列表
    1. 我们得到的行比其他行短(我想到的是,在一年前同事遇到这样的问题之后 - 通过弄清楚最后一行比2个元素短于所有其他人......)

2 个答案:

答案 0 :(得分:1)

正如@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

但我个人不会在这种情况下使用轮廓,因为直方图可能会很嘈杂。

答案 1 :(得分:0)

你的回溯表明错误没有从调用matplotlib引起,它是numpy引发了ValueError。