无法绘制我的函数:返回数组(a,dtype,copy = False,order = order)TypeError:float()参数必须是字符串或数字

时间:2017-12-14 20:17:02

标签: python function matplotlib matrix plot

我正在尝试绘制一个函数,它给出了几个散点图角度的arc​​tan(这是一个物理实验):

scatterplot obtained by experimentation

这是我的代码:

import numpy as np
import matplotlib.pyplot as plt

filename='rawPhaseDataf2f_17h_15m.dat'
datatype=np.dtype( [('Shotnumber',np.dtype('>f8')),('A1',np.dtype('>f8')),      ('A2',np.dtype('>f8')), ('f2f',np.dtype('>f8')), ('intensity',np.dtype('>f8'))])
data=np.fromfile(filename,dtype=datatype)

#time=data['Shotnumber']/9900 # reprate is 9900 Hz -> time in seconds
A1=data['A1']
A2=data['A2']

#np.sort()
i=range(1,209773) 

def x(i) :
    return arctan((A1.item(i)/A2.item(i))*(i/209772))
def y(i) : 
    return i*2*pi/209772

plot(x,y)

plt.figure('Scatterplot')
plt.plot(A1,A2,',') #Scatterplot
plt.xlabel('A1')
plt.ylabel('A2')

plt.figure('2D Histogram')
plt.hist2d(A1,A2,100) # 2D Histogram
plt.xlabel('A1')
plt.ylabel('A2')

plt.show()

我的错误是:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/spyderlib/widgets/externalshell   /sitecustomize.py", line 540, in runfile
    execfile(filename, namespace)
  File "/home/nelly/Bureau/ Téléchargements/Kr4  Experiment/read_rawPhaseData.py", line 21, in <module>
    plot(x,y)
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2987, in plot
ret = ax.plot(*args, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 4138, in plot
self.add_line(line)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 1497, in add_line
self._update_line_limits(line)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 1508, in _update_line_limits
path = line.get_path()
  File "/usr/lib/pymodules/python2.7/matplotlib/lines.py", line 743, in get_path
    self.recache()
  File "/usr/lib/pymodules/python2.7/matplotlib/lines.py", line 420, in recache
    x = np.asarray(xconv, np.float_)
  File "/usr/lib/python2.7/dist-packages/numpy/core/numeric.py", line 460, in asarray
    return array(a, dtype, copy=False, order=order)
TypeError: float() argument must be a string or a number

我知道问题来自plot(x,y)。我认为我的错误来自xy的定义。 A1A2是矩阵,N是点数,Ak是矩阵的索引。我希望arctan(A1k/A2k)*(k/N)

1 个答案:

答案 0 :(得分:0)

您的代码存在许多问题,以及您对python和数组操作的理解。我只是要处理代码的第一部分(以及你得到的错误),希望你能继续从那里解决它。

这应该可以解决您获得的错误并生成一个情节:

# size = 209772
size = A1.size    # I'm assuming that the size of the array is 209772

z = np.arange(1, size+1)/(size+1)   # construct an array from [1/209773, 1.0]
# Calculate the x and y arrays
x = np.arctan((A1/A2)*z)
y = z*2*pi

# Plot x and y
plt.plot(x, y)

<强>讨论:

这段代码存在很多问题:

i=range(1,209773) 

def x(i) :
    return arctan((A1.item(i)/A2.item(i))*(i/209772))
def y(i) : 
    return i*2*pi/209772

plot(x, y)
  1. 您正在定义两个名为xy的{​​{3}},然后您将这些函数传递给绘图方法。绘图方法接受数字(在列表或数组中),而不是函数。这就是你得到错误的原因。所以你需要构造一个数字列表/数组并将其传递给函数。

  2. 您正在定义变量i,这是一个数字列表。但是,当您定义函数xy时,您正在创建名为i新变量,它们与您之前创建的列表无关。这是因为functions

  3. 功能arctanplot未定义&#34;全局&#34;而是仅在包numpymatplotlib中定义。所以你需要从这些包中调用它们