3

我一直在寻找一种在基于 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

我为简短的代码道歉 - 来自电话,但我的目标是最终在这个线程中完成一个完整的课程,以帮助我自己和参与数据科学的其他人理解较低级别的图形以加速渲染。

提前致谢,如果我遗漏了文档中明显的内容,我深表歉意。

4

0 回答 0