JFreeChart-パレート図-DefaultCategoryDataset


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

```java
package jp.avaj.lib.chart;

import java.text.NumberFormat;
import java.util.List;

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.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.DefaultCategoryDataset;

/**
■ JFreeChart-パレート図-DefaultCategoryDataset
・パレート図はイタリアの経済学者ヴィルフレド・パレートが考案したもの.
・棒グラフとその累積グラフを重ねたもので、分かりやすく非常によく用いられる.
・パレート図のための特別なPlotがあるわけではなく、棒グラフの上に累積折れ線グラフを重ねることで実現する.

 */
public class Chart09_00 {
  // 目次-パレート図(ParetoChart)
  A_Chart09 a_Chart09;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  public static void main(String[] args) {
    // 売上棒グラフを作成する
    String rowKey = "売上";
    DefaultCategoryDataset salesDataset = new DefaultCategoryDataset();
    salesDataset.addValue(5000,rowKey,"商品A");
    salesDataset.addValue(3000,rowKey,"商品B");
    salesDataset.addValue(2000,rowKey,"商品C");
    salesDataset.addValue(1500,rowKey,"商品D");
    salesDataset.addValue(1300,rowKey,"商品E");
    salesDataset.addValue(1000,rowKey,"商品F");
    salesDataset.addValue(700,rowKey,"商品G");
    salesDataset.addValue(500,rowKey,"商品H");
    //
    CategoryAxis xAxis = new CategoryAxis();
    NumberAxis yAxis = new NumberAxis(rowKey);
    BarRenderer renderer = new BarRenderer();
    CategoryPlot catPlot = new CategoryPlot(salesDataset,xAxis,yAxis,(CategoryItemRenderer)renderer);
    //
    // CategoryPlotに累積グラフを追加する
    {
      // トータルの売上を計算する
      Double total = 0D;
      DefaultCategoryDataset percentDataset;
      {
        List<Comparable> items = salesDataset.getColumnKeys();
        for (int i=0; i<items.size(); i++) {
          Comparable item = items.get(i);
          total += (Double)salesDataset.getValue(rowKey,item);
        }
        percentDataset = new DefaultCategoryDataset();
      }
      // 累積パーセントを計算する
      {
        Double accumlated = 0D;
        percentDataset = new DefaultCategoryDataset();
        List<Comparable> items = salesDataset.getColumnKeys();
        for (int i=0; i<items.size(); i++) {
          Comparable item = items.get(i);
          accumlated += (Double)salesDataset.getValue(rowKey,item);
          percentDataset.addValue((double)accumlated/(double)total,"累積",item);
        }
      }
      // 累積グラフを追加する⇒グラフ番号は1になる
      final NumberAxis axis1 = new NumberAxis("Percent");
      axis1.setNumberFormatOverride(NumberFormat.getPercentInstance());
      catPlot.setRangeAxis(1,axis1);
      catPlot.setDataset(1,percentDataset);

      final LineAndShapeRenderer renderer1 = new LineAndShapeRenderer();
      catPlot.setRenderer(1,renderer1);
      catPlot.mapDatasetToRangeAxis(1,1);
      // このようにすれば累積グラフが上に描かれる
      catPlot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
    }
    JFreeChart jfreeChart = new JFreeChart("パレート図",(Plot)catPlot);
    ChartFrame cFrame = new ChartFrame("パレート図",(JFreeChart)jfreeChart);  // (1)
    cFrame.pack();
    cFrame.setVisible(true);
  }
}

```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/845fdd36-8f99-3d82-4bff-61ad35ec20c9.png)