Добавить точки к существующему графику рассеяния matplotlib

Как добавить точки к существующей диаграмме? Простое решение - построить новый разброс, добавив новые данные.

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)

Я хочу только добавить новые точки в новых цветах. Мне НЕ нужны анимации

Возможный дубликат Динамическое обновление графика в matplotlib

DatHydroGuy 05.12.2018 11:33

@DatHydroGuy да, я видел это раньше, но мне не нужны никакие анимации и прочее. Мне просто нужно добавить новые данные с новым цветом

toyewonug 05.12.2018 11:36

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

ImportanceOfBeingErnest 05.12.2018 11:56

@ImportanceOfBeingErnest именно так. И сюжет у меня уже есть. Как добавить на него баллы?

toyewonug 05.12.2018 12:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
12
4
33 463
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Чтобы просто добавить новые данные с новым цветом, действительно, повторный вызов 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()

Мне кажется, что код - это то, что я показал, просто имея разные имена переменных

toyewonug 05.12.2018 11:53

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

b-fg 05.12.2018 11:59

У меня есть график существующий, и я хочу добавить на него новую точку

toyewonug 05.12.2018 12:34

По-прежнему неясно, поскольку у меня есть существующий сюжет в моем коде, и я добавляю к нему новые точки. Покажите весь свой код или минимальный рабочий пример и ожидаемый результат.

b-fg 05.12.2018 12:37

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

toyewonug 05.12.2018 12:39

@ b-fg Есть много причин, по которым вы можете захотеть присоединить новые точки к существующей кривой вместо одного нового разброса на новую точку. Ваше решение работает визуально, но тогда вы не можете делать ничего позже, например, извлекать данные, складывать две кривые вместе, изменять прозрачность ... Это легко, если одна кривая y (x) имеет уникальный gid и содержит все его данные. Если у вас несколько скаттеров, это становится излишне сложным.

Guimoute 19.12.2018 17:15
Ответ принят как подходящий

Непонятно, почему создание второго 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(), чтобы не рисовать все. Однако, как вы указываете, есть много случаев, когда этот подход терпит неудачу, поэтому следует осторожно полагаться на любой сюжет, созданный таким образом.
ImportanceOfBeingErnest 05.12.2018 13:00

Просто чтобы добавить глупости ...? Боже мой ... Я думал, что Python может делать что-нибудь в одной строчке кода или меньше ..? Ничего себе ... Я мог бы сделать это на C .... фу ....

user2052717 01.07.2019 12:49

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

def AddPoint(plot, x, y, color):
    plot.scatter(x, y, c=color)
    plot.clf()
    plot.show()

Другие вопросы по теме