Python график точек, каждый разного цвета? - PullRequest
0 голосов
/ 27 января 2020

Matplotlib в python использует последовательности значений x и y для создания графика данных.

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

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

import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('A single color plot')

enter image description here

1 Ответ

2 голосов
/ 27 января 2020

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

В идеале, я Хотелось бы, чтобы каждая точка имела определенный цвет, а сегменты линий плавно интерполировали в цветовом спектре между этими соответствующими цветами. Но я полагаю, что matplotlib - это свободное программное обеспечение, поэтому неудивительно, что он не обладает самыми необычными функциями. Если, конечно, если это можно сделать, но я не знаю как?

import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)
xy = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.hstack([xy[:-1], xy[1:]])
fig, ax = plt.subplots()
lc = LineCollection(segments, colors=np.random.rand(len(segments), 3))
ax.add_collection(lc)
ax.autoscale()
ax.set_title('A multi-color plot')
plt.show()

enter image description here

РЕДАКТИРОВАТЬ:

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

import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
x = [0.]
while x[-1]<2 * np.pi :
    x.append(x[-1] +1/(100*np.sqrt(1+4*x[-1]*x[-1]*np.cos(x[-1]*x[-1])*np.cos(x[-1]*x[-1]))))
x = np.array(x)
y = np.sin(x ** 2)
xy = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.hstack([xy[:-1], xy[1:]])
myColors = np.random.rand(len(segments), 3)
for i in range(len(segments)//10):
    for j in range(9):
        myColors[10*i+j+1] = myColors[10*i]+(myColors[10*(i+1)]-myColors[10*i])*(j+1)/10
fig, ax = plt.subplots()
lc = LineCollection(segments, colors=myColors)
ax.add_collection(lc)
ax.autoscale()
ax.set_title('A multi-color plot')
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...