PyQt5中建立柱状图并刷新柱状图数据
使用Qt Designer工具搭建界面时,在适当位置预留一个verticalLayout垂直布局控件,用于放置代码生成的上下两个柱状图。新建柱状图的代码如下:
class mainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super(mainWindow, self).__init__()
self.setupUi(self) # 初始化窗口
self.tabWidget.setCurrentIndex(0) # 界面显示第一个tab
# 新建柱状图
self.chartView_1 = self.gen_chart()
self.verticalLayout.addWidget(self.chartView_1)
self.chartView_2 = self.gen_chart()
self.verticalLayout.addWidget(self.chartView_2)
self.setLayout(self.verticalLayout)
def gen_chart(self):
# 新建柱状图
chart = QChart()
barSeries = QBarSeries() # 竖向柱状图
chartView = QChartView()
valueAxisY = QValueAxis()
barCategorAxisX = QBarCategoryAxis()
chart.setAnimationOptions(QChart.AllAnimations)
chart.setAnimationEasingCurve(QEasingCurve.OutBack)
set0 = QBarSet("第一季度")
set1 = QBarSet("第二季度")
set2 = QBarSet("第三季度")
set0.append(0)
set1.append(0)
set2.append(0)
barCategorAxisX.append(["第一季度", "第二季度", "第三季度"])
barSeries.append(set0)
barSeries.append(set1)
barSeries.append(set2)
barSeries.setBarWidth(0.8)
barSeries.setLabelsVisible(True)
barSeries.setLabelsAngle(75.0)
barSeries.setLabelsPrecision(3)
valueAxisY.setRange(0, 10)
chart.setTitle("季度报表数据")
chart.setAxisX(barCategorAxisX)
chart.setAxisY(valueAxisY)
chart.addSeries(barSeries)
chartView.setChart(chart)
return chartView
上位机界面计算过程中实时更新计算结果到柱状图,柱状图数据更新的代码如下,函数update_bar_chart()的输入参数chart_index用于区分在verticalLayout垂直布局控件中是第几个添加到布局的柱状图控件:
# 更新柱状图的数据
verticalLayout_name = self.verticalLayout
new_data = [('第一季度', float(self.output_dict["第一季度"][index].text())),
('第二季度', data_dict["第二季度"]),
('第三季度', data_dict["第三季度"])]
self.update_bar_chart(new_data, 0, verticalLayout_name)
def update_bar_chart(self, new_data: list, chart_index: int, verticalLayout_name):
try:
# 获取verticalLayout中的图表
chart = verticalLayout_name.itemAt(chart_index).widget().chart()
# 清除旧数据
chart.removeAllSeries()
# 添加新数据
barSeries = QBarSeries() # 竖向柱状图
valueAxisY = QValueAxis()
barCategorAxisX = QBarCategoryAxis()
value_list = []
for add_list in new_data:
set0 = QBarSet(add_list[0])
set0.append(add_list[1])
barSeries.append(set0)
value_list.append(add_list[1])
barSeries.setBarWidth(0.8)
barSeries.setLabelsVisible(True)
barSeries.setLabelsAngle(75.0)
barSeries.setLabelsPrecision(3)
valueAxisY.setRange(min(value_list), max(value_list))
valueAxisY.setLabelFormat('%.2f') # %.2f设置了Y轴刻度标签的格式为保留两位小数
chart.setTitle("季度报表数据")
chart.setAxisX(barCategorAxisX)
chart.setAxisY(valueAxisY)
chart.addSeries(barSeries)
chart.setAnimationOptions(QChart.AllAnimations)
chart.setAnimationEasingCurve(QEasingCurve.OutBack)
except:
logger.error("更新柱状图报错 {}".format(traceback.format_exc()))