在PyQt5中,我们可以使用QChart模块来创建各种类型的图表,包括饼图。饼图是一种常用的数据可视化方式,用于展示不同类别在整体中的比例关系。
安装相关的库:
不包含在PyQt5里面,需要另外安装
pip install PyQtChart -i https://mirrors.aliyun.com/pypi/simple/
QPieSeries常用函数:
方法 | 说明 |
---|---|
append(self, slice) | 添加一个切片slice到饼图中 |
append(label, value) | 将指定label和value的切片添加到饼图中,如果添加成功则返回切片对象,否则返回空值。 |
clear(self) | 清除饼图中的所有切片。 |
count(self) | 获得切片数目 |
setHoleSize(self) | 设置饼图孔洞尺寸,该值相对于图表矩形。0.0是最小大小(绘制完整的饼图,不带孔)。1.0是可以容纳图表的最大尺寸(甜甜圈没有宽度)。默认值为0.0。设置此属性时,如有必要,将调整size属性,以确保孔大小不大于饼图大小。 |
setLabelsVisible(self, visible) | 将所有切片标签的可见性设置为*visible。**注意:*此功能仅影响序列中的当前切片。如果添加了新切片,则默认标签可见性为False。 |
setPieStartAngle(self, startAngle) | 设置饼图的开始角度为startAngle,完整的饼图是360度,其中12点是0度。默认值为360。 |
setPieEndAngle(self, endAngle) | 设置饼图结束角度为endAngle |
setPieSize(self, relativeSize) | 设置饼图的相对尺寸为relativeSize,该值相对于图表矩形, 0.0是最小尺寸(未绘制饼图),1.0是适合图表的最大尺寸。默认值为0.7。设置此属性时,如有必要,将调整holeSize属性,以确保孔大小不大于饼图大小。 |
sum(self) | 返回饼图中所有切片值的总和。 |
reomove(self, slice) | 从饼图中删除指定的切片slice。切片将被永久删除。 |
take(self, slice) | 从饼图中获取由slice指定的单个切片。不删除切片对象。 |
QPieSeries常用信号:
信号 | 说明 |
---|---|
added(self, slices) | 当slices加入到饼图时信号被发射 |
clicked(self,slice) | 单击由slice指定的切片时,发射该信号 |
countChanged(self) | 当切片计数改变时,该信号被发射 |
doubleClicked(slef, slice) | 双击由slice指定的切片时,将发出此信号 |
hovered(self, slice, state) | 当鼠标悬停在slice指定的切片上时,将发出此信号。当鼠标移到切片上时,state变为True,而当鼠标再次移开时,state变为False。 |
pressed(self, slice) | 当用户单击由slice指定的切片并按住鼠标按钮时,将发出此信号。 |
released(self, slice) | 当用户释放对slice指定的切片的鼠标按下时,将发出此信号。 |
removed(self,slices) | 当从饼图中删除由片段指定的slices时,将发出此信号。 |
sumChanged() | 当所有切片的总和发生变化时,将发射该信号。 |
QPieSlice常用函数:
方法 | 说明 |
---|---|
setBorderColor(self,color) | 设置用于绘制切片边界的颜色。 |
setBorderWidth(self, width) | 设置切片边界的宽度 |
setBrush(self, brush) | 设置用于填充切片的画刷。 |
setColor(self, color) | 设置切片的填充(画刷)颜色 |
setExplodeDistanceFactor(self, factor) | 设置explode切片偏移饼的距离。1.0表示距离与半径相同。0.5表示该距离是半径的一半。默认距离为0.15。 |
setExploded(self, exploded) | 设置切片的explode属性。 |
setLabel(self, label) | 设置切片的标签。 |
setLabelArmLengthFactor(self, factor) | 设置切片标签臂的长度。该因数是相对于扇形半径的。1.0表示距离与半径相同。0.5表示该距离是半径的一半。默认距离为0.15。 |
setLabelBrush(self, brush) | 设置用于绘制切片的标签和标签臂的笔刷。 |
setLabelColor(self, color) | 设置用于绘制切片标签的颜色。 |
setLabelFont(self, font) | 设置用于绘制标签文本的字体。 |
setLabelPosition(self, position): | 设置切片标签的位置 |
setLabelVisible(self, visible) | 设置切片标签的是否可见。默认情况下,标签不可见。 |
setPen(self, pen) | 设置用于绘制切片边界的画笔。 |
setValue(self, value) | 设置切片与饼图中所有切片的总和相比的百分比。实际值范围是0.0到1.0。将切片添加到系列后,将自动更新 |
QPieSlice 常用信号:
信号 | 说明 |
---|---|
angleSpanChanged(self) | 当切片的角度跨度发生变化时,将发出此信号。 |
borderColorChanged(self) | 当切片边界颜色更改时,将发射此信号。 |
borderWidthChanged(self) | 当切片边界宽度改变时,该信号被发射。 |
brushChanged(self) | 当用于填充切片的笔刷更改时,将发出此信号。 |
clicked(self) | 单击切片时会发出此信号。 |
colorChanged(self) | 当切片颜色改变时,该信号被发射。 |
doubleClicked(self) | 用户双击切片时会发出此信号。 |
hovered(self,state) | 当鼠标悬停在切片上时,将发出此信号。当鼠标移到切片上时,state变为True,而当鼠标再次移开时,state变为False。 |
labelBrushChanged(self) | 切片的标签笔刷更改时,将发出此信号。 |
labelChanged(self) | 切片标签更改时将发出此信号。 |
labelColorChanged(self) | 切片标签颜色更改时,将发出此信号。 |
labelFontChanged(self) | 当切片的标签字体更改时,将发出此信号。 |
labelVisibleChanged(self) | 切片标签的可见性更改时,将发出此信号。 |
penChanged(self) | 当用于绘制切片边界的笔改变时,将发出此信号。 |
percentageChanged(self) | 当切片的百分比发生变化时,将发出此信号。 |
pressed(self) | 当用户单击切片并按住鼠标按钮时,将发出此信号。 |
released(self) | 当用户释放切片上的鼠标按键时,将发出此信号。 |
startAngleChanged(self) | 切片的起始角度发生变化时,将发出此信号。 |
valueChanged(self) | 当切片值改变时,该信号被发射。 |
例子:
# -*- coding:utf-8 -*-
import sys
from PyQt5.QtChart import QChart, QChartView, QPieSeries
from PyQt5.QtGui import QPainter, QColor
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QSizePolicy, QApplication
class ChartPieSeries(QWidget):
def __init__(self, parent=None):
super(ChartPieSeries, self).__init__(parent)
# 设置窗口标题
self.setWindowTitle('实战 Qt for Python: QChart饼图演示')
self.resize(200, 200)
layout = QHBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)
self.setLayout(layout)
# 设置饼图数据
series = QPieSeries()
series.setPieSize(1.0)
series.append("success", 79)
series.append("fail", 21)
# 设置笔刷
slice_succ = series.slices()[0]
slice_fail = series.slices()[1]
slice_succ.setBrush(QColor(0, 176, 80))
slice_fail.setBrush(QColor(192, 0, 0))
# 创建图表
chart = QChart()
chart.setContentsMargins(0, 0, 0, 0)
chart.addSeries(series)
chart.legend().hide()
chart.setBackgroundBrush(QColor(202, 222, 236))
# 图表视图
chartView = QChartView(chart)
chartView.setContentsMargins(0, 0, 0, 0)
chartView.setRenderHint(QPainter.Antialiasing)
chartView.setStyleSheet("background-color: rgb(202, 222, 236);")
chartView.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
layout.addWidget(chartView)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = ChartPieSeries()
w.resize(200, 200)
w.show()
sys.exit(app.exec_())
效果图: