Цветовая карта в Matplotlib без использования функции рассеяния

Я построил точечный график с позициями x и y. Теперь у меня есть массив с третьей переменной, плотностью, и я хочу назначить цвет для каждой точки на диаграмме рассеивания в зависимости от ее значения плотности. Я знаю, как это сделать с помощью задачи "разброс" matplotlib, например:

x = [1,2,3,4]
y = [5,3,7,1]
density = [1,2,3,4]

map = plt.scatter(x, y, c=density)
colorbar = plt.colorbar(map)

Теперь я хотел бы сделать то же самое, используя вместо этого функцию "сюжет", что-то вроде:

map = plt.plot(x,y, '.', c=t)

Я пытаюсь сделать анимацию слияния галактик и назначить каждой частице цвет в зависимости от плотности этой области. Пока что код работает только с задачей «сюжет», поэтому мне нужно реализовать ее таким образом, но все примеры, которые я нашел, используют первый способ.

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


person Kike    schedule 04.01.2015    source источник
comment
Чтобы использовать plot, все должно быть одного цвета (из-за того, как это работает под слоем Agg). Я думаю, вы ищете метод set_offsets для Collection объектов.   -  person tacaswell    schedule 04.01.2015


Ответы (1)


Во-первых, @tcaswell прав. Вероятно, вы хотите анимировать scatter сюжет. Использование большого количества вызовов plot для этого приведет к гораздо худшей производительности, чем изменение коллекции, которую возвращает scatter.

Однако вот как вы можете использовать несколько вызовов plot для этого:

import numpy as np
import matplotlib.pyplot as plt

xdata, ydata, zdata = np.random.random((3, 10))

cmap = plt.cm.gist_earth
norm = plt.Normalize(zdata.min(), zdata.max())

fig, ax = plt.subplots()
for x, y, z in zip(xdata, ydata, zdata):
    ax.plot([x], [y], marker='o', ms=20, color=cmap(norm(z)))

sm = plt.cm.ScalarMappable(norm, cmap)
sm.set_array(zdata)
fig.colorbar(sm)

plt.show()

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

Просто для сравнения, вот то же самое с использованием scatter:

import numpy as np
import matplotlib.pyplot as plt

xdata, ydata, zdata = np.random.random((3, 10))


fig, ax = plt.subplots()
scat = ax.scatter(xdata, ydata, c=zdata, s=200, marker='o')
fig.colorbar(scat)

plt.show()

Если вы хотите изменить положение маркеров на точечной диаграмме, вы должны использовать scat.set_offsets(xydata), где xydata — последовательность, подобная массиву Nx2.

person Joe Kington    schedule 05.01.2015