Hi,

I can tell you why it doesn't work, but unfortunately can't immediately 
suggest a workaround. Here's some demo code which lists out the drawing 
order for all the plot items:
#!/usr/bin/env python3

from PyQt5 import QtWidgets
import pyqtgraph as pg
import numpy as np

class TestPlot(pg.GraphicsLayoutWidget):

    def __init__(self):
        super().__init__()
        self.plotItem = self.addPlot()
        self.plotItem.getViewBox().setBackgroundColor((192,192,192))
        self.plotItem.showGrid(True)
        self.plotItem.getAxis("bottom").setPen({"color": (255, 0, 0), 
"width": 5})
        plot = self.plotItem.plot(np.random.rand(10), pen={"color": (0, 0, 0
), "width": 3})

        def format_graphicsitem_tree(gitem, newline=False):
            returnstring = "{}: {}\n".format(gitem.zValue(), gitem)
            for child in gitem.childItems():
                returnstring += "  {}\n".format(format_graphicsitem_tree(
child).replace("\n", "\n  "))
            return returnstring.rpartition("\n")[0]
        print(format_graphicsitem_tree(self.plotItem))
 
def main():
    import sys
    app = QtWidgets.QApplication(sys.argv)
    mainwindow = TestPlot()
    mainwindow.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Output:
0.0: <pyqtgraph.graphicsItems.PlotItem.PlotItem.PlotItem object at 
0x7fc3371b13a8>
  -1000.0: <pyqtgraph.graphicsItems.AxisItem.AxisItem object at 
0x7fc334166048>
    0.0: <PyQt5.QtWidgets.QGraphicsTextItem object at 0x7fc3341660d8>
  -1000.0: <pyqtgraph.graphicsItems.AxisItem.AxisItem object at 
0x7fc334166168>
    0.0: <PyQt5.QtWidgets.QGraphicsTextItem object at 0x7fc3341661f8>
  -1000.0: <pyqtgraph.graphicsItems.AxisItem.AxisItem object at 
0x7fc334166288>
    0.0: <PyQt5.QtWidgets.QGraphicsTextItem object at 0x7fc334166318>
  -1000.0: <pyqtgraph.graphicsItems.AxisItem.AxisItem object at 
0x7fc3341663a8>
    0.0: <PyQt5.QtWidgets.QGraphicsTextItem object at 0x7fc334166438>
  -100.0: <pyqtgraph.graphicsItems.ViewBox.ViewBox.ViewBox object at 
0x7fc3371b1708>
    -1000000.0: <PyQt5.QtWidgets.QGraphicsRectItem object at 0x7fc3371b1828>
    0.0: <pyqtgraph.graphicsItems.ViewBox.ViewBox.ChildGroup object at 
0x7fc3371b1798>
      0.0: <pyqtgraph.graphicsItems.PlotDataItem.PlotDataItem object at 
0x7fc3341665e8>
        0.0: <pyqtgraph.graphicsItems.PlotCurveItem.PlotCurveItem object at 
0x7fc3341764c8>
        0.0: <pyqtgraph.graphicsItems.ScatterPlotItem.ScatterPlotItem object 
at 0x7fc334176288>
      1000000000.0: <PyQt5.QtWidgets.QGraphicsRectItem object at 
0x7fc3371b18b8>
    0.0: <PyQt5.QtWidgets.QGraphicsRectItem object at 0x7fc3371b1948>
  0.0: <pyqtgraph.graphicsItems.ButtonItem.ButtonItem object at 
0x7fc3371b15e8>
  0.0: <pyqtgraph.graphicsItems.LabelItem.LabelItem object at 0x7fc3341664c8
>
    0.0: <PyQt5.QtWidgets.QGraphicsTextItem object at 0x7fc334166558>

The scene is laid out in that order. You can also see each GraphicsItem can 
have child items. Setting a zValue rearranges the order of sibling items 
(at the same indent level) only. So the background (QGraphicsRectItem with 
zValue -1e6) is a child of the ViewBox, as are the PlotItems. The AxisItems 
are siblings of the ViewBox. So changing the ZValue of an AxisItem can push 
the grid lines below or above all of those, but you can't fit it in between 
just by changing the zValue.

You may be able to do some magic by swapping graphicsItem parents around 
(setParent), but you may have issues with position and scaling. You could 
also see if you can overlay two linked ViewBoxes, one holding the 
background (but no axes etc) and another holding the plot and axis labels 
as normal.

Patrick





On Monday, 27 May 2019 20:37:49 UTC+9:30, JJ wrote:
>
> Hi Patrick,
> Setting the z value of the axes items worked as you suggested. However, 
> the grid is now rendered on top of the plotted curve. Do you have an idea 
> of how to render the curve on top?
> I have tried setting the z value of the curve but this doesn't seem to 
> help.
>
> self.viewbox.setBackgroundColor((192,192,192))
> self.myplot.getAxis("bottom").setPen({"color": (255, 255, 255), "width": 5
> })
> self.myplot.getAxis("left").setPen({"color": (255, 255, 255), "width": 5})
> for k in ['bottom', 'left']:
>             axis = self.myplot.getAxis(k)
>             axis.setZValue(1)
> curve = self.myplot.plot(self.xdata, self.ydata, pen=MYPEN)
> curve.setZValue(1e6) #this doesn't help
>
> John
>
> On Thursday, May 23, 2019 at 2:27:18 AM UTC+2, Patrick wrote:
>>
>> Hi,
>>
>> Yeah, all that spacing/padding functionality is buried in the Qt 
>> QGraphicsWidget 
>> <https://doc.qt.io/qt-5/qgraphicswidget.html#setContentsMargins> and 
>> QGraphicsGridLayout <https://doc.qt.io/qt-5/qgraphicsgridlayout.html> 
>> subclasses of GraphicsWidget etc. Examples:
>> # ci is the central item (a GraphicsLayout) of a GraphicsLayoutWidget.
>> # Set column spacing between first and second plot
>> graphicslayoutwidget.ci.layout.setColumnSpacing(0, 100)
>> # Set left, top, right, bottom padding around edges of the layout
>> graphicslayoutwidget.ci.layout.setContentsMargins(100, 50, 200, 10)
>>
>> Patrick
>>
>> On Wednesday, 22 May 2019 23:44:12 UTC+9:30, JJ wrote:
>>>
>>> Hi Patrick,
>>> I've adjusted the z values and it helps. Do you have any idea about how 
>>> to adjust the padding of the viewbox?
>>> John
>>>
>>> On Wednesday, May 22, 2019 at 9:17:19 AM UTC+2, Patrick wrote:
>>>>
>>>> Hi,
>>>>
>>>> Yeah, I'm not sure if the z-orders are set correctly for everything. 
>>>> You'd think the background should be drawn behind the grid... Try 
>>>> something 
>>>> like:
>>>>  [ plotItem.getAxis(ax).setZValue(10) for ax in plotItem.axes ]
>>>> I think the grid lines are then over the top of the plot lines, you may 
>>>> need to play with the "10" if that's a problem. (Note this is the answer 
>>>> to 
>>>> getting grid lines over the top of an imageItem as well...)
>>>>
>>>> Patrick
>>>>
>>>> On Wednesday, 22 May 2019 16:08:13 UTC+9:30, JJ wrote:
>>>>>
>>>>> Hi Patrick,
>>>>> Thanks, this appears to work. However, the grid lines disappear. Do 
>>>>> you have any idea on how to prevent the setting of the background color 
>>>>> from drawing over the grid lines?
>>>>>
>>>>>
>>>>> On Wednesday, May 22, 2019 at 8:16:38 AM UTC+2, Patrick wrote:
>>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> I think you want the setBackgroundColor method from ViewBox. So get 
>>>>>> the ViewBox associated with your PlotItem like:
>>>>>> plotItem.getViewBox().setBackgroundColor((192, 192, 192))
>>>>>>
>>>>>> Patrick
>>>>>>
>>>>>> On Wednesday, 22 May 2019 04:25:44 UTC+9:30, JJ wrote:
>>>>>>>
>>>>>>> By default the plot background color is black. However, this color 
>>>>>>> extends into the area of the axis and padding between the plot area and 
>>>>>>> window edges.
>>>>>>> What I would like to do is change the color and padding of the plot 
>>>>>>> frame area while leaving the plot area itself black or grey. How is 
>>>>>>> this 
>>>>>>> possible?
>>>>>>>
>>>>>>> A good example can be seen here: 
>>>>>>> https://bokeh.pydata.org/en/latest/docs/gallery/ridgeplot.html
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"pyqtgraph" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/pyqtgraph/469b3702-80be-4baf-a9b7-96497e7be0f0%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to