Colormap в 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)

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

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

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

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

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-последовательности.

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