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