当前位置: 首页 > 面试题库 >

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

徐瀚
2023-03-14
问题内容

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

(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)。


问题答案:

好的,我最终将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()

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



 类似资料:
  • 本文向大家介绍Python+matplotlib绘制不同大小和颜色散点图实例,包括了Python+matplotlib绘制不同大小和颜色散点图实例的使用技巧和注意事项,需要的朋友参考一下  具有不同标记颜色和大小的散点图演示。 演示结果: 实现代码: 总结 以上就是本文关于Python+matplotlib绘制不同大小和颜色散点图实例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他

  • 问题内容: 我遇到以下问题,我想创建自己的颜色图(红色-混合-紫色-混合-蓝色),将其映射到-2到+2之间的值,并想用它来绘制绘图中的点。然后该图应具有右侧的色标。 到目前为止,这就是我创建地图的方式。但是我不确定是否混合颜色。 这样,我将颜色映射到值。 然后我将其绘制: 我的问题是: 1.我无法绘制色标。 2.我不确定我的色标是否正在创建连续的(平滑的)色标。 问题答案: 这里有一个有关如何创建

  • 问题内容: 我正在尝试在Python中创建色轮,最好使用Matplotlib。以下工作正常: 但是,这种尝试有两个严重的缺点。 首先,当将结果图形保存为矢量(Figure_1.svg)时,色轮(按预期方式)由621种不同形状组成,分别对应于要绘制的不同(x,y)值。尽管结果看起来像个圆圈,但实际上并非如此。我非常希望使用一个实际的圆,该圆由一些路径点和它们之间的Bezier曲线定义,例如。在我看来

  • 我知道我可以只打印出图像,但我想找出玩家何时与不正确的颜色碰撞(就像颜色切换中的做法一样),以便他们在这种情况下失败,我假设如果我使用图片是不可能的。我该怎么做?

  • 问题内容: 我开始使用Python(和OOP)进行编程,但是我对Fortran(90/95)和Matlab编程有丰富的经验。 我正在开发一个在tkinter环境上使用动画的小工具。该工具的目标是为多线动画(数组而不是数据向量)。下面是我的问题的一个简单示例。我不明白为什么这两种数据绘制方法的结果如此不同? 如果仅绘制“ dline”,则每条线将分别绘制并使用不同的颜色。如果仅绘制“ mline”,

  • 问题内容: 我已经使用样条插值法来平滑时间序列,并且还想在绘图中添加一条水平线。但是似乎有一个我无法控制的问题。任何帮助都会非常有帮助。这是我所拥有的: 问题似乎与我对水平线图的使用有关。 问题答案: 您是正确的,我认为这使您失望。您将要重用原始的x轴变量,并使用另一个包含变量的相同长度的numpy数组对其进行绘制。 希望可以解决问题!