matplotlib pyplot.show: неверный RGBA
Мне просто нужно нарисовать точечный график в 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 - это координаты (списки питонов). Каждый раз, когда я запускаю программу, я получаю 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
1 ответ
Похоже, проблема в том, что matplotlib в моей (Windows 10, Python 3.6.5, matplotlib 2.2.3, sympy 1.1.1, Eclipse/PyDev) и вашей среде не могут обрабатываться должным образом 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')
Образец вывода:
PS: только что проверил это на Ubuntu 18.04, Python 3.6.5, matplotlib 2.2.3, sympy 1.2, Eclipse/PyDev, и ошибка там тоже воспроизводима. Ошибка также не зависит от серверной части - мое первое подозрение. Нет разницы при тестировании с Qt5 и TkAgg.