【问题标题】:matplotlib pyplot.show: Invalid RGBAmatplotlib pyplot.show:RGBA 无效
【发布时间】:2019-02-08 19:59:54
【问题描述】:

我只需要在 3D 中绘制散点图。

from mpl_toolkits import mplot3d
from matplotlib import pyplot as plt
ax = plt.axes(projection="3d")
ax.scatter(dots_x, dots_y, dots_z, c='red')
plt.show()

dots_x、dots_y、dots_z 是坐标(python 列表)。每次我运行程序我都会得到ValueError: Invalid RGBA argument: (1.0, 0.0, 0.0, 0.300088123161615)

我对这个元组一无所知。但是如果我使用 plot3D 而不是 scatter3D 我会得到完美的曲线。

完整的错误信息:

Traceback (most recent call last):
  File "C:\Users\bozzy\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\colors.py", line 166, in to_rgba
    rgba = _colors_full_map.cache[c, alpha]
KeyError: ((1.0, 0.0, 0.0, 0.300088123161615), None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\bozzy\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\backends\backend_qt5.py", line 519, in _draw_idle
    self.draw()
  File "C:\Users\bozzy\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\backends\backend_agg.py", line 437, in draw
    self.figure.draw(self.renderer)
  File "C:\Users\bozzy\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\artist.py", line 55, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "C:\Users\bozzy\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\figure.py", line 1493, in draw
    renderer, self, artists, self.suppressComposite)
  File "C:\Users\bozzy\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\image.py", line 141, in _draw_list_compositing_images
    a.draw(renderer)
  File "C:\Users\bozzy\AppData\Local\Programs\Python\Python36-32\lib\site-packages\mpl_toolkits\mplot3d\axes3d.py", line 281, in draw
    reverse=True)):
  File "C:\Users\bozzy\AppData\Local\Programs\Python\Python36-32\lib\site-packages\mpl_toolkits\mplot3d\axes3d.py", line 280, in <lambda>
    key=lambda col: col.do_3d_projection(renderer),
  File "C:\Users\bozzy\AppData\Local\Programs\Python\Python36-32\lib\site-packages\mpl_toolkits\mplot3d\art3d.py", line 459, in do_3d_projection
    fcs = mcolors.to_rgba_array(fcs, self._alpha)
  File "C:\Users\bozzy\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\colors.py", line 267, in to_rgba_array
    result[i] = to_rgba(cc, alpha)
  File "C:\Users\bozzy\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\colors.py", line 168, in to_rgba
    rgba = _to_rgba_no_colorcycle(c, alpha)
  File "C:\Users\bozzy\AppData\Local\Programs\Python\Python36-32\lib\site-packages\matplotlib\colors.py", line 219, in _to_rgba_no_colorcycle
    raise ValueError("Invalid RGBA argument: {!r}".format(orig_c))
ValueError: Invalid RGBA argument: (1.0, 0.0, 0.0, 0.300088123161615)

对不起我的英语:)

UPD:我的程序有完整的代码

from sympy import *
from mpl_toolkits import mplot3d
from matplotlib import pyplot as plt
import pdb

"""
"""

print ("""dx/dt = f(t,x,y,z)
 dy/dt = g(t,x,y,z)
 dz/dt = r(t,x,y,z)""")

x,y,z,t = symbols('x y z t')

f = eval(input("dx/dt = "))
g = eval(input("dy/dt = "))
k = eval(input("dz/dt = "))

n = int(input("Input number of dots: "))
delta_t = eval(input("Input time 'step': "))

t0, x0,y0,z0 = eval(input("Input initial conditions t0, x0, y0, z0: "))


dots_x = [x0]
dots_y = [y0]
dots_z = [z0]
current_t = t0

k1,k2,k3,k4 = None, None, None, None
m1,m2,m3,m4 = None, None, None, None
j1,j2,j3,j4 = None, None, None, None

for i in range(1,n+1):
    k1 = f.evalf(subs={x: dots_x[i-1], y: dots_y[i-1], z: dots_z[i-1], t:current_t})*delta_t
    m1 = g.evalf(subs={x: dots_x[i-1], y: dots_y[i-1], z: dots_z[i-1], t:current_t})*delta_t
    j1 = k.evalf(subs={x: dots_x[i-1], y: dots_y[i-1], z: dots_z[i-1], t:current_t})*delta_t

    k2 = f.evalf(subs={x: dots_x[i-1]+k1/2, y: dots_y[i-1]+m1/2, z: dots_z[i-1]+j1/2, t:current_t+delta_t/2})*delta_t
    m2 = g.evalf(subs={x: dots_x[i-1]+k1/2, y: dots_y[i-1]+m1/2, z: dots_z[i-1]+j1/2, t:current_t+delta_t/2})*delta_t
    j2 = k.evalf(subs={x: dots_x[i-1]+k1/2, y: dots_y[i-1]+m1/2, z: dots_z[i-1]+j1/2, t:current_t+delta_t/2})*delta_t

    k3 = f.evalf(subs={x: dots_x[i-1]+k2/2, y: dots_y[i-1]+m2/2, z: dots_z[i-1]+j1/2, t:current_t+delta_t/2})*delta_t
    m3 = g.evalf(subs={x: dots_x[i-1]+k2/2, y: dots_y[i-1]+m2/2, z: dots_z[i-1]+j1/2, t:current_t+delta_t/2})*delta_t
    j3 = g.evalf(subs={x: dots_x[i-1]+k2/2, y: dots_y[i-1]+m2/2, z: dots_z[i-1]+j2/2, t:current_t+delta_t/2})*delta_t

    k4 = f.evalf(subs={x: dots_x[i-1]+k3/2, y: dots_y[i-1]+m3/2, z: dots_z[i-1]+j1/2, t:current_t+delta_t/2})*delta_t
    m4 = g.evalf(subs={x: dots_x[i-1]+k3/2, y: dots_y[i-1]+m3/2, z: dots_z[i-1]+j1/2, t:current_t+delta_t/2})*delta_t
    j4 = g.evalf(subs={x: dots_x[i-1]+k3/2, y: dots_y[i-1]+m3/2, z: dots_z[i-1]+j3/2, t:current_t+delta_t/2})*delta_t

    dots_x.append(dots_x[i-1]+(1/6)*(k1+2*k2+2*k3+k4))
    dots_y.append(dots_y[i-1]+(1/6)*(m1+2*m2+2*m3+m4))
    dots_z.append(dots_z[i-1]+(1/6)*(j1+2*j2+2*j3+j4))
    current_t += delta_t

print (dots_x)
print (dots_y)
print (dots_z)

plt.switch_backend(u"qt5agg")
ax = plt.axes(projection="3d")
# pdb.set_trace()
ax.scatter(dots_x, dots_y, dots_z, c='red')
plt.show()

示例输入:

dx/dt = y - x 
dy/dt = x*(28-z) - y 
dz/dt = x*y - z 
number of dots: 500 
time step: 0.1 
initials: 0, 1, 1, 1 

【问题讨论】:

  • "如果我使用 plot3D 而不是 scatter3D" -- 你没有使用 scatter3D,你使用的是 scatter,它只需要 2 个数据参数,所以它认为第三个是颜色信息。
  • @Denziloe 如果 ax 是 mplot3d 轴,ax.scatter is the same as scatter3D。这个函数接受 3 个输入参数 x,y,z,因此“所以它认为第三个是颜色信息”是错误的。
  • @ImportanceOfBeingErnest 感谢您的纠正,我深表歉意。
  • 确实,查看minimal reproducible example 会很有帮助,即定义了所有输入变量并且可以运行的代码。还有,这里用的是哪个版本的matplotlib版本?
  • 如果您有新信息,请随时编辑您的问题。大多数人没有仔细阅读 cmets(或问题,但这是另一个问题)。

标签: python matplotlib graph visualization sympy


【解决方案1】:

问题似乎是我(Windows 10、Python 3.6.5、matplotlib 2.2.3、sympy 1.1.1、Eclipse/PyDev)中的 matplotlib 和您的环境无法正确处理 sympy.core.floats。您的 x_dots 之类的列表不包含普通的 Python 浮点值,而是 sympy 数据格式。我不知道sympy,所以我不确定如何正确处理这个问题,但您可以通过在绘图前转换值来确认这是问题:

fx = [float(i) for i in dots_x]
fy = [float(i) for i in dots_y]
fz = [float(i) for i in dots_z]
ax.scatter(fx, fy, fz, c='red')

或者,您可以使用 numpy 进行转换:

ax.scatter(np.asarray(dots_x, dtype = "float"), np.asarray(dots_y, dtype = "float"), np.asarray(dots_z, dtype = "float"), c='red')

样本输出:

P.S.:刚刚还在 Ubuntu 18.04、Python 3.6.5、matplotlib 2.2.3、sympy 1.2、Eclipse/PyDev 上进行了测试,并且该错误也可以在那里重现。 该错误也与后端无关 - 我的第一个怀疑。用 Qt5 和 TkAgg 测试时没有区别。

【讨论】:

  • 请注意,这是一个次优的解决方法。我标记了sympy,所以也许对这个库有更好了解的人可以给出解决核心问题的答案。
  • 原始问题已更新以指定数据——我只是用整数列表进行了测试。 (Python 3.5,Windows 10,目前无法获取 matplotlib 版本——但很明显 sympy 是问题所在)。
  • @Denziloe 我也是。由于我能够将代码与列表一起使用,很明显这些列表与dots_x 之类的列表有所不同。一个明确的提醒,人们总是应该在他们的问题中包含一个 MCVE。
猜你喜欢
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
相关资源
最近更新 更多