PyQtGraphでグラフを描写する その6 - 凡例の表示

# その6 凡例の表示

PyQtGraphの凡例は融通が利かないのであまり好きではありません。
~~背景色など変更できなかったはずです。~~
↑コメントでご指摘頂きました。ライブラリー(pyqtgraph\graphicsItems\LegendItem.py)を修正することで背景色の変更自体は可能とのことです。詳細はコメント欄をご参照ください。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/55744/6daaab6a-54b5-2d6f-6a85-631a919ac782.png)

```py3
import sys
from PySide.QtCore import *
from PySide.QtGui import *
import pyqtgraph as pg


class GraphWindow(QMainWindow):

    def __init__(self, parent = None):
        
        super(GraphWindow, self).__init__(parent)
        
        pw = pg.PlotWidget(viewBox = pg.ViewBox(border = pg.mkPen(color='#000000'),
                                                invertX = False, invertY = False))

        self.setCentralWidget(pw)

        pw.setBackground("#FFFFFF00")

        pw.setMinimumSize(500, 400)
        pw.setMaximumSize(500, 400)

        p1 = pw.plotItem
        p2 = pg.ViewBox()
        p3 = pg.ViewBox()
        ax3 = pg.AxisItem(orientation = 'right')
        self.setGraphFrameFont(p1, p2, p3, ax3)
        self.setGraphMultipleAxis(p1, p2, p3, ax3)

        p1.setLabels(bottom = "X Axis（えっくす軸）", 
                     left = "Y1 Axis（わい1軸）", 
                     right = "Y2 Axis（わい2軸）")
        ax3.setLabel("Y3 Axis（わい3軸）")

        fontCss = {'font-family': "Times New Roman, メイリオ", 'font-size': '10.5pt', "color": "black"}
        p1.getAxis('bottom').setLabel(**fontCss)
        fontCss["color"] = "red"
        p1.getAxis('left').setLabel(**fontCss)
        fontCss["color"] = "blue"
        p1.getAxis('right').setLabel(**fontCss)
        fontCss["color"] = "green"
        ax3.setLabel(**fontCss)

        p1.setRange(xRange = (-2, 6), yRange = (-2, 6), padding = 0)
        p2.setRange(yRange = (-1, 5), padding = 0)
        p3.setRange(yRange = (0, 4), padding = 0)

        p1.getAxis('bottom').setTickSpacing(major = 2.5, minor = 1)
        p1.getAxis('left').setTickSpacing(major = 2.5, minor = 1)
        p1.getAxis('right').setTickSpacing(major = 2.5, minor = 1)
        ax3.setTickSpacing(major = 2.5, minor = 1)
        
        p1.addItem(pg.PlotCurveItem(x = [0, 1, 2, 3 ,4], 
                                    y = [0, 1, 2, 3 ,4], 
                                    pen = pg.mkPen(color = "r", style = Qt.SolidLine), 
                                    name = "plot1", 
                                    antialias = True))
        p2.addItem(pg.ScatterPlotItem(x = [0, 1, 2, 3 ,4], 
                                      y = [4, 3, 2, 1, 0], 
                                      symbol = "x", 
                                      pen = pg.mkPen(None), 
                                      name = "plot2", 
                                      brush = pg.mkBrush("b"),
                                      size = 7.5,
                                      antialias = True))
        p3.addItem(pg.PlotCurveItem(x = [0, 1, 2, 3 ,4], 
                                    y = [0, 4, 0, 4, 0], 
                                    pen = pg.mkPen(color = "g", style = Qt.DashLine),
                                    name = "plot3", 
                                    antialias = True))

        ## 6 凡例を設定、表示する
        legend = p1.addLegend(offset = (10, 10))
        fontCssLegend = '<style type="text/css"> p {font-family: Times New Roman, メイリオ; font-size: 10.5pt; color: "#000000"} </style>'
        legend.addItem(pg.PlotCurveItem(pen = pg.mkPen(color = "r", style = Qt.SolidLine), antialias = True), 
                       name = fontCssLegend + '<p>plot1（ぷろっと1）</p>')
        legend.addItem(pg.ScatterPlotItem(symbol = "x", pen = pg.mkPen(None), brush = pg.mkBrush("b"), size = 7.5, antialias = True), 
                       name = fontCssLegend + '<p>plot2（ぷろっと2）</p>')
        legend.addItem(pg.PlotCurveItem(pen = pg.mkPen(color = "g", style = Qt.DashLine), antialias = True), 
                       name = fontCssLegend + '<p>plot3（ぷろっと3）</p>')


    def setGraphFrameFont(self, p1, p2 = None, p3 = None, ax3 = None):
        font = QFont("Times New Roman", 7)

        p1.getAxis('bottom').setPen(pg.mkPen(color='#000000'))
        p1.getAxis('left').setPen(pg.mkPen(color='#000000'))
        p1.getAxis('bottom').setHeight(3.5 * 10.5)
        p1.getAxis('left').setWidth(4 * 10.5)

        #p1.getAxis('bottom').setLabel(**self.fontCss)
        p1.getAxis('bottom').tickFont = font
        #p1.getAxis('left').setLabel(**self.fontCss)
        p1.getAxis('left').tickFont = font

        if p2 != None:
            p1.getAxis('right').setPen(pg.mkPen(color='#000000'))
            p1.getAxis('right').setWidth(4 * 10.5)

            #p1.getAxis('right').setLabel(**self.fontCss)
            p1.getAxis('right').tickFont = font

        if p3 != None and ax3 != None:
            ax3.setPen(pg.mkPen(color='#000000'))
            ax3.setWidth(4 * 10.5)

            #ax3.setLabel(**self.fontCss)
            ax3.tickFont = font


    def setGraphMultipleAxis(self, p1, p2, p3 = None, ax3 = None):
        p1.showAxis('right')
        p1.scene().addItem(p2)
        p1.getAxis('right').linkToView(p2)
        p2.setXLink(p1)

        p2.sigRangeChanged.connect(lambda: p2.setGeometry(p1.vb.sceneBoundingRect()))
        
        if p3 != None and ax3 != None:
            spacer = QGraphicsWidget()
            spacer.setMaximumSize(15,15)
            p1.layout.addItem(spacer, 2, 3)

            p1.layout.addItem(ax3, 2, 4)
            p1.scene().addItem(p3)
            ax3.linkToView(p3)
            p3.setXLink(p1)
            
            p3.sigRangeChanged.connect(lambda: p3.setGeometry(p1.vb.sceneBoundingRect()))


if __name__ == '__main__':
    # Qt Applicationを作ります
    app = QApplication(sys.argv)
    # formを作成して表示します
    mainWin = GraphWindow()
    mainWin.show()
    # Qtのメインループを開始します
    sys.exit(app.exec_())
```