PyQt4中繪製柱狀圖、餅圖、燃盡圖

繪製柱狀圖

'''重寫繪圖類方法'''
def paintEvent(self,event):
    qp = QtGui.QPainter()
    qp.begin(self)
    self.drawChart(qp)

'''繪製座標軸'''
def drawChart(self,qp):
    size = self.size()
    height = size.height()
    width = size.width()
    '''
    繪製軸
    '''
    self.pointOrigin = QtCore.QPoint(50,height-50) #原點
    self.pointX = QtCore.QPoint(width-20,height-50) 
    self.pointY = QtCore.QPoint(50,20)
    points = [self.pointY,self.pointOrigin,self.pointX]
    qp.drawPolyline(points)
    '''
    繪製箭頭
    '''
    pointXUp = QtCore.QPoint(width-30,height-60)
    pointXDown = QtCore.QPoint(width-30,height-40)
    points2 = [pointXUp,self.pointX,pointXDown]
    qp.drawPolyline(points2)
    pointYLeft = QtCore.QPoint(40,30)
    pointYRight = QtCore.QPoint(60,30)
    points3 = [pointYLeft,self.pointY,pointYRight]
    qp.drawPolyline(points3)

    font = QtGui.QFont()
    font.setPointSize(10)
    qp.setFont(font)
    qp.drawText(0,50,'Y')
    qp.drawText(width-60,height-30,'X')

    '''
    根據橫座標長度及柱子個數劃分每個柱圖的寬度,10爲柱間隙
    '''
    pillarDic = {'apple':4,'orange':23,'banana':22,'cherry':13,'strawbarry':7} #存放展示的數據
    pillarNum = pillarDic.__len__() #柱子個數
    self.widthPer = ((pointXDown.x()-self.pointOrigin.x())*1.0-5)/pillarNum-10
    '''首先找出數據中的最大值'''
    max = 0
    for key in pillarDic :
        if pillarDic[key]>=max:
            max = self.statusDict[key]
    num=0 #柱子編號
    for key in pillarDic:
        num+=1
        count = pillarDic[key]
        self.drawPillar(qp,num,count,max,QtGui.QColor('#cccc00'),key) #隨機給顏色

'''定義繪製柱形圖的公用方法'''
# num--柱子編號,
# count--數據值,
# max--最大數據
# color--柱子顏色
# name--標註
def drawPillar(self,qp,num,count,max,color,name):
    qp.setBrush(color)
    y = self.pointOrigin.y()-80
    '''
    根據最大值按比例繪製柱子高度
    '''
    qp.drawRect(self.pointOrigin.x()+num*10+self.widthPer*(num-1),self.pointOrigin.y()
                -count*1.0*y/max,self.widthPer,count*1.0*y/max)
    '''繪製標註'''
    qp.drawText(self.pointOrigin.x()+num*10+self.widthPer*(num-1)+self.widthPer*45/100,self.pointOrigin.y()-count*1.0*y/max-5,u'%d'%count)
    qp.drawText(self.pointOrigin.x()+num*10+self.widthPer*(num-1)+self.widthPer*45/100,self.size().height()-20,u'%s'%name)

繪製餅圖

'''
寫死的餅狀圖,待優化
'''
cakeDic = {'apple':4,'orange':23,'banana':22} #展示數據
cakeSum = 0 #數據總量
for key in cakeDic:
    cakeSum += cakeDic[key]
d = width/2-100 #大餅直徑
if d>=height-50: #防止餅圖超過widget高度
    d = height-50
'''根據數據佔比繪製餅圖'''
gray = QtGui.QColor(25,148,117)
qp.setBrush(gray)
qp.drawPie(30,40,d,d,0,360*16*1.0*cakeDic[apple]/cakeSum )
cyan = QtGui.QColor(199,206,178)
qp.setBrush(cyan)
qp.drawPie(30,40,d,d,360*16*1.0*cakeDic[apple]/cakeSum ,360*16*1.0*cakeDic[orange]/cakeSum )
orange = QtGui.QColor(224,128,49)
qp.setBrush(orange)
qp.drawPie(30,40,d,d,360*16-360*16*1.0*cakeDic[banana]/cakeSum ,360*16*1.0*cakeDic[banana]/cakeSum )
'''
繪製顏色標註
'''
font = QtGui.QFont()
font.setPointSize(9)
qp.setFont(font)
qp.drawText(d+50,d-40,u'%s %d'%(cakeDic,cakeDic ))
qp.fillRect(d+30,d-50,15,15,gray)
qp.drawText(d+50,d-10,u'%s %d'%(cakeDic ,cakeDic ))
qp.fillRect(d+30,d-20,15,15,cyan)
qp.drawText(d+50,d+20,u'%s %d'%(cakeDic ,cakeDic ))
qp.fillRect(d+30,d+10,15,15,orange)

繪製燃盡圖

未完待續…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章