在 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 您可以使用“内存设备上下文”,完成后将整个上下文从内存交换到屏幕)
我有兴趣在 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 您可以使用“内存设备上下文”,完成后将整个上下文从内存交换到屏幕)