палитра matplotlib для разброса

89

Я работаю с данными, у которых есть 3 параметра построения графика: x, y, c. Как создать собственное значение цвета для диаграммы рассеяния?

Расширяя этот пример, я пытаюсь сделать:

import matplotlib
import matplotlib.pyplot as plt
cm = matplotlib.cm.get_cmap('RdYlBu')
colors=[cm(1.*i/20) for i in range(20)]
xy = range(20)
plt.subplot(111)
colorlist=[colors[x/2] for x in xy] #actually some other non-linear relationship
plt.scatter(xy, xy, c=colorlist, s=35, vmin=0, vmax=20)
plt.colorbar()
plt.show()

но результат TypeError: You must first set_array for mappable

Адам Гринхолл
источник

Ответы:

196

Из документов matplotlib по разбросу 1 :

cmap используется, только если c - массив чисел с плавающей запятой

Таким образом, список цветов должен быть списком чисел с плавающей запятой, а не списком кортежей, который у вас есть сейчас. plt.colorbar () хочет отображаемый объект, например CircleCollection, который возвращает plt.scatter (). vmin и vmax могут затем контролировать пределы вашей палитры. Вещи за пределами vmin / vmax получают цвета конечных точек.

Как это работает для вас?

import matplotlib.pyplot as plt
cm = plt.cm.get_cmap('RdYlBu')
xy = range(20)
z = xy
sc = plt.scatter(xy, xy, c=z, vmin=0, vmax=20, s=35, cmap=cm)
plt.colorbar(sc)
plt.show()

Пример изображения

матовый
источник
Я попробовал и получил 'AxesSubplot' object has no attribute 'colorbar'. Я сделал ax.colorbar()... что я делаю не так?
Лукас Аймаретто
Этот пример не обеспечивает четкое приложение при использовании ООП-интерфейса matplotlib
Ryszard Cetnarski
18

Вот способ добавления палитры в ООП:

fig, ax = plt.subplots()
im = ax.scatter(x, y, c=c)
fig.colorbar(im, ax=ax)
нейрит
источник
Когда я это делаю, я получаю полностью измененный масштаб графика, так что все точки находятся в пределах полосы графика в крайнем правом углу, а шкала цветов представляет собой очень тонкую линию внизу.
Марсес
pltЯ думаю, что правильный ответ, напрямую использовать для построения цветовой шкалы, не рекомендуется. Ваш способ рекомендуется.
GoingMyWay,
2

Если вы хотите разброс по двум переменным и цвет по третьей, Альтаир может стать отличным выбором.

Создание набора данных

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

df = pd.DataFrame(40*np.random.randn(10, 3), columns=['A', 'B','C'])

Заговор Альтаира

from altair import *
Chart(df).mark_circle().encode(x='A',y='B', color='C').configure_cell(width=200, height=150)

участок

введите описание изображения здесь

Нипун Батра
источник