【问题标题】:python matplotlib will only plot integerspython matplotlib 只会绘制整数
【发布时间】:2011-03-20 09:17:31
【问题描述】:

我对 python 很陌生。两天。试图让一个情节与 matplotlib 一起工作。我收到此错误:

cannot perform reduce with flexible type

错误所在的行是:

ax.scatter(x,y,z,marker='o')

变量:

ax 定义为:ax = Axes3D(fig)

fig 定义为:fig = plt.figure()

x,y,z 是列表

任何python专家告诉我为什么?我得到了这个情节,但这些值是整数。十进制值是首选。

我读到 python 中的列表对数字不是很好...有人可以澄清一下吗?我让它与列表和 ndarray 一起使用,但所有值都必须是整数。

谢谢!

【问题讨论】:

  • 你确定xyz 是浮点数列表(小数)吗?
  • 你能多贴一点代码吗?无法重现该问题。

标签: python matplotlib plot integer


【解决方案1】:

将您的代码与此basic scatter plot code 进行比较。请注意,xs,ys,zs 是浮点数的 ndarray。该代码对您有用吗?也许您可以逐步将该代码变形为您自己的代码,以获得有效的代码(或了解您的代码在哪里出错)。

如果这没有帮助,也许发布足够的代码让我们重现问题。至少,发布

的输出
print(repr(x))
print(repr(y))
print(repr(z))

【讨论】:

    【解决方案2】:

    感谢您的回复。

    我得到它与花车一起工作,但也许你们都可以告诉我为什么。我刚刚在这里创建了一个帐户,无法编辑我的访客问题...

    我从一个 sqlite 数据库中获取我的数据。我可以将 sql 中的值四舍五入或转换为浮点数,它可以工作。我猜数据是一个数字对象,即使它是数字的。这是正确的吗?

    以下是无效代码的摘录。我通过将值转换为浮点数来使其工作。

    import sqlite3 import re import numpy as np from numpy import * from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt conn = sqlite3.connect('./RES/resDB.dbl') fig = plt.figure() ax = Axes3D(fig) sam = array([]) x = array([]) y = array([]) z = array([]) for sv in conn.execute('select sam,easting,northing,altitude from trx_all'): sam = np.append(sam, [sv[0]]) #this works: sam = np.append(sam, [float(sv[0])]) x = np.append(x, [sv[1]]) #this works: x = np.append(x, [float(sv[1])]) y = np.append(y, [sv[2]]) #this works: y = np.append(y, [float(sv[2])]) z = np.append(z, [sv[3]]) #this works: z = np.append(z, [float(sv[3])]) if sam.__len__() > 0: print(repr(x)) print(repr(y)) print(repr(z)) ax.scatter(x, y, z, marker='o') ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') ax.set_title("3D plot") plt.show()

    unutbu 请求 print(repr(x)) 的输出:

    
    x: array([u'227004.744896075', u'227029.694213685', u'227051.351657645', ...,
           u'226416.484484696', u'226436.436477995', u'226401.253669657'],
          dtype='U16')
    y: array([u'3648736.75423911', u'3648737.3357031', u'3648746.34280013', ...,
           u'3645870.67565062', u'3645893.61216942', u'3645866.95833722'],
          dtype='U16')
    z: array([u'1600.2589433603', u'1535.77224937826', u'1429.01016684435', ...,
           u'341.064685015939', u'343.452275622636', u'312.491347198375'],
          dtype='U16')
    

    最后是它在 ax.scatter(x,y,z,marker='o') 行上输出的错误:

    
    Traceback (most recent call last):
      File "C:\stripped_3dplot.py", line 27, in 
        ax.scatter(x, y, z, marker='o')
      File "C:\Python27\lib\site-packages\mpl_toolkits\mplot3d\axes3d.py", line 1019, in scatter
        patches = Axes.scatter(self, xs, ys, *args, **kwargs)
      File "C:\Python27\lib\site-packages\matplotlib\axes.py", line 5813, in scatter
        minx = np.amin(temp_x)
      File "C:\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 1846, in amin
        return amin(axis, out)
    TypeError: cannot perform reduce with flexible type
    

    就像我说的,我认为这只是错误的类型,但如果你们都可以告诉我是什么类型导致了错误,我可以学到一些东西。

    谢谢。

    【讨论】:

    • 您没有将数组用于浮点数,而是在使用字符串数组,这就是您收到错误的原因。您必须将字符串转换为浮点值。 Numpy 具有字符串数组,因此如果您尝试将一堆字符串直接转换为数组而不设置数组的 dtype,它将假定您需要一个字符串数组。 (另外,np.append 很慢,因为 numpy 数组不是为了快速追加而构建的。最好将内容累积在列表中,然后将列表转换为数组。)
    猜你喜欢
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    相关资源
    最近更新 更多