python-使用Qchart总结4-绘制多层柱状图
1、上代码
import sys from PyQt5.QtChart import QChart, QChartView, QBarCategoryAxis, QValueAxis, QBarSeries, QBarSet from PyQt5.QtGui import QPainter, QColor from PyQt5.QtWidgets import QMainWindow, QApplication from 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 sys from PyQt5.QtChart import QChart, QChartView, QBarCategoryAxis, QValueAxis, QBarSeries, QBarSet, QStackedBarSeries from PyQt5.QtGui import QPainter, QColor from PyQt5.QtWidgets import QMainWindow, QApplication from 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_())