
餅圖是數據可視圖表的基本類型,在QChart中,QPieSeries, QPieSlice處理餅圖的繪制。
QPieSeries
QPieSeries類以餅圖形式顯示數據。餅圖系列由定義為QPieSlice對象的切片組成。切片可以具有任何值,因為QPieSeries對象計算切片的百分比與系列中所有切片的總和之比,以確定圖表中切片的實際大小。餅圖的大小和在圖表上的位置是通過使用0.0到1.0范圍內的相對值來控制的,這些與實際的圖表矩形有關。默認情況下,該餅被定義為完整餅。通過設置系列的起始角度和角度跨度可以創建局部餅圖。完整的餅圖是360度,其中12點是0。
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
QPieSlice類表示一個餅圖系列中的單個切片。餅圖切片具有一個值和一個標簽。將切片添加到餅圖時,QPieSeries對象將計算該切片與該系列中所有切片的總和相比較的百分比,以確定圖表中切片的實際大小。默認情況下,標簽是隱藏的。如果可見,則可以將其放置在切片的外部,并用手臂將其連接,也可以將其水平或平行于切片弧的切線或法線居中放置在切片內部。默認情況下,切片的視覺外觀是由主題設置的,但是可以通過指定切片屬性來覆蓋主題。為了使用戶能夠與餅圖進行交互,當用戶單擊餅圖或將鼠標懸停在餅圖上時,會發出一些基本信號。
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):當切片值改變時,該信號被發射。
餅圖演示
代碼演示了一個簡單的餅圖顯示效果,完整代碼如下:
import?sysfrom?PyQt5.QtGui?import?QPainter,?QPenfrom?PyQt5.QtCore?import?Qtfrom?PyQt5.QtWidgets?import?QApplication,?QMainWindowfrom??PyQt5.QtChart?import?QChart,?QChartView,?QPieSeries,?QPieSlice?class?DemoChartPieSeries(QMainWindow):????def?__init__(self,?parent=None):????????super(DemoChartPieSeries,?self).__init__(parent)????????????????????#?設置窗口標題????????self.setWindowTitle('實戰?Qt?for?Python:?QChart餅圖演示')??????????????#?設置窗口大小????????self.resize(480,?360)?????????????? self.createChart()????????????def?createChart(self):??????????????#設置餅圖數據????????pieSeries?=?QPieSeries()????????pieSeries.append('Jane',?1)????????pieSeries.append('Joe',?2)????????pieSeries.append('Andy',?3)????????pieSeries.append('Barbara',?4)????????pieSeries.append('Axel',?5)????????????????#處理索引號為1的片????????pieSlice?=?pieSeries.slices()[1]????????pieSlice.setExploded()????????pieSlice.setLabelVisible()?#設置標簽可見,缺省不可見????????pieSlice.setPen(QPen(Qt.darkGreen,?2))????????pieSlice.setBrush(Qt.green)????????????????#創建圖表????????chart?=?QChart()????????chart.addSeries(pieSeries)????????chart.setTitle('簡單的餅圖示例')????????chart.legend().hide()????????????????#圖表視圖????????chartView?=?QChartView(chart)????????chartView.setRenderHint(QPainter.Antialiasing)????????????????self.setCentralWidget(chartView)??????????????if?__name__?==?'__main__':????app?=?QApplication(sys.argv)????window?=?DemoChartPieSeries()????window.show()????sys.exit(app.exec())???
運行運行結果如下:

QChart餅圖演示
甜甜圈圖示例
使用一個去掉中心部分形成一個圈狀餅圖,演示一個甜甜圈的物質成分,完整代碼如下:
import?sysfrom?PyQt5.QtCore?import?Qtfrom?PyQt5.QtGui?import?QPainter,?QFontfrom?PyQt5.QtWidgets?import?QApplication,?QMainWindowfrom??PyQt5.QtChart?import?QChart,?QChartView,?QPieSeries,?QPieSlice?class?DemoChartDonut(QMainWindow):????def?__init__(self,?parent=None):????????super(DemoChartDonut,?self).__init__(parent)????????????????????#?設置窗口標題????????self.setWindowTitle('實戰?Qt?for?Python:?QChart甜甜圈圖演示')??????????????#?設置窗口大小????????self.resize(480,?360)?????????????? self.createChart()????????????def?createChart(self):??? ???????????#設置餅圖數據????????pieSeries?=?QPieSeries()????????pieSeries.setHoleSize(0.35)????????pieSeries.append('蛋白質?4.2%',?4.2)????????pieSlice?=?pieSeries.append('脂肪?15.6%',?15.6)????????pieSlice.setExploded()????????pieSlice.setLabelVisible()?#設置標簽可見,缺省不可見????????pieSeries.append('其他?23.8%',?23.8)????????pieSeries.append('碳水化合物?56.4%',?56.4)????????????????#圖表視圖????????chartView?=?QChartView()????????chartView.setRenderHint(QPainter.Antialiasing)????????chartView.chart().setTitle('檸檬汁甜甜圈(100克)')????????chartView.chart().addSeries(pieSeries)????????chartView.chart().legend().setAlignment(Qt.AlignBottom)????????chartView.chart().setTheme(QChart.ChartThemeBlueCerulean)????????chartView.chart().legend().setFont(QFont('Arial',?8))?#圖例字體????????????????self.setCentralWidget(chartView)??????????????if?__name__?==?'__main__':????app?=?QApplication(sys.argv)????window?=?DemoChartDonut()????window.show()????sys.exit(app.exec())???
運行結果如下圖:

甜甜圈的物質成分示意
本文知識點
- 餅圖控制類QPieSeries。
- 餅圖切片類QPieSlice。
- 繪制一個中空的餅圖。
- 設置餅圖的背景主題。
- 設置餅圖的圖例。
前一篇: 實戰PyQt5: 134-數據可視化之QChart繪制折線圖