Investigando algunos aspectos relacionados con la generación de histogramas de capas ráster me encontré este post de gis.stackexchange.com donde refiere la manera de generar un histograma en capas vectoriales. Después de adaptarlo a PyQGIS 3 y eliminar todas las líneas que permiten trabajar sólo con los valores por defecto obtuve el código siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | layer = iface.activeLayer() # Set histogram and diagram settings: hist = QgsHistogramDiagram() ds = QgsDiagramSettings() dColors = {'a1': QColor("cyan"), 'a2': QColor("red")} ds.categoryColors = dColors.values() ds.categoryAttributes = dColors.keys() ds.categoryLabels = ds.categoryAttributes # Set renderer: renderer = QgsLinearlyInterpolatedDiagramRenderer() renderer.setUpperValue(1) # Here you should set the maximum value of both attributes renderer.setUpperSize(QSizeF(10, 10)) renderer.setDiagram(hist) renderer.setDiagramSettings(ds) # Set diagram layer settings: layer.setDiagramRenderer(renderer) dls = QgsDiagramLayerSettings() layer.setDiagramLayerSettings(dls) layer.triggerRepaint() |
La ejecución del código anterior, con un vectorial tipo polígono al cual le añadí los campos a1 y a2 con valores escogidos arbitrariamente, produce el resultado de la imagen siguiente:
Después de comprobar la sintaxis de ejecución de algunos métodos de las clases QgsDiagramSettings y QgsDiagramLayerSettings produje el código siguiente:
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 | layer = iface.activeLayer() # Set histogram and diagram settings: hist = QgsHistogramDiagram() ds = QgsDiagramSettings() dColors = {'a1': QColor("cyan"), 'a2': QColor("red")} ds.categoryColors = dColors.values() ds.categoryAttributes = dColors.keys() ds.categoryLabels = ds.categoryAttributes ds.diagramOrientation = ds.Right #default is Up ds.penColor = QColor("blue") #default is black ds.penWidth = 1 #default is 0 ds.barWidth = 8 #default is 5 # Set renderer: renderer = QgsLinearlyInterpolatedDiagramRenderer() renderer.setUpperValue(1) # Here you should set the maximum value of both attributes renderer.setUpperSize(QSizeF(10, 10)) renderer.setLowerValue(0) renderer.setLowerSize(QSizeF(0, 0)) renderer.setDiagram(hist) renderer.setDiagramSettings(ds) # Set diagram layer settings: layer.setDiagramRenderer(renderer) dls = QgsDiagramLayerSettings() dls.setPlacement(5) #default is zero dls.setDistance(20) #default is zero layer.setDiagramLayerSettings(dls) layer.triggerRepaint() |
La ejecución de este nuevo código produce ahora el resultado a continuación:
No hay comentarios:
Publicar un comentario