对于 Matplotlib 散点函数中相同的 XY 坐标,如何对绘图上所有相关的类似数组的数据值(c 参数)求和?

问题描述 投票:0回答:1

我有三个长度相等的独立一维 Numpy 数组,我将它们用作 matplotlib 散点函数的 x、y 和 c 参数输入,没有任何问题。 x 和 y 数组中包含的一些绘图坐标是重复的。在坐标重复的地方,我想绘制所有相关 c 参数(数据)值的总和。

有内置的 matplotlib 方法可以做到这一点吗?或者,我认为我需要从 x 和 y 数组中删除所有重复的坐标以及数据数组中的关联值。但在此之前,必须将关联的数据值添加到与剩余坐标相关的数据数组中。

下面显示了一个简单的示例,其中重复的坐标已被删除,并将数据值添加到剩余的一对坐标中。

Before
x =    np.array([3, 7, 12, 3, 56, 4, 2, 3, 65, 87, 12, 3, 9, 7, 87])
y =    np.array([7, 24, 87, 9, 65, 43, 54, 9, 3, 8, 34, 9, 23, 6, 8])
data = np.array([6, 45, 4, 25, 7, 45, 78, 4, 82, 3, 9, 43, 32, 5, 9])

After
x =    np.array([3, 7, 12, 3, 56, 4, 2, 65, 87, 12, 9, 7])
y =    np.array([7, 24, 87, 9, 65, 43, 54, 3, 8, 34, 23, 6])
data = np.array([6, 45, 4, 72, 7, 45, 78, 4, 12, 9, 32, 5])

我在 Stackoverflow 上找到了一种算法,可以使用 Python zip 和一组在几秒钟内从 x 和 y 数组中删除重复的坐标。然而,我尝试将其扩展到数据数组需要一个小时才能执行,而且我没有改进这方面的经验。数组的长度通常为 600,000 个元素。

python matplotlib scatter-plot
1个回答
0
投票

即使对于比您正在处理的数据集大得多的数据集,以下尝试也相当快。我测试了 x,y 和数据的大小为 6_000_000,仍然在大约 10 秒内完成,而不是使用特别强大的机器。

但是,如果数组达到一定大小,则打印数组会很耗时。

import numpy as np

# generating some test data
x = np.random.randint(0, 100_000, 600_000)
y = np.random.randint(0, 100_000, 600_000)
data = np.random.randint(0, 10_000, 600_000)

#initializing the result dict
#set(zip()) make sure we are dealing only with unique x/y pairs
data_tmp = {key: 0 for key in set(zip(x,y))}

# determine sum for each unique x,y pair
for key, val in zip(zip(x,y),data):
    data_tmp[key] += val

# translating the dict to your cleaned up arrays
x_after = [a for a,_ in data_tmp.keys()]
y_after = [b for _,b in data_tmp.keys()]
data_after = data_tmp.values()

作为旁注: 检查您的示例中的代码,我意识到您的

data
似乎是错误的。您少了一个 82,并且至少多了一个 4。

© www.soinside.com 2019 - 2024. All rights reserved.