Цветная полоса диаграммы рассеяния — Matplotlib

Я пытаюсь показать цветную полосу моего графика рассеяния, но я продолжаю получать сообщение об ошибке:

TypeError: вы должны сначала установить set_array для сопоставления

Это то, что я делаю для сюжета:

# Just plotting the values of data that are nonzero 
x_data = numpy.nonzero(data)[0] # x coordinates
y_data = numpy.nonzero(data)[1] # y coordinates

# Mapping the values to RGBA colors
data = plt.cm.jet(data[x_data, y_data])

pts = plt.scatter(x_data, y_data, marker='s', color=data)

plt.colorbar(pts)

Если я прокомментирую строку plt.colorbar(pts), я правильно понял график, но я также хотел бы построить цветную полосу.

Заранее спасибо.


person pceccon    schedule 18.07.2014    source источник


Ответы (1)


Вы передаете определенные значения rgb, поэтому matplotlib не может построить карту цветов, потому что не знает, как она связана с вашими исходными данными.

Вместо того, чтобы сопоставлять значения с цветами RGB, пусть scatter сделает это за вас.

Вместо:

# Mapping the values to RGBA colors
data = plt.cm.jet(data[x_data, y_data])

pts = plt.scatter(x_data, y_data, marker='s', color=data)

Do:

pts = plt.scatter(x_data, y_data, marker='s', c=data[x_data, y_data])

(Просто передайте в c то, что вы изначально передавали в plt.cm.jet.)

Тогда вы сможете нормально построить палитру. Конкретная ошибка сообщает вам, что цвета были установлены вручную, а не через set_array (который обрабатывает сопоставление массива значений данных с RGB).

person Joe Kington    schedule 18.07.2014
comment
Это сработало. У меня только один последний вопрос. Я попробовал это, используя color=data[x_data, y_data], и получил то же сообщение об ошибке. Итак, c != цвет? Спасибо, @JoeKington. (: - person pceccon; 19.07.2014
comment
Нет, color — это псевдоним для facecolors. (Это немного сбивает с толку, но это связано с унаследованным API-интерфейсом Matlab.) c - это перенос исходного разброса Matlab. scatter предназначен для вызова как scatter(x, y, c=z1, s=z1) для одновременного отображения 4 переменных. (Две позиции, различаются по цвету и по размеру). За кулисами color вызывает set_facecolors, а c вызывает set_array в выходной коллекции. В долгосрочной перспективе, возможно, будет хорошей идеей заставить color вести себя идентично c, если передается скалярный массив. - person Joe Kington; 19.07.2014
comment
Хуууум, понял. (: Однако мои цвета сильно отличаются (и я получил квадраты с белыми контурами) от другого графика, даже если я передаю аргумент cmap=plt.cm.jet. - person pceccon; 19.07.2014
comment
@pceccon - Ага! Это связано с тем, что в вашем исходном примере диапазон данных масштабировался от 0 до 1, а в моем примере он масштабировался между минимальным и максимальным значениями данных. Чтобы сделать его идентичным оригиналу, используйте cmin=0, cmax=1. - person Joe Kington; 19.07.2014
comment
Верно! Рад, что ты уловил это! - person Joe Kington; 19.07.2014