繪製柱狀圖
'''重寫繪圖類方法'''
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)
繪製燃盡圖
未完待續…