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 - координаты (списки 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 03.09.2018 21:24

@Denziloe Если ax - это оси mplot3d, ax.scatter такой же, как scatter3D. Эта функция принимает 3 входных аргумента x, y, z, следовательно, «поэтому она думает, что третий - информация о цвете» неверно.

ImportanceOfBeingErnest 03.09.2018 21:36

@ImportanceOfBeingErnest Спасибо, что поправили меня, приношу свои извинения.

Denziloe 03.09.2018 21:38

Я в тупике в этом случае. Этот код отлично подходит для меня и отображает красные точки. Я могу только порекомендовать перезапустить ядро ​​и обновить пакет matplotlib.

Denziloe 03.09.2018 21:40

Действительно, было бы полезно увидеть минимальный воспроизводимый пример, то есть код, в котором определены все входные переменные и который может быть запущен. Кроме того, какая версия версии matplotlib здесь используется?

ImportanceOfBeingErnest 03.09.2018 21:45

@ImportanceOfBeingErnest 2.2.3

Ярослав Бондарев 04.09.2018 08:29

Что было бы образцом ввода в вашем сценарии, который воспроизводит вашу ошибку? P.S .: Вы в курсе о опасности использования eval в скрипте?

Mr. T 04.09.2018 09:11

@ Mr.T это небольшой скрипт для визуализации данных, и я не волнуюсь по этому поводу. Итак, пример: dx / dt = y - x dy / dt = x * (28-z) - y dz / dt = x * y - z количество точек: 500 временной шаг: 0,1 инициалы: 0, 1, 1, 1

Ярослав Бондарев 04.09.2018 09:29

Пожалуйста, всегда редактируйте свой вопрос, если у вас есть новая информация. Большинство людей не читают внимательно комментарии (или вопрос, но это уже другая проблема).

Mr. T 04.09.2018 09:47
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
9
3 995
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')

Пример вывода:

P.S .: Только что протестировал его также на Ubuntu 18.04, Python 3.6.5, matplotlib 2.2.3, sympy 1.2, Eclipse / PyDev, и там также воспроизводится ошибка. Ошибка тоже не зависит от бэкэнда - мое первое подозрение. Никакой разницы при тестировании с Qt5 и TkAgg.

Имейте в виду, что это неоптимальный обходной путь. Я отметил sympy, так что, возможно, кто-нибудь, лучше знакомый с этой библиотекой, сможет дать ответ, который решает основную проблему.

Mr. T 04.09.2018 11:37

Исходный вопрос был обновлен, чтобы указать данные - я просто протестировал со списками целых чисел. (Python 3.5, Windows 10, на данный момент не может получить версию matplotlib, но очевидно, что проблема в симпозиуме).

Denziloe 04.09.2018 11:39

@Denziloe Я тоже. Поскольку я смог использовать код со списками, было очевидно, что с такими списками, как dots_x, что-то не так. Строгое напоминание о том, что люди всегда должны включать MCVE в свой вопрос.

Mr. T 04.09.2018 11:42

Другие вопросы по теме