Как добавить точки к существующей диаграмме? Простое решение - построить новый разброс, добавив новые данные.
ax.scatter(data[:,0], data[:,1], cmap = cmap, c = color_data)
ax.scatter(new_points_x, new_points_y, color='blue')
Но если мы хотим добавить больше точек с новыми цветами, возникает проблема: мы должны учитывать все ранее добавленные точки.
Было бы здорово, если бы я мог использовать специальную функцию вроде
AddPoint(ax, new_point, color)
Я хочу только добавить новые точки в новых цветах. Мне НЕ нужны анимации
@DatHydroGuy да, я видел это раньше, но мне не нужны никакие анимации и прочее. Мне просто нужно добавить новые данные с новым цветом
Итак, у первого разброса есть цветовая карта, а точки, которые вы хотите добавить, должны иметь цвет, который не является частью исходной цветовой карты?
@ImportanceOfBeingErnest именно так. И сюжет у меня уже есть. Как добавить на него баллы?






Чтобы просто добавить новые данные с новым цветом, действительно, повторный вызов scatter добавит новые точки с указанным цветом:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(10)
a = np.random.rand(10)
plt.scatter(x, a, c='blue')
b = np.random.rand(10)
plt.scatter(x, b, c='red')
plt.show()
Мне кажется, что код - это то, что я показал, просто имея разные имена переменных
Да, но я разместил это, чтобы было показано, что вы можете вызывать его несколько раз, и они фактически добавляются друг к другу. не уверен, в чем тогда ваша проблема. Измените свой вопрос, чтобы было понятнее.
У меня есть график существующий, и я хочу добавить на него новую точку
По-прежнему неясно, поскольку у меня есть существующий сюжет в моем коде, и я добавляю к нему новые точки. Покажите весь свой код или минимальный рабочий пример и ожидаемый результат.
пожалуйста, посмотрите на вторую часть вопроса >> Было бы здорово, если бы я мог использовать специальную функцию вроде AddPoint
@ b-fg Есть много причин, по которым вы можете захотеть присоединить новые точки к существующей кривой вместо одного нового разброса на новую точку. Ваше решение работает визуально, но тогда вы не можете делать ничего позже, например, извлекать данные, складывать две кривые вместе, изменять прозрачность ... Это легко, если одна кривая y (x) имеет уникальный gid и содержит все его данные. Если у вас несколько скаттеров, это становится излишне сложным.
Непонятно, почему создание второго scatter, как предлагает @ b-fg, неприемлемо, но вы можете написать такую функцию:
def addPoint(scat, new_point, c='k'):
old_off = scat.get_offsets()
new_off = np.concatenate([old_off,np.array(new_point, ndmin=2)])
old_c = scat.get_facecolors()
new_c = np.concatenate([old_c, np.array(matplotlib.colors.to_rgba(c), ndmin=2)])
scat.set_offsets(new_off)
scat.set_facecolors(new_c)
scat.axes.figure.canvas.draw_idle()
который позволяет вам добавить новую точку к существующему PathCollection.
пример:
fig, ax = plt.subplots()
scat = ax.scatter([0,1,2],[3,4,5],cmap=matplotlib.cm.spring, c=[0,2,1])
fig.canvas.draw() # if running all the code in the same cell, this is required for it to work, not sure why
addPoint(scat, [3,6], 'c')
addPoint(scat, [3.1,6.1], 'pink')
addPoint(scat, [3.2,6.2], 'r')
addPoint(scat, [3.3,6.3], 'xkcd:teal')
ax.set_xlim(-1,4)
ax.set_ylim(2,7)
Обратите внимание, что функция, которую я предлагаю, очень проста, и ее необходимо сделать намного умнее в зависимости от варианта использования. Важно понимать, что массив facecolors в PathCollection не обязательно имеет то же количество элементов, что и количество точек, поэтому могут произойти забавные вещи с цветами, если вы попытаетесь добавить несколько точек как один раз, или если исходные точки все одинаковые цвета и тд ...
draw, чтобы это работало» - потому что только тогда цвета лица фактически применяются из цветовой карты и нормы. Вы можете заменить эту линию на scat.update_scalarmappable(), чтобы не рисовать все. Однако, как вы указываете, есть много случаев, когда этот подход терпит неудачу, поэтому следует осторожно полагаться на любой сюжет, созданный таким образом.
Просто чтобы добавить глупости ...? Боже мой ... Я думал, что Python может делать что-нибудь в одной строчке кода или меньше ..? Ничего себе ... Я мог бы сделать это на C .... фу ....
Предполагая, что у вас уже есть сюжет, вы можете создать эту функцию.
def AddPoint(plot, x, y, color):
plot.scatter(x, y, c=color)
plot.clf()
plot.show()
Возможный дубликат Динамическое обновление графика в matplotlib