2014-02-21 2 views
2

Попытка создать форму круговой диаграммы, но по какой-то причине я не могу заставить ее правильно объединиться. Когда я запускаю свой код, он создает много сегментов поверх друг друга. Вот мой код:Как создать круговую диаграмму с pyqt в python

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import sys, random 


app = QApplication(sys.argv) 
scene = QGraphicsScene() 
families = [1,2,3,4,5,6,7] 
total = 0 
colours = [] 
set_angle = 0 
count1 = 0 
total = sum(families) 
for count in range(len(families)): 
    number = [] 
    for count in range(3): 
     number.append(random.randrange(0, 255)) 
    colours.append(QColor(number[0],number[1],number[2])) 


for family in families:  
    angle = round(family/total*16*360) 
    ellipse = QGraphicsEllipseItem(0,0,400,400) 
    ellipse.setPos(0,0) 
    ellipse.setStartAngle(set_angle) 
    ellipse.setSpanAngle(angle) 
    ellipse.setBrush(colours[count1]) 
    set_angle = angle 
    count1 +=1 
    scene.addItem(ellipse) 
view = QGraphicsView(scene) 
view.show() 
app.exec_() 

ответ

1

Проблема связана с integer division, проверить эту строку: angle = round(family/total*16*360), она может быть исправлена ​​установка total = float(sum(families)) или положить эту линию from __future__ import division в начале кода, оба решения действительны.

0

, как xndrme сказал, что нужно

from __future__ import division 

Ваших сегментов, однако, будет по-прежнему находиться на вершине друг друг, потому что все они имеют один и тот же начальный угол.

set_angle = angle 

должен быть

set_angle = angle + angle 
2

Копает эту тему, как это могло бы помочь другим. @ Ответ Барри почти прав, но нуждается в нескольких корректировках.

Действительно, чтобы иметь идеальную круглую форму для вашего эллипса, вам необходимо изменить строку:

set_angle = angle 

к

set_angle += angle 

Таким образом, set_angle (который является отправным углом наши «куски пирога») всегда являются последним углом, нарисованным на холсте.

Кроме того, линия:

angle = round(family/total*16*360) 

может быть написано, как это (ради читаемость в):

angle = round(float(family*(16*360))/total) 

Так рабочий пример будет (с использованием Python3 & PyQt5):

from PyQt5.QtWidgets import QGraphicsScene, QApplication, QGraphicsView, QGraphicsEllipseItem 
from PyQt5.Qt import QColor 
import sys, random 


app = QApplication(sys.argv) 
scene = QGraphicsScene() 

families = [1,2,3,4,5,6,7,8,9,10] 
total = 0 
set_angle = 0 
count1 = 0 
colours = [] 
total = sum(families) 

for count in range(len(families)): 
    number = [] 
    for count in range(3): 
     number.append(random.randrange(0, 255)) 
    colours.append(QColor(number[0],number[1],number[2])) 

for family in families: 
    # Max span is 5760, so we have to calculate corresponding span angle 
    angle = round(float(family*5760)/total) 
    ellipse = QGraphicsEllipseItem(0,0,400,400) 
    ellipse.setPos(0,0) 
    ellipse.setStartAngle(set_angle) 
    ellipse.setSpanAngle(angle) 
    ellipse.setBrush(colours[count1]) 
    set_angle += angle 
    count1 += 1 
    scene.addItem(ellipse) 

view = QGraphicsView(scene) 
view.show() 
app.exec_() 

Надеюсь, это поможет.

Смежные вопросы