在 Python 中绘制随机图

Plotting random graphs in Python

我有兴趣在 Python 中绘制随机图。

更准确地说,我认为所有的点(x, y)都是整数坐标,这样|x| < 30, |y| < 30(n = 30只是这里的一个例子)

然后,对于每对点,我以概率 p (we can say p = 0.5) 决定这两个点是否相连。

然后,我想绘制我得到的所有片段。例如,我们可以得到类似的东西:

我遇到的问题是绘制所有这些线段需要相当长的时间。当然,它随着 n 和 p 的增加而增加。

所以我的问题是:如何使用 pyplot 快速绘制所有这些线段?

感谢您的帮助。

编辑:这是一个有效但速度很慢的代码示例。

import numpy as np
import matplotlib.pyplot as plt

for i in range(101):
    for j in range(101):
        if i < 100:
            if np.random.uniform() < 1/2:
                plt.plot([i - 50, i - 50 + 1], [j - 50, j - 50], "r")
        if j < 100:
            if np.random.uniform() < 1/2:
                plt.plot([i - 50, i - 50], [j - 50, j - 50 + 1], "r")
                
plt.show()

你没有提供源代码,但我猜你正在生成你的段,然后使用 plt.plot(point_A, point_B)

单独绘制它们

您应该考虑以下解决方案之一:

1。将图形绘制为二维图像

我们没有将您的图表视为线段列表,而是将其视为二维连接矩阵,并简单地绘制该矩阵一次。

例如


segments = ... # you generate this list of pairs (POINT_A, POINT_B) that define your segments using your algorithm

matrix = np.zeros((30, 30))
for ((xA, yA), (xB, yB)) in segments:
   # we re-order coordinates in order to always have A inferior to B
   if yA > yB:
      yA, yB = yB, yA
   if xA > xB:
      xA, xB = xB, xA

   # we mark all points belonging to the segment [A, B] as True in the matrix
   matrix[yA:yB+1, xA:xB+1] = 1
plt.imshow(matrix)

我没有测试代码,提供它只是为了说明这个想法。

2。使用来自 matplotlib

的 lineCollections

最佳描述如下:

在我看来,您的“分段”实际上是单个像素。

plt.plot([i - 50, i - 50 + 1], [j - 50, j - 50], "r")

是一种非常低效的设置像素颜色的方法。

建议:在内存中创建一个矩阵,计算需要着色的位置。然后遍历矩阵,并为每个设置的位置,为相应的像素着色。如果你有一个像样的图形库,那么如果你推迟屏幕更新直到所有像素都着色,那么你将获得巨大的性能提升。 (使用 windows API 您可以使用“内存设备上下文”,完成后将整个上下文从内存交换到屏幕)