включение сетки с помощью AxisItem в pyqtgraph приводит к нарушению масштабирования оси

У меня проблемы с AxisItem. Как только я включаю сетку x и y, ось x больше не может увеличиваться и уменьшаться с помощью функции масштабирования/панорамирования. Любые идеи?

from PyQt4 import QtCore, QtGui 
from pyqtgraph import Point 
import pyqtgraph as pg


pg.setConfigOption('background', 'w')
pg.setConfigOption('foreground', 'k')

class plotClass(QtGui.QMainWindow):  
    def setupUi(self, MainWindow):

        self.centralwidget = QtGui.QWidget(MainWindow)      
        MainWindow.resize(1900, 1000)

        self.viewbox = pg.GraphicsView(MainWindow, useOpenGL=None, background='default')
        self.viewbox.setGeometry(QtCore.QRect(0, 0, 1600, 1000))

        self.layout = pg.GraphicsLayout()
        self.viewbox.setCentralWidget(self.layout)
        self.viewbox.show()

        self.view = self.layout.addViewBox()

        self.axis1 = pg.AxisItem('bottom', linkView=self.view, parent=self.layout)
        self.axis2 = pg.AxisItem('right', linkView=self.view, parent=self.layout)

        self.axis1.setGrid(255)
        self.axis2.setGrid(255)

        self.layout.addItem(self.axis1, row=1, col=0)
        self.layout.addItem(self.axis2, row=0, col=1)

if __name__== "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = plotClass()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

person user3047917    schedule 09.11.2016    source источник
comment
Можете ли вы уточнить, каковы ваши конечные намерения? В настоящее время вы ничего не отображаете, поэтому его сложно сузить, я могу подтвердить, что это происходит даже в их надуманном примере (../examples/ViewBox.py), если вы выполняете команду setGrid. Однако я не уверен, действительно ли вам нужен прямой доступ к setGrid. Если, например, вы в конечном итоге собираетесь добавить фактический график, объект PlotItem имеет метод showGrid, который делает это правильно, не испортив все.   -  person segFaultCoder    schedule 14.11.2016
comment
Моим конечным намерением является отображение больших наборов данных с помощью graphItem().   -  person user3047917    schedule 14.11.2016


Ответы (1)


Глядя на ваш последний комментарий, рассмотрите этот вариант:

Папка примеров pyqtgraph содержит пример «GraphItem.py», который добавляет и отображает объект GraphItem в окне только через ViewBox. Однако они не используют сетку, поэтому, если вы хотите использовать сетку с GraphItem, просто сначала добавьте PlotItem (у которого уже есть связанный ViewBox... и, как вы уже догадались,... AxisItems для сетки!) ,... затем получите ViewBox, чтобы добавить свои GraphItems. Модифицированный GraphItem.py будет выглядеть так (с сопровождающим showGrid):

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

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

w = pg.GraphicsWindow()
w.setWindowTitle('pyqtgraph example: GraphItem')

### comment out their add of the viewbox
### since the PlotItem we're adding will have it's 
### own ViewBox

#v = w.addViewBox()


pItem1 = w.addPlot()  # this is our new PlotItem
v = pItem1.getViewBox()  # get the PlotItem's ViewBox
v.setAspectLocked()  # same as before

g = pg.GraphItem() # same as before
v.addItem(g)  # same as before

pItem1.showGrid(x=True,y=True)  # now we can turn on the grid

### remaining code is the same as their example

## Define positions of nodes
pos = np.array([
    [0,0],
    [10,0],
    [0,10],
    [10,10],
    [5,5],
    [15,5]
    ])

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

## 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,4),
    ], dtype=[('red',np.ubyte),('green',np.ubyte),('blue',np.ubyte),('alpha',np.ubyte),('width',float)])

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


## 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_()

Я проверил это, и прокрутка / масштабирование все еще работали после включения сетки, поэтому до сих пор не уверен, почему делать это по-другому НЕ работает, но иногда найти другой способ - лучший ответ :)

person segFaultCoder    schedule 15.11.2016
comment
Большое спасибо! Я попробовал что-то подобное и не смог заставить его работать, а затем у меня было одно окно просмотра, перекрывающее другое, и я столкнулся с кучей других проблем. - person user3047917; 16.11.2016