Цветные ошибки в 2D в соответствии с картой цветов - PullRequest
0 голосов
/ 14 мая 2018

На первый взгляд, это довольно простая проблема, но я не смог найти решение. Есть похожий (старый) вопрос здесь , но ближайший ответ, данный , похоже, не относится к ошибкам в обоих измерениях.

Мне нужно сгенерировать график "панели ошибок", где обе полосы ошибок (в измерениях x и y) окрашены в соответствии со значениями в массиве cc.

код:

import numpy as np
import matplotlib.pyplot as plt

# Some random data
aa = np.array([3.581, -0.721, 0.137, 0.645, 0.12, 0., -3.236, 0.248, -5.687, 0.816])
e_aa = np.array([0.111, 0.991, 0.446, 0.07, 0.814, 0., 0.088, 0.805, 0.178, 0.552])
bb = np.array([6.671, 1.219, 0.119, -1.972, 1.834, 0., 4.93, 1.833, -11.542, -0.439])
e_bb = np.array([0.143, 1.316, 0.609, 0.094, 1.127, 0., 0.116, 1.227, 0.216, 0.726])

# The color array
cc = np.array([0.50344083, 0.49961867, 0.5055576, 0.48970365, 0.5078516, 0.49643923, 0.50089907, 0.50129157, 0.49627974, 0.5052376])

plt.errorbar(aa, bb, yerr=e_bb, xerr=e_aa, fmt='none', ecolor=cc)
plt.show()

терпит неудачу с:

ValueError: Invalid RGBA argument: 0.50344083

использую ли я аргумент ecolor или color.

Есть ли способ обойти это?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Я нашел решение. Хитрость заключается в том, чтобы сопоставить поплавки с действительной картой цветов, используя matplotlib.cm.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.colors import Normalize

# Some random data
aa = np.array([3.581, -0.721, 0.137, 0.645, 0.12, 0., -3.236, 0.248, -5.687, 0.816])
e_aa = np.array([0.111, 0.991, 0.446, 0.07, 0.814, 0., 0.088, 0.805, 0.178, 0.552])
bb = np.array([6.671, 1.219, 0.119, -1.972, 1.834, 0., 4.93, 1.833, -11.542, -0.439])
e_bb = np.array([0.143, 1.316, 0.609, 0.094, 1.127, 0., 0.116, 1.227, 0.216, 0.726])

# The color array
cc = np.array([0.50344083, 0.49961867, 0.5055576, 0.48970365, 0.5078516, 0.49643923, 0.50089907, 0.50129157, 0.49627974, 0.5052376])

# Define function to map (normalized) values in `cc` to a colormap
cmap = cm.viridis
norm = Normalize(vmin=cc.min(), vmax=cc.max())

plt.errorbar(aa, bb, yerr=e_bb, xerr=e_aa, fmt='none', ecolor=cmap(norm(cc)))
plt.show()

enter image description here

0 голосов
/ 14 мая 2018

plt.errorbar() генерирует три отдельных объекта: линию между точками, строки для каждой крышки панели ошибок (если есть) и matplotlib.collections.LineCollection, содержащие сами строки панели ошибок. Аргумент ecolor в конечном итоге передается в matplotlib.collections.LineCollection.set_color(), который принимает:

Цветовой аргумент Matplotlib (все патчи имеют одинаковый цвет) или последовательность кортежей rgba; если это последовательность, патчи будут циклически проходить по последовательности.

Ваш массив cc не является ни тем, ни другим. Метод получает последовательность, поэтому он пытается установить цвет каждой строки в коллекции для каждого элемента последовательности. Но эти элементы являются просто одинарными числами, которые не являются допустимыми цветами matplotlib.

Чтобы исправить это, сгенерируйте список кортежей, где каждый кортеж задает цвет RGB [A] сегментов линии для каждой панели ошибок. Например, используя другие данные, которые вы указали в своем вопросе, цвета могут быть установлены как:

cc = np.random.rand(aa.size, 3) # Random colors, RGB tuples uniform on (0, 1)
collections = plt.errorbar(aa, bb, yerr=e_bb, xerr=e_aa, fmt='none', ecolor=cc)

Это создает сюжет примерно так:

enter image description here

...