-
Notifications
You must be signed in to change notification settings - Fork 0
/
Funcion_grafPie.py
154 lines (114 loc) · 5.77 KB
/
Funcion_grafPie.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# modulos de PySide2
from PySide2.QtCharts import QtCharts
from PySide2.QtGui import QPainter, QColor, QFont
from PySide2.QtCore import Qt
# random para ejemplos
from random import randint
class Clase_GraficoPie():
def __init__(self, parentgrid, theme=1):
'''parentgrid: grid para ubicar el grafico | teme 1: predeterminado, teme 2: personalizado'''
# 0. DATOS A REGISTRAR *-*-*-*-*-*-*-*-*-*-*
dato_titulo = "Ejemplo"
dato_nombres = ["Uno", "Dos", "Tres", "Cuatro"]
dato_colores = ["#e3722d", "#f0b904", "#6caa3f", "#42A5F8"]
dato_datos = [
# ---"Uno" ------ "Dos" --------- "Tres" --------- "Cuatro" ---
randint(80,800), randint(80,800), randint(80,800), randint(80,800)
]
# 1. PIESLICE *-*-*-*-*-*-*-*-*-*-*
listapieslice = self.creador_pieslice(valores = dato_datos, colores = dato_colores)
# 2. PIESERIES *-*-*-*-*-*-*-*-*-*-*
pieSeries = self.creador_pieseries(lista_pieslice = listapieslice, marcaindice=[1])
# 3. PIESLICE LABELS *-*-*-*-*-*-*-*-*-*-*
self.creador_pieslicelabels(
lista_pieslice = listapieslice,
valores = dato_datos,
nombres = dato_nombres,
decimales = 1)
# 4. CHART *-*-*-*-*-*-*-*-*-*-*
chart = self.creador_chart(pieseries = pieSeries, titulo = dato_titulo, theme=theme)
# 5. CHARTVIEW *-*-*-*-*-*-*-*-*-*-*
chartView = QtCharts.QChartView(chart)
chartView.setRenderHint(QPainter.Antialiasing)
if(theme==1):
# TEMA PREDETERMINADO *-*-*-*-*-*-*-*-*-*-*
# temas disponibles /-/-/-/
'ChartThemeLight | ChartThemeBlueCerulean | ChartThemeDark | ChartThemeBrownSand'
'ChartThemeBlueNcs | ChartThemeHighContrast | ChartThemeBlueIcy | ChartThemeQt'
chart.setTheme(QtCharts.QChart.ChartThemeDark)
else:
# TEMA PERSONALIZADO *-*-*-*-*-*-*-*-*-*-*
# definir color de letras /-/-/-/
chartView.chart().setTitleBrush(QColor("white")) # titulo
chartView.chart().legend().setLabelColor(QColor("white")) # etiquetas
# personalizacion de fondo /-/-/-/
chartView.chart().setBackgroundVisible(False) # quitar color
chartView.setBackgroundBrush(QColor("#141f24")) # asignar color
# 6. CONFIGURACIONES *-*-*-*-*-*-*-*-*-*-*
# leyenda /-/-/-/
'MarkerShapeDefault | MarkerShapeRectangle | MarkerShapeCircle | MarkerShapeFromSeries'
chartView.chart().legend().setMarkerShape(QtCharts.QLegend.MarkerShapeCircle)
# tamaño de letra /-/-/-/
chartView.chart().setTitleFont(self.font_size(25)) # tamaño de titulo
chartView.chart().legend().setFont(self.font_size(12))
# fondo /-/-/-/
chartView.chart().layout().setContentsMargins(0, 0, 0, 0) # quitar margenes
chartView.chart().setBackgroundRoundness(0) # quitar bordes
# font sub titulos /-/-/-/
for sli in pieSeries.slices():
sli.setLabelFont(self.font_size(14))
# 7. RESTABLECER WIDGETS *-*-*-*-*-*-*-*-*-*-*
'limpiar todos los elementos del widget'
for i in reversed(range(parentgrid.count())):
parentgrid.itemAt(i).widget().deleteLater()
# 8. INSERTAR GRAFICO *-*-*-*-*-*-*-*-*-*-*
parentgrid.addWidget(chartView, 0, 0)
def font_size(self, size):
"""cambiar tamaño de letra"""
font = QFont()
font.setPointSize(size)
return font
# 1. PIESLICE +-+-+
def creador_pieslice(self, valores, colores):
'''theme 1: predeterminado, theme 2: personalizado'''
lista_pieslice = [] # almacena QPieSlice
for dato,color in zip(valores, colores):
pieSlice = QtCharts.QPieSlice()
pieSlice.setValue(dato) # dato
pieSlice.setColor(color) # color leyenda
pieSlice.setLabelColor("white") # color valor
# ubicacion de la señalizacion /-/-/-/
'LabelOutside | LabelInsideHorizontal | LabelInsideTangential | LabelInsideNormal'
pieSlice.setLabelPosition(QtCharts.QPieSlice.LabelOutside)
lista_pieslice.append(pieSlice)
return lista_pieslice
# 2. PIESERIES +-+-+
def creador_pieseries(self, lista_pieslice,marcaindice=[]):
pieSeries = QtCharts.QPieSeries()
for indice, sli in enumerate(lista_pieslice):
if(indice in marcaindice):
sli.setExploded(True)# resalta por indice
pieSeries.append(sli)
pieSeries.setHoleSize(0.0) # agujero tamaño
pieSeries.setPieSize(0.6) # pie tamaño
pieSeries.setLabelsVisible(True)
return pieSeries
# 3. PIESLICE LABELS +-+-+
def creador_pieslicelabels(self, lista_pieslice, valores, nombres, decimales=2):
"""titulo a mostrar (con valor y porcentaje)"""
for sli,valor,nombre in zip(lista_pieslice, valores, nombres):
sli.setLabel(f"{nombre}: {valor} ({round(sli.percentage()*100,decimales)}%)")
# 4. CHART +-+-+
def creador_chart(self, pieseries, titulo, theme):
'''theme 1: predeterminado, theme 2: personalizado'''
chart = QtCharts.QChart()
chart.setTitle(titulo)
chart.addSeries(pieseries)
chart.legend().setVisible(True)
# Alieamiento de las etiquetas /-/-/-/
'AlignTop | AlignBottom | AlignLeft | AlignRight'
chart.legend().setAlignment(Qt.AlignTop)
# animaciones /-/-/-/
'NoAnimation | SeriesAnimations | AllAnimations | GridAxisAnimations'
chart.setAnimationOptions(QtCharts.QChart.SeriesAnimations)
return chart