QtChart
2022/9/19原创大约 2 分钟约 650 字
安装环境
pip install PyQtChart
实例
# -*- coding: UTF-8 -*-
# -*- coding: UTF-8 -*-
import sys
import numpy as np
import pandas as pd
from PyQt5.QtCore import Qt, QPointF
from PyQt5.QtGui import QPainter, QLinearGradient, QColor, QGradient, QFont, QBrush, QPen
from PyQt5.QtWidgets import QApplication, QMainWindow, QStyle
from PyQt5.QtChart import (QChart, QChartView, QBarSeries, QBarSet, QBarCategoryAxis, QValueAxis)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(800, 600)
# 随机找出 4 笔 7 天的温度变化
df = pd.DataFrame(np.random.randint(20, high=35, size=(7, 4)), columns=list('abcd'), index=list('1234567'))
print(df)
# 画出4 周的温度变化折线图
cols = list(df.columns)
# valuesArray = list(df.values)
series = QBarSeries()
for i in range(len(cols)):
setTemp = QBarSet(cols[i])
setTemp.append(list(df.iloc[:, i]))
series.append(setTemp)
chart = QChart()
chart.addSeries(series)
font = QFont()
font.setPixelSize(18)
chart.setTitleFont(font)
chart.setTitleBrush(QBrush(Qt.black))
chart.setTitle("Weather (day of the week)")
bkGradient = QLinearGradient()
bkGradient.setStart(QPointF(0, 0))
bkGradient.setFinalStop(QPointF(0, 1))
bkGradient.setColorAt(0.0, QColor(0xd2d0d1))
bkGradient.setColorAt(1.0, QColor('orangered'))
bkGradient.setCoordinateMode(QGradient.ObjectBoundingMode)
chart.setBackgroundBrush(bkGradient)
chart.setAnimationOptions(QChart.SeriesAnimations)
daysofweek = [f"day of week-{i}" for i in range(7)]
axisY = QValueAxis()
axisY.applyNiceNumbers()
chart.addAxis(axisY, Qt.AlignLeft)
series.attachAxis(axisY)
self.axis_x = QBarCategoryAxis()
self.axis_x.append(daysofweek)
chart.addAxis(self.axis_x, Qt.AlignBottom)
series.attachAxis(self.axis_x)
chart.legend().setVisible(True)
chart.legend().setAlignment(Qt.AlignBottom)
chartView = QChartView(chart)
chartView.setRenderHint(QPainter.Antialiasing)
self.setCentralWidget(chartView)
series.doubleClicked.connect(self.bar_double_clicked)
def bar_double_clicked(self, index, barset):
print(barset.label(), barset.at(index), self.axis_x.categories()[index])
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
图表美化
import sys
from PyQt5.QtCore import Qt,QPointF
from PyQt5.QtGui import (QPainter, QPen, QColor, QFont, QBrush,
QLinearGradient, QGradient)
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtChart import QChart, QChartView, QLineSeries, QCategoryAxis
class DemoCustomChart(QMainWindow):
def __init__(self, parent=None):
super(DemoCustomChart, self).__init__(parent)
# 设置窗口标题
self.setWindowTitle('实战 Qt for Python: 定制图表演示')
# 设置窗口大小
self.resize(480, 360)
self.createChart()
def createChart(self):
#设置饼图数据
lineSeries = QLineSeries()
lineSeries << QPointF(0, 6) << QPointF(9, 4) << QPointF(15, 20) << QPointF(25, 12) << QPointF(29, 26)
#创建图表
chart = QChart()
chart.legend().hide()
chart.addSeries(lineSeries)
#=== 图表外观部分===#
#设置画笔,改变线的颜色和线宽
pen = QPen(QColor(0xfdb157))
pen.setWidth(5)
lineSeries.setPen(pen)
#定制图表标题
font = QFont()
font.setPixelSize(18)
chart.setTitleFont(font)
chart.setTitleBrush(QBrush(Qt.white))
chart.setTitle('定制图表示例')
#定制图表背景
bkGradient = QLinearGradient()
bkGradient.setStart(QPointF(0, 0))
bkGradient.setFinalStop(QPointF(0, 1))
bkGradient.setColorAt(0.0, QColor(0xd2d0d1))
bkGradient.setColorAt(1.0, QColor(0x4c4547))
bkGradient.setCoordinateMode(QGradient.ObjectBoundingMode)
chart.setBackgroundBrush(bkGradient)
#定制图表绘图区域的背景
plotAreaGradient = QLinearGradient()
plotAreaGradient.setStart(QPointF(0, 1))
plotAreaGradient.setFinalStop(QPointF(1, 0))
plotAreaGradient.setColorAt(0.0, QColor(0x555555))
plotAreaGradient.setColorAt(1.0, QColor(0x55aa55))
plotAreaGradient.setCoordinateMode(QGradient.ObjectBoundingMode)
chart.setPlotAreaBackgroundBrush(plotAreaGradient)
chart.setPlotAreaBackgroundVisible(True)
#=== 坐标轴部分 ===#
axisX = QCategoryAxis()
axisY = QCategoryAxis()
#定制坐标标签字体
labelsFont = QFont()
labelsFont.setPixelSize(12)
axisX.setLabelsFont(labelsFont)
axisY.setLabelsFont(labelsFont)
#定制坐标轴的颜色
axisPen = QPen(QColor(0xd18952))
axisPen.setWidth(2)
axisX.setLinePen(axisPen)
axisY.setLinePen(axisPen)
#定制坐标标签文字的颜色
axisBrush = QBrush(Qt.white)
axisX.setLabelsBrush(axisBrush)
axisY.setLabelsBrush(axisBrush)
#定制网格线和它的阴影
axisX.setGridLineVisible(False)
axisY.setGridLineVisible(False)
axisY.setShadesPen(QPen(Qt.NoPen))
axisY.setShadesBrush(QBrush(QColor(0x99, 0xcc, 0xcc, 0x55)))
axisY.setShadesVisible(True)
#为坐标轴设置刻度并添加到图表中
axisX.append('低', 10)
axisX.append('最理想', 20)
axisX.append('高', 30)
axisY.append('慢速', 10)
axisY.append('中速', 20)
axisY.append('快速', 30)
chart.addAxis(axisX, Qt.AlignBottom)
chart.addAxis(axisY, Qt.AlignLeft)
lineSeries.attachAxis(axisX)
lineSeries.attachAxis(axisY)
#图表视图
chartView = QChartView(chart)
chartView.setRenderHint(QPainter.Antialiasing)
self.setCentralWidget(chartView)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = DemoCustomChart()
window.show()
sys.exit(app.exec())