向现有的 matplotlib 散点图添加点

Posted

技术标签:

【中文标题】向现有的 matplotlib 散点图添加点【英文标题】:Add points to the existing matplotlib scatter plot 【发布时间】:2019-05-06 21:30:14 【问题描述】:

如何在现有图表中添加点?直接的解决方案是绘制一个新的散点图,添加新数据。

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)

我只想添加新颜色的新点。我不需要任何动画

【问题讨论】:

Dynamically updating plot in matplotlib的可能重复 @DatHydroGuy 是的,我以前见过,但我不需要任何动画等等。我只需要添加一些新颜色的新数据 那么第一个散点图有一个颜色图,你要添加的点应该有一个不属于原始颜色图的颜色? @ImportanceOfBeingErnest 完全正确。而且我已经有了一个阴谋。怎么加分呢? 【参考方案1】:

假设你已经有一个情节,你可以创建这个函数。

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

【讨论】:

【参考方案2】:

目前尚不清楚为什么不能按照@b-fg 的建议创建第二个scatter,但您可以编写如下函数:

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)

请注意,我提出的功能非常基本,需要根据用例变得更加智能。重要的是要意识到 PathCollection 中的 facecolors 数组的元素数量不一定与点的数量相同,因此如果您尝试一次添加多个点,或者如果原点都是一样的颜色,等等……

【讨论】:

“为什么我需要 draw 画布才能工作” - 因为只有这样才能从颜色图和规范中实际应用面颜色。您可以用scat.update_scalarmappable() 替换该行,以免绘制所有内容。但是,正如您所指出的,这种方法在很多情况下都失败了,因此应该小心依赖以这种方式产生的任何情节。 只是为了添加一个愚蠢的观点......?我的上帝...我认为 Python 可以在一行代码或更少的代码中做任何事情..?哇......我几乎可以在 C 中做到这一点......哇......【参考方案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()

【讨论】:

在我看来,代码就是我展示的只是具有不同的变量名 是的,但我发布它是为了表明您可以多次调用它,它们实际上是相互叠加的。不知道你的问题是什么。请编辑您的问题以使其更清楚。 我有一个现有的图并想在上面添加一个新点 仍然不清楚,因为我的代码中有一个现有的情节,我向它添加了新的点。显示您的整个代码或一个最小的工作示例以及您的预期输出。 @b-fg 您可能希望将新点附加到现有曲线上,而不是每个新点都有一个新散点,原因有很多。您的解决方案在视觉上工作,但是您以后无法执行任何操作,例如检索数据、将两条曲线添加在一起、更改透明度...如果一条 y(x) 曲线具有唯一的 @987654325,那么这些事情就很容易了@ 并包含其所有数据。如果你有多个分散点,它会变得不必要地困难。

以上是关于向现有的 matplotlib 散点图添加点的主要内容,如果未能解决你的问题,请参考以下文章

Python使用matplotlib模块绘制多条折线图散点图

使用 matplotlib 保存散点图动画

如何在 matplotlib 中添加悬停注释

matplotlib 中具有重叠点的散点图的可视化

带有颜色渐变的 Matplotlib 3D 散点图

Matplotlib基础图形之散点图