当前位置:   article > 正文

实战PyQt5:149-QChart图表之图例设置_pyqt qchart

pyqt qchart

默认情况下,图例(legend)在与图表相同的视图内绘制图例。在某些情况下,用户可能希望将图例绘制到其他位置。为此,可以将图例从图表中分离出来(这意味着图表不会绘制图例或尝试更改其布局)。然后可以在用户希望的任何地方(例如,在不同的图形场景中)绘制分离的图例。在QChart中,图例由类QLegend来实现。

QLegend

QLegend类显示图表的图例。QLegend是显示图表图例的图形对象。当图形序列发生更改时,图例状态由QChart更新。默认情况下,图例附加在图表上,但是可以将其分离以使其独立于图表布局。图例对象无法创建或删除,但可以通过QChart类进行引用。

QLegend常用函数:

  • setAlignment(self, alignment):设置图例与图表的对齐方式, alignment可以是Qt.AlignTop,Qt.AlignBottom,Qt.AlignLeft,Qt.AlignRight四种方式。
  • setBackgroundVisible(self, true):设置图例背景是否可见。
  • setBorderColor(self, color):设置图例的边框线条颜色。
  • setBrush(self, brush):设置图例背景所用的画刷。
  • setColor(self, color):设置图例背景画刷的颜色。
  • setFont(self, font):设置图例标签文本所使用的字体。
  • setLabelBrush(self, brush):设置绘制图例标签文本的画刷。
  • setLabelColor(self, color):设置绘制图例标签文本的画笔颜色。
  • setMarkerShape(self, shape):设置图例标记形状,默认值为QLegend. MarkerShapeRectangle。
  • setPen(self, pen):设置用于绘制图例边框的画笔。
  • setReverseMarkers(self, reverseMarkers):设置否对图例中的标记使用反向顺序。
  • setShowToolTips(self, show):设置是否显示图例的工具提示信息。

QLegend常用信号:

  • backgroundVisibleChanged(self, visible):当图例背景的可见性更改为visible时,将发出此信号。
  • borderColorChanged(self, color):当图例背景的边框颜色变为color时,发出此信号。
  • colorChanged(self, color):当图例背景的颜色变为color时,发出此信号。
  • fontChanged(self, font):图例标记的字体更改为font时,将发出此信号。
  • labelColorChanged(self, color):用于绘制图例标签刷的颜色改变color时,将发出该信号。
  • markerShapeChanged(self, shape): 当图例的标记形状发生改变时,将发射该信号。
  • reverseMarkersChanged(self, reverseMarkers):当图例中标记的反向顺序更改为reverseMarkers时,将发出此信号。
  • showToolTipsChanged(sefl, showToolTips):当工具提示的可见属性更改为showToolTips时,将发出此信号。

图例演示

在示例中,我们使用柱形图来演示图例的各种设置效果,在其中添加或删除柱形条。图例反映了图形序列的变化。可以将图例分离或附加回图表,并且可以修改其对齐方式,可以修改图例的标记文字等。断开图例后,可以自由调整其大小和位置。完整代码如下:

  1. import sys
  2. from PyQt5.QtCore import Qt, QRectF
  3. from PyQt5.QtGui import QPainter, QColor, QPen, QBrush
  4. from PyQt5.QtWidgets import (QApplicationQWidgetQPushButtonQDoubleSpinBox,
  5.                              QGridLayoutQFormLayoutQGroupBox)
  6. from PyQt5.QtChart import QChart, QChartView, QBarSeries, QBarSet
  7.  
  8. class DemoLegendWidget(QWidget):
  9.     def __init__(selfparent=None):
  10.         super(DemoLegendWidgetself).__init__(parent)   
  11.         
  12.          # 设置窗口标题
  13.         self.setWindowTitle('实战 Qt for PythonQChart图例演示')      
  14.         # 设置窗口大小
  15.         self.resize(720, 480)
  16.       
  17.         self.initUi()
  18.         
  19.     def initUi(self):
  20.         buttonLayout = QGridLayout()
  21.         
  22.         #图例与图表连接和分离的切换按钮
  23.         btnDetachLegend = QPushButton('分离连接切换')
  24.         btnDetachLegend.clicked.connect(self.toggleAttached)
  25.         buttonLayout.addWidget(btnDetachLegend, 0, 0)
  26.         
  27.         #添加和删除按钮
  28.         btnAddSet = QPushButton('添加柱状条')
  29.         btnAddSet.clicked.connect(self.addBarSet)
  30.         buttonLayout.addWidget(btnAddSet, 2, 0)
  31.         btnRemoveSet = QPushButton('移除柱状条')
  32.         btnRemoveSet.clicked.connect(self.removeBarset)
  33.         buttonLayout.addWidget(btnRemoveSet, 3, 0)
  34.         
  35.         #对齐按钮
  36.         btnAlign = QPushButton('对齐(底端)')
  37.         btnAlign.clicked.connect(self.setLegendAlignment)
  38.         buttonLayout.addWidget(btnAlign, 4, 0)
  39.         
  40.         #字体加黑
  41.         btnBold = QPushButton('加黑字体')
  42.         btnBold.clicked.connect(self.toggleBold)
  43.         buttonLayout.addWidget(btnBold, 8, 0)
  44.         
  45.         #字体变斜
  46.         btnItalic = QPushButton('斜体')
  47.         btnItalic.clicked.connect(self.toggleItalic)
  48.         buttonLayout.addWidget(btnItalic, 9, 0)
  49.         
  50.         #图例的位置参数
  51.         self.legendPosX = QDoubleSpinBox()
  52.         self.legendPosY = QDoubleSpinBox()
  53.         self.legendWidth = QDoubleSpinBox()
  54.         self.legendHeight = QDoubleSpinBox()
  55.         self.legendPosX.valueChanged.connect(self.updateLegendLayout)
  56.         self.legendPosY.valueChanged.connect(self.updateLegendLayout)
  57.         self.legendWidth.valueChanged.connect(self.updateLegendLayout)
  58.         self.legendHeight.valueChanged.connect(self.updateLegendLayout)
  59.         
  60.         legendLayout = QFormLayout()
  61.         legendLayout.addRow('水平位置', self.legendPosX)
  62.         legendLayout.addRow('垂直位置', self.legendPosY)
  63.         legendLayout.addRow('宽度', self.legendWidth)
  64.         legendLayout.addRow('高度', self.legendHeight)
  65.         self.legendSettings = QGroupBox('分离图例')
  66.         self.legendSettings.setLayout(legendLayout)
  67.         buttonLayout.addWidget(self.legendSettings)
  68.         self.legendSettings.setVisible(False)
  69.         
  70.         #创建图表
  71.         self.chart = QChart()
  72.         self.chartView = QChartView(self.chartself)
  73.         
  74.         #生成修改字体的spinbox
  75.         self.fontSize = QDoubleSpinBox()
  76.         self.fontSize.setValue(self.chart.legend().font().pointSizeF())
  77.         self.fontSize.valueChanged.connect(self.fontSizeChanged)
  78.         
  79.         fontLayout = QFormLayout()
  80.         fontLayout.addRow('图例字体尺寸', self.fontSize)
  81.         
  82.         #主布局
  83.         mainLayout = QGridLayout()
  84.         mainLayout.addLayout(buttonLayout, 0, 0)
  85.         mainLayout.addLayout(fontLayout, 1, 0)
  86.         mainLayout.addWidget(self.chartView, 0, 1, 3, 1)
  87.         self.setLayout(mainLayout)
  88.         
  89.         self.createSeries()
  90.         
  91.     def createSeries(self):
  92.         self.series = QBarSeries()
  93.         self.addBarSet()
  94.         self.addBarSet()
  95.         self.addBarSet()
  96.         self.addBarSet()
  97.         
  98.         self.chart.addSeries(self.series)
  99.         self.chart.setTitle('图例分离样例')
  100.         self.chart.createDefaultAxes()
  101.         self.chart.legend().setVisible(True)
  102.         self.chart.legend().setAlignment(Qt.AlignBottom)
  103.         
  104.         self.chartView.setRenderHint(QPainter.Antialiasing)
  105.         
  106.     def showLegendSpinbox(self):
  107.         self.legendSettings.setVisible(True)
  108.         chartViewRect = self.chart.rect()
  109.         
  110.         self.legendPosX.setMinimum(0)
  111.         self.legendPosX.setMaximum(chartViewRect.width())
  112.         self.legendPosX.setValue(150)
  113.  
  114.         self.legendPosY.setMinimum(0)
  115.         self.legendPosY.setMaximum(chartViewRect.height())
  116.         self.legendPosY.setValue(150)
  117.  
  118.         self.legendWidth.setMinimum(0)
  119.         self.legendWidth.setMaximum(chartViewRect.width())
  120.         self.legendWidth.setValue(150)
  121.  
  122.         self.legendHeight.setMinimum(0)
  123.         self.legendHeight.setMaximum(chartViewRect.height())
  124.         self.legendHeight.setValue(75)
  125.        
  126.     def hideLegendSpinbox(self):
  127.         self.legendSettings.setVisible(False)
  128.         
  129.     def toggleAttached(self):
  130.         legend = self.chart.legend()
  131.         if legend.isAttachedToChart():
  132.             legend.detachFromChart()
  133.             legend.setBackgroundVisible(True)
  134.             legend.setBrush(QBrush(QColor(128, 128, 128, 128)))
  135.             legend.setPen(QPen(QColor(192, 192, 192, 192))) 
  136.             self.showLegendSpinbox()
  137.             self.updateLegendLayout()
  138.         else:
  139.             legend.attachToChart()
  140.             legend.setBackgroundVisible(False)
  141.             self.hideLegendSpinbox()
  142.         self.update()
  143.         
  144.     def addBarSet(self):
  145.         barSet = QBarSet('set' + str(self.series.count()))
  146.         delta = self.series.count() * 0.1
  147.         barSet << 1 + delta << 2 + delta << 3 + delta << 4 + delta
  148.         self.series.append(barSet)
  149.         
  150.     def removeBarset(self):
  151.         barSets = self.series.barSets()
  152.         if len(barSets) > 0 :
  153.             self.series.remove(barSets[-1])
  154.             
  155.     def setLegendAlignment(self):
  156.         button = self.sender()
  157.         align = self.chart.legend().alignment()
  158.         if align == Qt.AlignTop:
  159.             self.chart.legend().setAlignment(Qt.AlignLeft)
  160.             if not button is None:
  161.                 button.setText('对齐(左端)')
  162.         elif align == Qt.AlignLeft:
  163.             self.chart.legend().setAlignment(Qt.AlignBottom)
  164.             if not button is None:
  165.                 button.setText('对齐(底端)')
  166.         elif align == Qt.AlignBottom:
  167.             self.chart.legend().setAlignment(Qt.AlignRight)
  168.             if not button is None:
  169.                 button.setText('对齐(右端)')
  170.         else:
  171.             self.chart.legend().setAlignment(Qt.AlignTop)
  172.             if not button is None:
  173.                 button.setText('对齐(顶端)')
  174.     
  175.     def toggleBold(self):
  176.         font = self.chart.legend().font()
  177.         font.setBold(not font.bold())        
  178.         self.chart.legend().setFont(font)
  179.         
  180.     def toggleItalic(self):
  181.         font = self.chart.legend().font()
  182.         font.setItalic(not font.italic())        
  183.         self.chart.legend().setFont(font)
  184.         
  185.     def fontSizeChanged(self):
  186.         font = self.chart.legend().font()
  187.         font.setPointSizeF(self.fontSize.value())        
  188.         self.chart.legend().setFont(font)
  189.         
  190.     def updateLegendLayout(self):
  191.         self.chart.legend().setGeometry(QRectF(self.legendPosX.value(),
  192.                                                self.legendPosY.value(),
  193.                                                self.legendWidth.value(),
  194.                                                self.legendHeight.value()))
  195.         self.chart.legend().update()
  196.     
  197. if __name__ == '__main__':
  198.     app = QApplication(sys.argv)
  199.     window = DemoLegendWidget()
  200.     window.show()
  201.     sys.exit(app.exec())   

运行效果如下图:

 QChart图例设置

本文知识点

  • QLegend类显示图表的图例。
  • QLegend图例对象无法创建或删除,但可以通过QChart类进行引用。
  • 对QLegend的各种属性进行交互控制。

前一篇:实战PyQt5: 148-QChart图表之定制图表外观

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/132509
推荐阅读
相关标签
  

闽ICP备14008679号