Matplotlib:绘制许多不同颜色的断开线段

发布于 2021-01-29 19:35:13

我有一组这样的数据记录:

(s1, t1), (u1, v1), color1
(s2, t2), (u2, v2), color2
.
.
.
(sN, tN), (uN, vN), colorN

在任何记录中,前两个值是线段的 端点 ,第三个值是该线段的 颜色 。更具体地,(sn, tn)是第一端点(un, vn)的xy坐标,是第二端点的xy坐标。另外, 颜色 是具有alpha值的rgb。

通常,任何两个线段都是 断开连接的 (这意味着它们的端点不一定重合)。

如何通过一次调用(或尽可能少)使用 matplotlib 绘制此数据plot,因为可能有成千上万条记录。

尝试次数

在一个大列表中准备数据并对其进行调用plot太慢了。例如,以下代码无法在合理的时间内完成:

import numpy as np
import matplotlib.pyplot as plt

data = []
for _ in xrange(60000):
    data.append((np.random.rand(), np.random.rand()))
    data.append((np.random.rand(), np.random.rand()))
    data.append('r')

print 'now plotting...' # from now on, takes too long
plt.plot(*data)
print 'done'
#plt.show()

我可以通过使用 None 插入技巧来加速绘图渲染,如下所示:

import numpy as np
import matplotlib.pyplot as plt
from timeit import timeit

N = 60000
_s = np.random.rand(N)
_t = np.random.rand(N)
_u = np.random.rand(N)
_v = np.random.rand(N)
x = []
y = []
for s, t, u, v in zip(_s, _t, _u, _v):
    x.append(s)
    x.append(u)
    x.append(None)
    y.append(t)
    y.append(v)
    y.append(None)
print timeit(lambda:plt.plot(x, y), number=1)

这将在我的计算机上执行不到一秒钟。我仍然必须弄清楚如何嵌入颜色值(带有alpha通道的RGB)。

关注者
0
被浏览
62
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    好的,我最终将PIL图像上的行光栅化,然后将其转换为numpy数组:

    from PIL import Image
    from PIL import ImageDraw
    import random as rnd
    import numpy as np
    import matplotlib.pyplot as plt
    
    N = 60000
    s = (500, 500)
    
    im = Image.new('RGBA', s, (255,255,255,255))
    draw = ImageDraw.Draw(im)
    
    for i in range(N):
        x1 = rnd.random() * s[0]
        y1 = rnd.random() * s[1]
        x2 = rnd.random() * s[0]
        y2 = rnd.random() * s[1]
        alpha = rnd.random()
        color  = (int(rnd.random() * 256), int(rnd.random() * 256), int(rnd.random() * 256), int(alpha * 256)) 
        draw.line(((x1,y1),(x2,y2)), fill=color, width=1)
    
    plt.imshow(np.asarray(im),
               origin='lower')
    plt.show()
    

    这是迄今为止最快的解决方案,非常适合我的实时需求。需要注意的是,绘制线条时没有抗锯齿。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看