python-使用Qchart总结4-绘制多层柱状图
1、上代码
import sysfrom PyQt5.QtChart import QChart, QChartView, QBarCategoryAxis, QValueAxis, QBarSeries, QBarSet from PyQt5.QtGui import QPainter, QColor from PyQt5.QtWidgets import QMainWindow, QApplicationfrom untitled import Ui_MainWindow #从生成好的py文件内导入设计好的UI类class Window(QMainWindow, Ui_MainWindow):#这个是将图表与UI图连接起来def __init__(self):super().__init__()self.setup_ui() # 渲染画布def setup_ui(self):self.setupUi(self)self.plot_qchart = User_QBarSeries() #将图表实例化self.graphicsView.setChart(self.plot_qchart)self.graphicsView.setRenderHint(QPainter.Antialiasing) # 抗锯齿self.graphicsView.setRubberBand(QChartView.RectangleRubberBand)class User_QBarSeries(QChart): #绘制柱状图def __init__(self, parent=None, ):super(User_QBarSeries, self).__init__(parent)self.window = parent #设置X轴self.axisX=QBarCategoryAxis() #设置x轴坐标,用来显示柱状图的类型 #给x轴添加轴上的点self.axisX.append("用户1")self.axisX.append("用户2")self.axisX.append("用户3")self.axisX.setLabelsColor(QColor(0, 200, 0))#设置X轴坐标的颜色,就是上面用户1、用户2、用户3的颜色 # 设置Y轴self.axisY=QValueAxis()#设置Y轴坐标,显示值类型的Y轴self.axisY.setRange(0,10)#设置Y轴的范围self.axisY.setTitleText("单位:克")#设置Y轴的名字self.axisY.setLabelFormat("%.2f")#设置Y轴上的点的显示格式self.QBarSeries = QBarSeries() #用来装很多柱状图的对象self.bar0 = QBarSet("苹果")#1种系列的柱状图self.bar0.setColor(QColor(200,20,150))#设置柱体的颜色self.bar0.setLabelColor(QColor(200,200,150))#设置柱体上面显示的数值的颜色self.bar0.append(3.23) #注意,上面有3个用户,对应的传3个值self.bar0.append(2.123)self.bar0.append(6.5)self.QBarSeries.append(self.bar0)#将self.bar0这个柱体添加到柱状图的对象(self.QBarSeries)上self.QBarSeries.setVisible(True)#将柱状图显示出来self.QBarSeries.setLabelsVisible(True)#将柱体对应的Y值也显示出来self.addSeries(self.QBarSeries)#将整个柱状图放到坐标图里面self.setAxisX(self.axisX, self.QBarSeries)#将整个柱状图的坐标与坐标轴对应self.setAxisY(self.axisY, self.QBarSeries)if __name__ == "__main__":app = QApplication(sys.argv)mywindow = Window()mywindow.show()sys.exit(app.exec_())
2.执行效果
3.画第二组柱状图,图中红框的代码复制,重命名self.bar0变量,更改柱体的名字,传入的值即可
上第二组柱体的代码
self.bar1 = QBarSet("香蕉") # 1种系列的柱状图 self.bar1.setColor(QColor(130, 120, 50)) # 设置柱体的颜色 self.bar1.setLabelColor(QColor(15, 100, 200)) # 设置柱体上面显示的数值的颜色 self.bar1.append(5) # 注意,上面有3个用户,故意传2组值,看看效果 self.bar1.append(2.12) # self.bar1.append(6.5) self.QBarSeries.append(self.bar1) # 将self.bar0这个柱体添加到柱状图的对象(self.QBarSeries)上
4.执行效果
5.想在图中添加叠加的柱体,怎么添加呢?由于装叠加柱体的是
QStackedBarSeries() 所以我们可以在上面代码后面继续添加
6.上叠加柱体的代码
self.StackedbarSeries = QStackedBarSeries() #注意:叠加柱状图使用的是这个方法 与上面的QBarSeries不一样 self.bar2 = QBarSet("芒果核") # 叠加的第一种柱体叫芒果核 self.bar2.setColor(QColor(30, 120, 50)) # 设置柱体的颜色 self.bar2.setLabelColor(QColor(15, 100, 200)) # 设置柱体上面显示的数值的颜色 self.bar2.append(5) # 注意,上面有3个用户,传3个值 self.bar2.append(6.12) self.bar2.append(7.5)self.bar3 = QBarSet("芒果肉") # 叠加在芒果核上的柱体芒果肉 self.bar3.setColor(QColor(130, 20, 50)) # 设置柱体的颜色 self.bar3.setLabelColor(QColor(250, 200, 120)) # 设置柱体上面显示的数值的颜色 self.bar3.append(3) # 注意,上面有3个用户,传3个值 self.bar3.append(2) self.bar3.append(2.1)self.StackedbarSeries.append(self.bar2) #把2种柱体加入到叠加柱状图里 self.StackedbarSeries.append(self.bar3) self.StackedbarSeries.setVisible(True)#显示叠加柱状图 self.StackedbarSeries.setLabelsVisible(True)#显示叠加柱状图上的数值self.addSeries(self.StackedbarSeries)#把叠加柱状图加到坐标轴图上 self.setAxisX(self.axisX, self.StackedbarSeries)#把叠加柱状图的坐标值与坐标轴对应 self.setAxisY(self.axisY, self.StackedbarSeries)
7.执行效果,颜色有点糊,可以自行修改颜色的值
8.完整代码
import sysfrom PyQt5.QtChart import QChart, QChartView, QBarCategoryAxis, QValueAxis, QBarSeries, QBarSet, QStackedBarSeries from PyQt5.QtGui import QPainter, QColor from PyQt5.QtWidgets import QMainWindow, QApplicationfrom untitled import Ui_MainWindow #从生成好的py文件内导入设计好的UI类class Window(QMainWindow, Ui_MainWindow):#这个是将图表与UI图连接起来def __init__(self):super().__init__()self.setup_ui() # 渲染画布def setup_ui(self):self.setupUi(self)self.plot_qchart = User_QBarSeries() #将图表实例化self.graphicsView.setChart(self.plot_qchart)self.graphicsView.setRenderHint(QPainter.Antialiasing) # 抗锯齿self.graphicsView.setRubberBand(QChartView.RectangleRubberBand)class User_QBarSeries(QChart): #绘制柱状图def __init__(self, parent=None, ):super(User_QBarSeries, self).__init__(parent)self.window = parent #设置X轴self.axisX=QBarCategoryAxis() #设置x轴坐标,用来显示柱状图的类型 #给x轴添加轴上的点self.axisX.append("用户1")self.axisX.append("用户2")self.axisX.append("用户3")self.axisX.setLabelsColor(QColor(0, 200, 0))#设置X轴坐标的颜色,就是上面用户1、用户2、用户3的颜色 # 设置Y轴self.axisY=QValueAxis()#设置Y轴坐标,显示值类型的Y轴self.axisY.setRange(0,10)#设置Y轴的范围self.axisY.setTitleText("单位:克")#设置Y轴的名字self.axisY.setLabelFormat("%.2f")#设置Y轴上的点的显示格式self.QBarSeries = QBarSeries() #用来装很多柱状图的对象 #一组柱体self.bar0 = QBarSet("苹果")#1种系列的柱状图self.bar0.setColor(QColor(200,20,150))#设置柱体的颜色self.bar0.setLabelColor(QColor(200,200,150))#设置柱体上面显示的数值的颜色self.bar0.append(3.23) #注意,上面有3个用户,对应的传3个值self.bar0.append(2.123)self.bar0.append(6.5)self.QBarSeries.append(self.bar0)#将self.bar0这个柱体添加到柱状图的对象(self.QBarSeries)上self.bar1 = QBarSet("香蕉") # 1种系列的柱状图self.bar1.setColor(QColor(130, 120, 50)) # 设置柱体的颜色self.bar1.setLabelColor(QColor(15, 100, 200)) # 设置柱体上面显示的数值的颜色self.bar1.append(5) # 注意,上面有3个用户,故意传2组值,看看效果self.bar1.append(2.12)# self.bar1.append(6.5)self.QBarSeries.append(self.bar1) # 将self.bar0这个柱体添加到柱状图的对象(self.QBarSeries)上self.QBarSeries.setVisible(True)#将柱状图显示出来self.QBarSeries.setLabelsVisible(True)#将柱体对应的Y值也显示出来self.addSeries(self.QBarSeries)#将整个柱状图放到坐标图里面self.setAxisX(self.axisX, self.QBarSeries)#将整个柱状图的坐标与坐标轴对应self.setAxisY(self.axisY, self.QBarSeries)self.StackedbarSeries = QStackedBarSeries() #注意:叠加柱状图使用的是这个方法 与上面的QBarSeries不一样self.bar2 = QBarSet("芒果核") # 叠加的第一种柱体叫芒果核self.bar2.setColor(QColor(30, 120, 50)) # 设置柱体的颜色self.bar2.setLabelColor(QColor(15, 100, 200)) # 设置柱体上面显示的数值的颜色self.bar2.append(5) # 注意,上面有3个用户,传3个值self.bar2.append(6.12)self.bar2.append(7.5)self.bar3 = QBarSet("芒果肉") # 叠加在芒果核上的柱体芒果肉self.bar3.setColor(QColor(130, 20, 50)) # 设置柱体的颜色self.bar3.setLabelColor(QColor(250, 200, 120)) # 设置柱体上面显示的数值的颜色self.bar3.append(3) # 注意,上面有3个用户,传3个值self.bar3.append(2)self.bar3.append(2.1)self.StackedbarSeries.append(self.bar2) #把2种柱体加入到叠加柱状图里self.StackedbarSeries.append(self.bar3)self.StackedbarSeries.setVisible(True)#显示叠加柱状图self.StackedbarSeries.setLabelsVisible(True)#显示叠加柱状图上的数值self.addSeries(self.StackedbarSeries)#把叠加柱状图加到坐标轴图上self.setAxisX(self.axisX, self.StackedbarSeries)#把叠加柱状图的坐标值与坐标轴对应self.setAxisY(self.axisY, self.StackedbarSeries)if __name__ == "__main__":app = QApplication(sys.argv)mywindow = Window()mywindow.show()sys.exit(app.exec_())