QGIS API: ダイアグラム

ダイアグラムをAPI側から操作する方法は以下のリンクにほぼ集約されていると思います。

http://gis.stackexchange.com/questions/37547/how-to-use-the-qgsdiagramrendererv2

パイチャートの場合

以下の例はパイチャートを表示するものです。
チャートの配色にはQgsVectorRandomColorRampV2クラスを使用して自動的に割り当てています。

  layer = self.canvas.currentLayer()

  # パイチャート
  diagram = QgsPieDiagram()
  ramp = QgsVectorRandomColorRampV2.create()
  ds = QgsDiagramSettings()

  # 色と属性をリストに登録
  # この例ではループにしているが、上のリンクでは辞書を使用している
  colors = []
  attrs = []
  for i in range(16, 20):
      colors.append( ramp.color(float(19-i)/4) )
      attrs.append( i )

  # 色と属性リストをセット
  ds.categoryColors = colors
  ds.categoryIndices = attrs
  ds.size = QSizeF( 10.0, 10.0 )
  
  # 縮尺に関係なく固定サイズにする場合
  ds.sizeType = QgsDiagramSettings.MM
  
  # 背景色を透明
  ds.backgroundColor = QColor(255,255,255,0)
  
  # 枠線の色
  ds.PenColor = QColor("black")

  # 固定サイズダイアグラムの場合
  dr = QgsSingleCategoryDiagramRenderer()
  
  # ダイアグラムの種類と設定をセット
  dr.setDiagram( diagram )
  dr.setDiagramSettings( ds )
  
  # レイヤーにダイアグラムレンダラをセット  
  layer.setDiagramRenderer( dr )

  # ダイアグラムレイヤー設定をセット  
  dls = QgsDiagramLayerSettings()
  
  # 要素に対するダイアグラムの位置を指定  
  dls.placement = QgsDiagramLayerSettings.AroundPoint
  
  layer.setDiagramLayerSettings( dls )

  self.canvas.refresh()

上記の例では描画される円の大きさは全て同じですが、何らかの属性値を大きさに反映させたい場合は
QgsLinearlyInterpolatedDiagramRendererクラスを使用します。

バーチャートの場合

バーチャートの場合は必ずQgsLinearlyInterpolatedDiagramRendererクラスを使用します。
このクラスでは値の最大値を設定したりすることができます。

  layer = self.canvas.currentLayer()

  # バーチャート
  diagram = QgsHistogramDiagram()
  ramp = QgsVectorRandomColorRampV2.create()
  ds = QgsDiagramSettings()

  colors = []
  attrs = []
  for i in range(16, 20):
    colors.append( ramp.color(float(19-i)/4) )
    attrs.append( i )

  ds.categoryColors = colors
  ds.categoryIndices = attrs
  # バーの幅を設定
  ds.barWidth = 2.0
  ds.sizeType = QgsDiagramSettings.MM
  ds.backgroundColor = QColor(255,255,255,0)
  ds.PenColor = QColor("black")

  # バーチャートの場合は必ずこのクラスを使用
  dr = QgsLinearlyInterpolatedDiagramRenderer()
  
  # サイズの基準とする属性を設定
  dr.setClassificationAttribute( 4 )
  
  # その属性の最大値を設定
  dr.setUpperValue( 2.0 )
  
  # 最大値に対応する大きさ
  dr.setUpperSize( QSizeF(1.0, 1.0) )

  dr.setDiagram( diagram )
  dr.setDiagramSettings( ds )
  layer.setDiagramRenderer( dr )

  dls = QgsDiagramLayerSettings()
  dls.placement = QgsDiagramLayerSettings.AroundPoint
  layer.setDiagramLayerSettings( dls )

  self.canvas.refresh()

テキストチャート

テキストチャートとは、下図のような図を描画するものです。

テキストダイアグラム

このチャートを使用する場合は背景を設定しないと黒丸になってしまいます。

  diagram = QgsTextDiagram()
  ramp = QgsVectorRandomColorRampV2.create()
  ds = QgsDiagramSettings()

  colors = []
  attrs = []
  for i in range(16, 20):
    colors.append( ramp.color(float(19-i)/4) )
    attrs.append( i )

  # テキストチャートの場合は文字の色になる
  ds.categoryColors = colors
  ds.categoryIndices = attrs
  ds.sizeType = QgsDiagramSettings.MM
  
  # 背景色を設定
  ds.backgroundColor = QColor(150,150,255,255)
  
  # 枠線の色、線幅
  ds.PenColor = QColor("black")
  ds.PenWidth = 0.1

  # フォントを指定
  ds.font = QFont("Times", 10, QFont.Bold)
        
  dr = QgsLinearlyInterpolatedDiagramRenderer()

  # チャート円の大きさを設定
  # 使用するフィールドとその最小値、最大値と、それらに対応するサイズを指定する
  dr.setClassificationAttribute( 3 )
  dr.setLowerValue( 0.0 )
  dr.setUpperValue( 8.0 )
  dr.setLowerSize( QSizeF(10.0, 10.0) )
  dr.setUpperSize( QSizeF(20.0, 20.0) )
  
  dr.setDiagram( diagram )
  dr.setDiagramSettings( ds )
  layer.setDiagramRenderer( dr )

  dls = QgsDiagramLayerSettings()
  dls.placement = QgsDiagramLayerSettings.AroundPoint
  layer.setDiagramLayerSettings( dls )

  self.canvas.refresh()

QgsDialogLayerSettingsクラスについて

上記の3つの例では、このクラスは dls.placement = QgsDiagramLayerSettings.AroundPoint でしか使っていませんでした。
このクラスではダイアグラムの表示位置等を指定することができます。
位置の指定は、点の側(上記の例)や、点の上、横などと指定できるほか、位置を定義してあるフィールドを指定することもできます。

詳細はQgsDialogLayerSettingsクラスを参照してください。

アーカイブ