JFreeChart-積上げバーチャート-特定データの強調-続き


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java

package jp.avaj.lib.chart;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.data.category.DefaultCategoryDataset;

import jp.avaj.lib.algo.ArUtil;

/**
■ JFreeChart-積上げバーチャート-特定データの強調-続き

・積上げバーチャートは、合計の変化はよく見ることができる.
・しかし一番下のデータ以外は変化が分かりにくい.これを他のデータの変化も見えるようにしたい.
・Chart08_02では、表示の順番を入れ替える案を提示したが、やり方がえげつなく(私は)不満である.
・本サンプルでは、積上げバーチャートの上に、折れ線グラフを表示することにした.こちらの方がベター.

・本サンプルでは商品Cを取り出した.
・折れ線グラフの商品Cの色が元の色と違っている.
  ・同じ色にすることもできるが、しかし元のバーの商品Cの部分と重なった場合は区別できないので良しとする.
    ・注、この例では重ならない.
・下の凡例の部分に商品Cが二重表示されている⇒ちょっと感じが悪いが、何を強調表示しているか分かるので許す.

 */
public class Chart08_03 {
  // 目次-積上げバーチャート(StackedBarChart)
  A_Chart08 a_Chart08;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  public static void main(String[] args) {
    // 表示データの作成
    DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
    {
      //
      dataSet.addValue(136.5,"商品A","2014");
      dataSet.addValue(206.1,"商品A","2015");
      dataSet.addValue(296.7,"商品A","2016");
      //
      dataSet.addValue( 40.5,"商品B","2014");
      dataSet.addValue(105.7,"商品B","2015");
      dataSet.addValue(199.4,"商品B","2016");
      //
      dataSet.addValue(150.5,"商品C","2014");
      dataSet.addValue(87.5,"商品C","2015");
      dataSet.addValue(40.0,"商品C","2016");
    }
    //
    CategoryAxis catAxis = new CategoryAxis();
    NumberAxis numAxis = new NumberAxis();
    // 積上棒グラフにはStackedBarRendererを使用する
    StackedBarRenderer renderer = new StackedBarRenderer();
    CategoryPlot catPlot = new CategoryPlot(dataSet,catAxis,numAxis,(CategoryItemRenderer)renderer); // (1)
    JFreeChart jfreeChart = new JFreeChart("売上構成の変化",(Plot)catPlot);
    //
    ChartFrame cFrame = new ChartFrame("売上構成の変化",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);

    // 特定商品(商品C)の売り上げを抽出⇒折れ線グラフを追加する
    {
      // 目で確認するために少し休む
      ArUtil.sleep(1000);
      // 特定商品の売り上げを元のdataSetから抽出する
      int row = dataSet.getRowIndex("商品C");
      DefaultCategoryDataset oneItem = new DefaultCategoryDataset();
      int colCount = dataSet.getColumnCount();
      for (int col=0; col<colCount; col++) {
        oneItem.addValue(dataSet.getValue(row,col),dataSet.getRowKey(row),dataSet.getColumnKey(col));
      }
      // 特定商品用の軸を生成⇒上下限を元の軸と一致させる＆軸を表示しない
      final NumberAxis axis1 = new NumberAxis("");
      catPlot.setRangeAxis(1,axis1);
      catPlot.setDataset(1,oneItem);
      axis1.setRange(numAxis.getRange()); // 上下限を一致させる
      axis1.setVisible(false); // 軸を表示しないようにする
      // 特定商品のグラフを追加する⇒折れ線グラフ
      final LineAndShapeRenderer renderer1 = new LineAndShapeRenderer();
      catPlot.setRenderer(1,renderer1);
      catPlot.mapDatasetToRangeAxis(1,1);
      catPlot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
    }
  }
}


```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/2cff5009-9e73-abcf-ffcc-4520291a6e25.png)