128-绘制二维图表-图例与图例上的标志

文章详细介绍了Qt图表库中的QLegend类,包括设置图例的位置、颜色、形状以及交互模式。QLegend提供了设置图例标志的方法,如设置标志形状、颜色和与图表的交互。此外,还提到了QLegendMarker类,用于获取和设置数据序列在图例上的标志,包括形状、颜色和各种信号。示例代码展示了如何在图表中创建并定制图例和标志,包括条形图和折线图的图例设置。
摘要由CSDN通过智能技术生成

图例与图例上的标志

图例QLegend

examples_percentbarchart_legend.png

如图图例 QLegend用于定义图表中图例的位置颜色可见性和序列的标志形状等。

图例QLegend继承自 QGraphicsWidget,用图表 QChart 的 legend()方法获取图表上的图例对象;然后用图例 QLegend 提供的方法对图例进行设置。不能单独创建图例对象

图例QLegend的方法

图例QLegend 的常用方法如表所示,主要方法介绍如下

  • 用setAlignment(alignment;Qt.Alignment)方法可以设置图例在图表的位置,如参数取:

    • Qt.AlignTop 把图例放在图表的上位置。
    • Qt.AlignBottom 把图例放在图表的下位置。
    • Qt.AlignLeft 把图例放在图表的左位置。
    • Qt.AlignRight 把图例放在图表的右位置。
  • 用setMarkerShape(shape: QLegend.MarkerShape)方法设置数据序列标志的形状,参数可取:

    • QLegend.MarkerShapeDefault(使用默认形状)由 QLegend 确定的默认形状用于标记。此值仅支持单个 QLegendMarker 项。
    • QLegend.MarkerShapeRectangle 使用矩形标记。标记大小由字体大小决定。
    • QLegend.MarkerShapeCircle 使用圆形标记。标记大小由字体大小决定。
    • QLegend.MarkerShapeFromSeries(根据数据序列的类型确定形状)标记形状由序列确定。对于散点序列,图例标记看起来像散点,并且与点的大小相同。对于直线或样条线系列,图例标记看起来像直线的一小部分。对于其他系列类型,将显示矩形标记。如果为序列指定了 a,则将显示,其大小将由系列标记大小确定。lightMarkerlightMarker
    • QLegend.MarkerShapeRotatedRectangle 使用旋转的矩形标记。标记大小由字体大小决定。
    • QLegend.MarkerShapeTriangle 使用三角形标记。标记大小由字体大小决定。
    • QLegend.MarkerShapeStar 使用星形标记。标记大小由字体大小决定。
    • QLegend.MarkerShapePentagon 使用五边形标记。标记大小由字体大小决定。
    • 对应值分别是0~7当使用矩形或圆形时,矩形或圆形的尺寸由字体的尺寸决定;当选择数据序列的类型时,如果数据序列是折线或样条曲线,则形状是线段,如果是散列图,则形状是散列图上的点的形状,其他情况时形状是矩形。
  • 用setInteractive(interactive:bool)方法可以将图例设置成交互模式

    • 用detachFromChart()方法使图例与图表失去关联,则可以用鼠标移动图例和调整图例的尺寸。
  • 用markers(series;QAbstractSeries=None)方法可以获取图例上数据序列的标志对象列表,可以对每个标志对象进行更详细的设置

QLegend 的方法及参数类型说 明
setAlignment(alignment: Qt.Alignment)设置图例在QChart中的位置
setBackgroundVisible(visible:bool=True)设置图例的背景是否可见
setBorderColor(color:Union[QColor,Qt.GlobalColor,str])在背景可见时,设置边框的颜色
setBrush(brush: Union[QBrush,Qt.BrushStyle,Qt.GlobalColor,QColor,QGradient,QImage,QPixmap])设置画刷
setColor(color:Union[QColor,Qt.GlobalColor,str])设置填充色
setFont(font:Union[QFont,str,Sequence[str]])设置字体
setLabelBrush(brush: Union[QBrush,QColor,QGradient])设置标签画刷
setLabelColor(color: Union[QColor,Qt.GlobalColor,str])设置标签颜色
setMarkerShape(shape:QLegend. MarkerShape)设置数据序列标志的形状
markerShape()获取标志的形状 QLegend. MarkerShape
setPen(pen:Union[QPen,Qt.PenStyle,QColor])设置边框的钢笔
setReverseMarkers(reverseMarkers:bool=True)设置数据序列的标志是否反向
setToolTip(str)设置提示信息
setShowToolTips(show:bool)设置是否显示提示信息
detachFromChart()使图例与图表失去关联
attachToChart()使图例与图表建立关联
isAttachedToChart()获取图例
setInteractive(interactive: bool)设置图例是否是交互模式
markers(series:QAbstractSeries=None)获取图例中标志列表 list[QLegendMarker]
图例QLegend 的信号

图例QLegend的信号如表所示

QLegend的信号及参数类型说 .明
attachedToChartChanged(attached:bool)图例与图表的关联状态发生改变时发送信号
backgroundVisibleChanged(visible:bool)背景可见性发生改变时发送信号
borderColorChanged(color:QColor)背景颜色发生改变时发送信号
colorChanged(color:QColor)颜色发生改变时发送信号
fontChanged(font:QFont)字体发生改变时发送信号
labelColorChanged(color:QColor)标签颜色发生改变时发送信号
markerShapeChanged(QLegend.MarkerShape)标志形状发生改变时发送信号
reverseMarkersChanged(reverseMarkers:bool)标志反转状态发生改变时发送信号
showToolTipsChanged(showToolTips:bool)提示信息显示状态发生改变时发送信号

图例的标志QLegendMarker

用图例的 markers(series:QAbstractSeries=None)方法可以获取图例上的数据序列标志对象列表 list[QLegendMarker]可以对每个标志对象进行详细的设置。

QLegendMarker 继承自QObject,继承自 QLegendMarker 的类有

  • QXYLegendMarker
  • QAreaLegendMarker
  • QBarLegendMarker
  • QBoxPlotLegendMarker
  • QCandlestickLegendMarker
  • QPieLegendMarker

除 QBarLegendMarker和QPieLegendMarker 外,这些派生类没有自己特有的方法和信号,都是继承QLegendMarker 的方法和信号

图例标志 QLegendMarker 的方法

图例标志 QLegendMarker 的常用方法如所示,主要方法是

  • 用setShape(shape:QLegend.MarkerShape)方法设置形状;

  • 用type()方法获取标志类型返回值是QLegendMarker.LegendMarkerType 的枚举值,可取以下值,分别对应值0~5,根据类型可以给标志设置不同的形状

    标记说明
    QLegendMarker.LegendMarkerTypeArea区域系列的图例标记。
    QLegendMarker.LegendMarkerTypeBar条形图集的图例标记。
    QLegendMarker.LegendMarkerTypePie饼图扇区的图例标记。
    QLegendMarker.LegendMarkerTypeXY直线、样条或散点序列的图例标记。
    QLegendMarker.LegendMarkerTypeBoxPlot箱形图系列的图例标记。
    QLegendMarker.LegendMarkerTypeCandlestick烛台系列的图例标记。
QLegendMarker的方法及参数类型返回值的类型说明
brush()QBrush获取画刷
font()QFont获取字体
isVisible()bool获取是否可见
label()str获取标签
labelBrush()QBrush获取标签画刷
pen()QPen获取钢笔
series()QAbstractSeries获取关联的数据序列
setBrush(brush: Union[QBrush,QColor,QGradient,QPixmap])None设置画刷
setFont(font:Union[QFont,str])None设置字体
setLabel(label: str)None设置标签
setLabelBrush(brush:Union[QBrush,QColor,QGradient,QPixmap])None设置标签的画刷
setPen(pen: Union[QPen,QColor])None设置钢笔
setShape(shape: QLegend. MarkerShape)None设置形状
setVisible(visible:bool)None设置可见性
shape()QLegend. MarkerShape获取形状
type()QLegendMarker. LegendMarker1ype获取类型·
图例标志 QLegendMarker 的信号
信号说明
brushChanged()当图例标记的画笔发生变化时,会发出此信号。
clicked()单击图例标记时会发出此信号。
fontChanged()当图例标记的(标签)字体更改时,会发出此信号。
hovered(status)status – bool
当鼠标悬停在图例标记上时,会发出此信号。当鼠标在标记上移动时,状态变为真,当鼠标再次移开时,状态将变为假。
labelBrushChanged()当图例标记的标签画笔发生变化时,会发出此信号。
labelChanged()当图例标记的标签发生更改时,会发出此信号。
penChanged()当图例标记的笔发生变化时,会发出此信号。
shapeChanged()当图例标记的形状发生变化时,会发出此信号。
visibleChanged()当图例标记的可见性发生变化时,会发出此信号。

图例QLegend 和图例标志OLegendMarker的应用实例

下面的代码生成折线图和条形图,对图表中的图例进行设置。程序运行结果如图所示。

image-20230312203821921

# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/12 20:21
# File_name: 10-图例QLegend 和图例标志OLegendMarker的应用实例.py


import sys
from PySide6.QtWidgets import QApplication,QWidget,QVBoxLayout
from PySide6.QtCore import Qt.QPointF
from PySide6 import QtCharts


class MyWidget(QWidget):
    def __init__(self,parent=None):
        super().__init__(parent)

        self.resize(800,600)
        v = QVBoxLayout(self)
        self.chartView = QtCharts.QChartView(self)# 创建图表视图控件
        v.addWidget(self.chartView)
        self.chart = QtCharts.QChart()# 创建图表
        self.chartView.setChart(self.chart)# 将图表加入到图表视图控件中

        set1 = QtCharts.QBarSet("一组销售额")# 创建数据项
        set1.append([12,34,23,45])# 添加数据
        set2 = QtCharts.QBarSet("二组销售额")# 创建数据项
        set2.append([24,33,42,41])# 添加数据

        self.barSeries = QtCharts.QBarSeries()# 创建数据序列
        self.barSeries.append([set1,set2])# 添加数据项
        self.lineSeries = QtCharts.QLineSeries()# 创建数据序列
        self.lineSeries.setName("去年季度总额")

        self.lineSeries.append([QPointF(0,32),QPointF(1,46),QPointF(2,43),QPointF(3,48)])

        self.chart.addSeries(self.barSeries)# 图表中添加数据序列
        self.chart.addSeries(self.lineSeries)# 图表中添加数据序列

        self.barCategoryAxis = QtCharts.QBarCategoryAxis()# 创建坐标轴
        self.chart.addAxis(self.barCategoryAxis,Qt.AlignmentFlag.AlignBottom)# 图表中添加坐标轴
        self.barCategoryAxis.append(["第一乘度""第二季度","第三季度","第四季度"])# 添加条目

        self.valueAxis = QtCharts.QValueAxis()
        self.valueAxis.setRange(0,50)
        self.chart.addAxis(self.valueAxis,Qt.AlignmentFlag.AlignLeft)

        self.barSeries.attachAxis(self.valueAxis)# 数据项与坐标轴关联
        self.barSeries.attachAxis(self.barCategoryAxis)# 数据项与坐标轴关联
        self.lineSeries.attachAxis(self.valueAxis)# 数据项与坐标轴关联
        self.lineSeries.attachAxis(self.barCategoryAxis)# 数据项与坐标轴关联

        # 以下是对图例的设置
        legend = self.chart.legend()
        legend.setAlignment(Qt.AlignBottom)
        legend.setBackgroundVisible(True)
        legend.setBorderColor(Qt.red)
        legend.setColor(Qt.yellow)
        pen = legend.pen()
        pen.setWidth(4)
        legend.setPen(pen)
        legend.setToolTip("销售团队的销售额对比")
        legend.setShowToolTips(True)
        legend.setMarkerShape(legend.MarkerShape.MarkerShapeFromSeries)
        for i in legend.markers():
            font = i.font()
            font.setPointSize(12)
            i.setFont(font)

            if i.type()== QtCharts.QLegendMarker.LegendMarkerType.LegendMarkerTypeBar:
                i.setShape(QtCharts.QLegend.MarkerShape.MarkerShapeRotatedRectangle)
            else:
                i.setShape(QtCharts.QLegend.MarkerShape.MarkerShapeFromSeries)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MyWidget()

    win.show()
    sys.exit(app.exec())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值