向现有的 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 散点图添加点的主要内容,如果未能解决你的问题,请参考以下文章