2013-09-04 3 views
8

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

Решение, которое я придумал индивидуально участки каждый пункт:

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) 

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

ответ

15

Я считаю, что вы можете добиться этого с 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 принимает с как последовательность поплавков, которые будут отображаться в цвета, используя CMap.

enter image description here

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

Смежные вопросы