viernes, 30 de agosto de 2019

Cómo añadir un diagrama (histograma) a una capa vectorial con PyQGIS 3

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: