pyqtgraph中图形的时间依赖布局

时间:2016-05-26 12:39:02

标签: python animation pyqtgraph

一天中的好时光!我正在尝试使用pyqtgraph创建带有时间绘制的树形图,并且在pyqtgraph示例中仅在CustomGraphItemQTimer中找到了教程。我找不到如何使顶点和边缘布局依赖于时间的方法。我需要在几秒钟内将它们排好。你能给我一些代码或建议怎么做吗?我的代码与示例非常相似:

# -*- coding: utf-8 -*-

import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import numpy as np
import time

# Enable antialiasing for prettier plots
pg.setConfigOptions(antialias=True)

w = pg.GraphicsWindow()
w.setWindowTitle('pyqtgraph example: CustomGraphItem')
v = w.addViewBox()
v.setAspectLocked()


class Graph(pg.GraphItem):
    def __init__(self):
        self.dragPoint = None
        self.dragOffset = None
        self.textItems = []
        pg.GraphItem.__init__(self)
        self.scatter.sigClicked.connect(self.clicked)

    def setData(self, **kwds):
        self.text = kwds.pop('text', [])
        self.data = kwds
        if 'pos' in self.data:
            npts = self.data['pos'].shape[0]
            self.data['data'] = np.empty(npts, dtype=[('index', int)])
            self.data['data']['index'] = np.arange(npts)
        self.setTexts(self.text)
        self.updateGraph()

    def setTexts(self, text):
        for i in self.textItems:
            i.scene().removeItem(i)
        self.textItems = []
        for t in text:
            item = pg.TextItem(t)
            self.textItems.append(item)
            item.setParentItem(self)

    def updateGraph(self):
        pg.GraphItem.setData(self, **self.data)
        for i, item in enumerate(self.textItems):
            item.setPos(*self.data['pos'][i])

    def mouseDragEvent(self, ev):
        if ev.button() != QtCore.Qt.LeftButton:
            ev.ignore()
            return

        if ev.isStart():
            # We are already one step into the drag.
            # Find the point(s) at the mouse cursor when the button was first
            # pressed:
            pos = ev.buttonDownPos()
            pts = self.scatter.pointsAt(pos)
            if len(pts) == 0:
                ev.ignore()
                return
            self.dragPoint = pts[0]
            ind = pts[0].data()[0]
            self.dragOffset = self.data['pos'][ind] - pos
        elif ev.isFinish():
            self.dragPoint = None
            return
        else:
            if self.dragPoint is None:
                ev.ignore()
                return

        ind = self.dragPoint.data()[0]
        self.data['pos'][ind] = ev.pos() + self.dragOffset
        self.updateGraph()
        ev.accept()

    def clicked(self, pts):
        print("clicked: %s" % pts)


g = Graph()
v.addItem(g)

## Define positions of nodes
pos = np.array([
    [5, 10],
    [3, 8],
    [8, 8],
    [10, 10],
    [-5, 0],
    [6, 5],
], dtype=float)



## Define the set of connections in the graph
adj = np.array([
    [0, 1],
    [1, 3],
    [3, 0],
    [2, 0],
    [1, 5],
    [1, 5],
    [5, 4],
])


## Define the symbol to use for each node (this is optional)
symbols = ['o', 'o', 'o', 'o', 't', '+']


## Define the line style for each connection (this is optional)
lines = np.array([
    (255, 0, 0, 255, 1),
    (255, 0, 255, 255, 2),
    (255, 0, 255, 255, 3),
    (255, 255, 0, 255, 2),
    (255, 0, 0, 255, 1),
    (255, 255, 255, 255, 8),
    (200, 235, 150, 255, 4),
], dtype=[('red', np.ubyte), ('green', np.ubyte), ('blue', np.ubyte), ('alpha', np.ubyte), ('width', float)])


## Define text to show next to each symbol
texts = ["Point %d" % i for i in range(6)]

## Update the graph
g.setData(pos=pos, adj=adj, pen=lines, size=1, symbol=symbols, pxMode=False, text=texts)


timer = pg.QtCore.QTimer()
def update():
    g.plot(x, y, clear=True)
timer.timeout.connect(update)
timer.start(16)


## Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
    import sys

    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

1 个答案:

答案 0 :(得分:0)

因为没有答案,所以我补充 - 我确实修改了:

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>NewApp</title>
    <base href="/">
    {{#unless environment.production}}
    <script src="/ember-cli-live-reload.js" type="text/javascript"></script>
    {{/unless}}
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="icon" type="image/x-icon" href="favicon.ico">
  </head>
  <body>
    <new-app-app>Loading...</new-app-app>

    {{#each scripts.polyfills}}<script src="{{.}}"></script>{{/each}}


    <script>
    System.import('system-config.js').then(function () {
    System.import('main');
    }).catch(console.error.bind(console));
    </script>

  </body>
</html>

对于那些决定在pyqtgraph中设置动画图形的人来说,这可能会有所帮助