使用Python Qt快速更新热图

时间:2015-10-29 03:57:14

标签: pyside pyopengl vispy

我一直在寻找一种在基于python的UI中快速绘制大型热图的方法。在过去,我使用了matplotlib的contourf,pcolor和pcolormesh可用的后端。我没有使用imshow,因为我的典型数据位于极地平面(雷达)上。在matplotlib中,我会提供以下内容

from matplotlib import Figure
import numpy as np

# some class initialization 
        self.fig = Figure ()
        self.axes = self.fig.add_subplot (111, polar=True)

    def plotter (self):
        self.axes.cla ()
        self.axes.pcolormesh (self.thetas, self.ranges, self.data)
        self.axes.draw ()

我一直在调查OPENGL库,我喜欢我用vispy见过的温和介绍。在一天结束时,我想找到最简单的方法来定义一组2D顶点,并能够改变与它们相关的颜色,并填充其间的像素;无论是线性渐变还是实心多边形。虽然我没有完全掌握纹理,但我可以定义许多三角形及其颜色,但这似乎效率低下。必须有一种直接的方法来定义点和它们的颜色,并填写它们之间。

这样的东西
from vispy import gloo, app
app.use_app('pyside')
import numpy as np

VERTEX = '''
attribute vec2 position;
attribute vec4 color;
varying vec4 v_color;
void main() {
    v_color = color;
    gl_Position = vec4(position, 0.0, 1.0);
}
'''

FRAGMENT = '''
varying vec4 v_color
void main() {
// magic
}
'''

class PolarHeatmapWidget(app.Canvas):
    def __init__(self,_Ntheta,_Nr, **kwargs):
        app.Canvas.__init__(self, size=(400,400), **kwargs)
        self.Ntheta = _Ntheta
        self.Nr = _Nr
        self.program = gloo.Program (VERTEX, FRAGMENT)
        self.initializeData()
        self.program ['position'] = gloo.VertexBuffer(self.positions)
        self.program ['color'] = gloo.VertexBuffer(self.colors)
        self.apply_zoom()        

    def on_draw(self, event):
        gloo.clear()
        self.program.draw(MORE_MAGIC)

    def intialize(self):
        self.show()

    def on_resize(self, event):
        self.apply_zoom()

    def apply_zoom(self):
        minsize = min(self.physical_size[0], self.physical_size[1])
        gloo.set_viewport(self.physical_size[0] / 2 - minsize / 2, \
                          self.physical_size[1] / 2 - minsize / 2, \
                          minsize, minsize)
        self.update()

    def initializeData(self):
       ranges = np.linspace(0,1,self.Nr)
       thetas = np.radians(np.linspace(0,360,self.Ntheta))
       self.positions = np.zeros((self.Ntheta*self.Nr, 2), dtype=np.float32)
       for t in xrange(self.Ntheta):
           for r in xrange(self.Nr):
               self.positions[t*self.Nr+r][0] = ranges[r] * np.cos(thetas[t])
               self.positions[t*self.Nr+r][1] = ranges[r] * np.sin(thetas[t])
       self.colors = np.zeros((self.Ntheta*self.Nr, 4), dtype=np.float32)
       self.colors[:,3] += 1

我为简短的代码道歉 - 来自手机,但我的目标是在这个帖子中结束一个完整的课程,以帮助自己和参与数据科学的其他人了解较低级别的图形以加速渲染。

如果我错过了文档中显而易见的内容,请提前致谢并道歉。

0 个答案:

没有答案