matplotlib-изменение цвета маркера вдоль линии участка

Я хотел бы построить 2d-набор данных с matplotlib таким образом, чтобы цвет маркера для каждой точки данных был разным. Я нашел пример на разноцветных строках (http://matplotlib.org/examples/pylab_examples/multicolored_line.html). Однако это, похоже, не работает при построении линии с маркерами.

решение, которое я придумал, индивидуально отображает каждую точку:

import matplotlib.cm as cm
import matplotlib.pyplot as plt
import numpy as np

# The data
x = np.linspace(0, 10, 1000)
y = np.sin(2 * np.pi * x)

# The colormap
cmap = cm.jet

# Create figure and axes
fig = plt.figure(1)
fig.clf()
ax = fig.add_subplot(1, 1, 1)

# Plot every single point with different color
for i in range(len(x)):
    c = cmap(int(np.rint(x[i] / x.max() * 255)))
    ax.plot(x[i], y[i], 'o', mfc=c, mec=c)
    ax.set_xlim([x[0], x[-1]])
    ax.set_ylim([-1.1, 1.1])
    ax.set_xlabel('x')
    ax.set_ylabel('y')

plt.draw()
plt.show()

# Save the figure
fig.savefig('changing_marker_color.png', dpi=80)

результирующий график выглядит так, как должен, но построение получает очень медленно и очень быстро. Есть ли хитрый трюк, чтобы ускорить заговор?

1 ответов


Я считаю, что вы можете достичь этого с ax.scatter:

# The data
x = np.linspace(0, 10, 1000)
y = np.sin(2 * np.pi * x)

# The colormap
cmap = cm.jet

# Create figure and axes
fig = plt.figure(1)
fig.clf()
ax = fig.add_subplot(1, 1, 1)

c = np.linspace(0, 10, 1000)
ax.scatter(x, y, c=c, cmap=cmap)

Scatter принимает c как последовательность поплавков, которые будут отображаться на цвета с помощью cmap.

enter image description here

используя timeit Я получаю 10-кратное уменьшение времени (около 1,25 секунды для исходного метода и 76,8 МС здесь)