图例与图例上的标志
图例QLegend
如图图例 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的应用实例
下面的代码生成折线图和条形图,对图表中的图例进行设置。程序运行结果如图所示。
# -*- 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())