Столбчатые диаграммы Bar Charts

Библиотека JFreeChart позволяет создавать и настраивать интерфейс столбчатых диаграмм Bar Chart, иначе называемых гистограммами. Чтобы понять, как создавать диаграммы Bar Chart рассмотрим создание составных элементов и диаграммы в целом :

// Создание осевых объектов диаграммы
CategoryAxis categoryAxis = new CategoryAxis(categoryAxisLabel);
ValueAxis    valueAxis    = new NumberAxis  (valueAxisLabel   );

// Создание визуализатора (renderer)
BarRenderer renderer = new BarRenderer();

// Создание объекта графической части диаграммы, plot'a
CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, renderer);
plot.setOrientation(orientation);

// Создание диаграммы
JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULTTITLEFONT, plot, legend);

Диаграмма Bar Chart имеет две оси : ось категорий объектов и ось их числовых значений. CategoryAxis определяет объекты набора данных, а NumberAxis используется для определения числовых значений объектов. Визуализатор отвечает за прорисовку (отображение) каждого объекта (столбца) на диаграмме. Набор данных dataset, осевые объекты и визуализатор используются для создания объекта CategoryPlot. Его метод setOrientation позволяет определить ориентацию столбцов. Заголовок title, plot и объект легенды необходимы для создания диаграммы JFreeChart.

Процесс создания диаграммы Bar Chart можно упростить, используя методы утилиты ChartFactory.

Методы создания Bar Chart

Утилита ChartFactory включает несколько статических методов создания круговых диаграмм Bar Chart :

public static
JFreeChart createBarChart  (String title,
                            String categoryAxisLabel, 
                            String valueAxisLabel,
                            CategoryDataset dataset);
JFreeChart createBarChart  (String title,
                            String categoryAxisLabel, 
                            String valueAxisLabel,
                            CategoryDataset dataset, 
                            PlotOrientation orientation,
                            boolean legend, 
                            boolean tooltips, 
                            boolean urls);
JFreeChart createBarChart3D(String title,
                            String categoryAxisLabel, 
                            String valueAxisLabel,
                            CategoryDataset dataset);
JFreeChart createBarChart3D(String title,
                            String categoryAxisLabel, 
                            String valueAxisLabel,
                            CategoryDataset dataset, 
                            PlotOrientation orientation,
                            boolean legend, 
                            boolean tooltips, 
                            boolean urls);
JFreeChart createStackedBarChart  (String title,
                                   String domainAxisLabel, 
                                   String rangeAxisLabel,
                                   CategoryDataset dataset);
JFreeChart createStackedBarChart  (String title,
                                   String domainAxisLabel, 
                                   String rangeAxisLabel,
                                   CategoryDataset dataset, 
                                   PlotOrientation orientation,
                                   boolean legend, 
                                   boolean tooltips, 
                                   boolean urls);
JFreeChart createStackedBarChart3D(String title,
                                   String categoryAxisLabel, 
                                   String valueAxisLabel,
                                   CategoryDataset dataset);
JFreeChart createStackedBarChart3D(String title,
                                   String categoryAxisLabel, 
                                   String valueAxisLabel,
                                   CategoryDataset dataset, 
                                   PlotOrientation orientation,
                                   boolean legend, 
                                   boolean tooltips, 
                                   boolean urls);

Можно сказать, что статические перегруженные методы создания столбчатых диаграмм включают либо минимальный набор параметров (заголовок title, метка оси domainAxisLabel, метка оси rangeAxisLabel и набор данных dataset), либо полный (к минимальному набору добавляются ориентация столбцов orientation, флаг отображения легенды legend, флаг вывода подсказки tooltips и флаг отображения urls).

Полосковая диаграмма (Stacked Bar Chart) позволяет отображать с помощью полос значения нескольких параметров и является разновидностью обычной Bar Chart. Ниже представлен пример создания полосковой диаграммы BarChartStacked.java

Настройка цвета

Фоновй цвет диаграммы и plot'a можно изменить используя метод setBackgroundPaint(Color). Для определения цвета сетки используются методы setDomainGridlinePaint(Color) и setRangeGridlinePaint (Color).

// Определение фона диаграммы
chart.setBackgroundPaint(Color.white);

// Определение фона plot'а
CategoryPlot plot = chart.getCategoryPlot();

plot.setBackgroundPaint(new Color(212, 212, 248));

// Определение цвета сетки
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint (Color.white);

Настройка визуализатора, BarRenderer

Визуализатор BarRenderer можно получить из диаграммы JFreeChart или создать.

BarRenderer renderer = new BarRenderer();
// или
BarRenderer renderer = (BarRenderer)chart.getPlot().getRenderer();

Ниже в примерах можно увидеть использование нескольких типов визуализаторов (LayeredBarRenderer, GroupedStackedBarRenderer), наследующих свойства класса AbstractRenderer.

Определение цвета столбцов

renderer.setSeriesPaint(0, Color.gray);
renderer.setSeriesPaint(1, Color.orange);
renderer.setDrawBarOutline(false);

Метод setSeriesPaint(index, Color) определен в абстрактом класса AbstractRenderer, и его можно использовать для всех типов renderer.

Определение расстояния между столбцами

Расстояние между столбцами определяется методом setItemMargin().

renderer.setItemMargin(0.0);

Примеры диаграмм Bar Chart

Рассмотрим 6 примеров создания столбчатых диаграмм Bar Chart с настройкой различных параметров :

ПримерПримечание
BarChart.java настройка цвета фона plot'a и цвета линий сетки, поворот меток на 45°
BarChart3D.java 3d диаграмма, настройка цвета фона plot'a и цвета линий сетки, поворот меток на 30°
BarChartVertical.java настройка цвета фона диаграммы, plot'а и цвета линий сетки, удалена осевая линия с метками
BarChartHorizontal.java диаграмма с горизонтальным расположением, настройка цвета столбцов, перенос оси RangeAxis вниз
BarChartLayered.java слоеная диаграмма, настройка осевой шкалы
BarChartStacked.java полосковая диаграмма с градиентной заливкой, создание легенды

Исходные коды примеров желающие могут скачать в конце страницы.

Методы формирования наборов данных для диаграмм вынесены в отдельный модуль Dataset.java. Таким образом, исходные данные отделены от интерфейса диаграмм для облегчения восприятия кодов.

Листинг Dataset.java

Диаграммы Bar Chart используют наборы данных типа CategoryDataset. Модуль Dataset.java включает 3 метода формирования различных наборов данных. Методы createDataset1 и createDataset3 представлены в сокращенном виде.

import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

import org.jfree.data.general.DatasetUtilities;

public class Dataset 
{
    private static final double[][] data = new double[][] {
             {12.0, 29.0, 36.0, 64.0, 58.0, 79.0, 70.0, 92.0},
             {49.0, 72.0, 74.0, 68.0, 88.0, 54.0, 38.0, 23.0},
             {41.0, 33.0, 22.0, 34.0, 62.0, 32.0, 42.0, 34.0}
    };

    public static CategoryDataset createDataset1()
    {
        DefaultCategoryDataset dataset; 
        // row keys...
        final String series1 = "Чай"     ;
        final String series2 = "Кофе"    ;
        final String series3 = "Коктейль";
        // column keys...
        final String category1 = "Январь" ;
        final String category2 = "Февраль";
        . . .
        dataset = new DefaultCategoryDataset();

        dataset.addValue(3.1, series1, category1);
        . . .
        return dataset;        
    }    

    public static CategoryDataset createDataset2() { 
        return DatasetUtilities.createCategoryDataset("Series ", 
                                                 "Factor ", data);
    }    

    public static CategoryDataset createDataset3()
    {
        DefaultCategoryDataset result = new DefaultCategoryDataset();

        result.addValue(16.1, "Чай (Офис 1)"     , "Январь" );
        result.addValue(28.2, "Чай (Офис 1)"     , "Февраль");
        . . .
        result.addValue(29.5, "Кофе (Офис 1)"    , "Январь" );
        result.addValue(27.4, "Кофе (Офис 1)"    , "Февраль");
        . . .
        result.addValue(16.7, "Коктейль (Офис 1)", "Январь" );
        result.addValue(29.8, "Коктейль (Офис 1)", "Февраль");
        . . .
        return result;
    }
}

Пример BarChart.java

В примере BarChart.java изменим цвет фона plot'а и цвет линий сетки, повернем значения меток на 45° Интерфейс примера представлен на следующем скриншоте.

Листинг BarChart.java

Цвет фона диаграммы и plot'а настраивается методом setBackgroundPaint. Чтобы изменить цвет линий сетки используются методы setDomainGridlinePaint и setRangeGridlinePaint.

Для поворота меток значений используется метод setCategoryLabelPositions с параметром CategoryLabelPositions.UP_45. Чтобы повернуть метки на 90° необходимо использовать значение UP_90.

import java.awt.Color;
import java.awt.Dimension;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;

import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;

import org.jfree.chart.renderer.category.CategoryItemRenderer;

import org.jfree.data.category.CategoryDataset;

import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

public class BarChart extends ApplicationFrame
{
    private static final long serialVersionUID = 1L;

    public BarChart(final String title)
    {
        super(title);

        CategoryDataset dataset    = Dataset.createDataset1();
        JFreeChart      chart      = createChart(dataset);
        ChartPanel      chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new Dimension(480, 320));
        setContentPane(chartPanel);
    }

    private JFreeChart createChart(final CategoryDataset dataset) 
    {
        final JFreeChart chart = ChartFactory.createBarChart(
            "Потребление напитков",   // chart title
            "Месяц",                  // domain axis label
            "Объем",                  // range axis label
            dataset,                  // data
            PlotOrientation.VERTICAL, // orientation
            true,                     // include legend
            true,                     // tooltips
            false                     // urls
        );

        // Определение фона диаграммы
        chart.setBackgroundPaint(Color.white);

        // Настройка plot'а
        CategoryPlot plot = chart.getCategoryPlot();

        plot.setBackgroundPaint    (new Color(212, 212, 248));
        plot.setDomainGridlinePaint(Color.white);
        plot.setRangeGridlinePaint (Color.white);
        
        // Настройка значений меток NumberAxis
        // (только целочисленные значения)
        NumberAxis axis = (NumberAxis) plot.getRangeAxis();
        axis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        axis.setUpperMargin(0.15);
        
        CategoryAxis axis_d = plot.getDomainAxis();
        axis_d.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
        
        return chart;
    }
    public static void main(final String[] args)
   {
        final BarChart demo = new BarChart("Bar Chart");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }
}

Пример BarChart3d.java

В примере BarChart3d.java изменим цвет фона plot'а и цвет линиц сетки, повернем значения меток на 30°. Интерфейс примера представлен на следующем скриншоте. Отличия от предыдущего примера связаны с эффектом 3d, углом поворота меток значений и скрытием осевых линий и меток делений DomainAxis.

Листинг BarChart3d.java

Чтобы повернуть метки значений на произвольный угол необходимо использовать метод createUpRotationLabelPositions(angle). Угол angle (измеряемый в радианах), на который можно повернуть метки, должен быть меньше 90° (< Math.PI / 2.0).

public class BarChart3D extends ApplicationFrame 
{
    private static final long serialVersionUID = 1L;

    public BarChart3D(final String title)
    {
        super(title);
        
        final CategoryDataset dataset    = Dataset.createDataset1();
        final JFreeChart      chart      = createChart(dataset);
        final ChartPanel      chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
        setContentPane(chartPanel);

    }
    private JFreeChart createChart(final CategoryDataset dataset) {
        
        final JFreeChart chart = ChartFactory.createBarChart3D(
            "Потребление напитков",   // chart title
            "Месяц",                  // domain axis label
            "Объем",                  // range axis label
            dataset,                  // data
            PlotOrientation.VERTICAL, // orientation
            true,                     // include legend
            true,                     // tooltips
            false                     // urls
        );
        // Определение фона plot'a
        CategoryPlot plot = chart.getCategoryPlot();
        plot.setBackgroundPaint (new Color(212, 212, 248));

        // Настройка CategoryAxis 
        CategoryAxis axis = plot.getDomainAxis();
        // Скрытие осевых линий и меток делений
        axis.setAxisLineVisible (false);    // осевая линия
        axis.setTickMarksVisible(false);    // метки деления оси
        // Наклон меток значений 
        axis.setCategoryLabelPositions(
            CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 6.0)
        );
        
        CategoryItemRenderer renderer = plot.getRenderer();
        renderer.setBaseItemLabelsVisible(true);
        BarRenderer r = (BarRenderer) renderer;
        r.setMaximumBarWidth(0.05);
        
        return chart;
    }
        
    public static void main(final String[] args)
    {
        final BarChart3D demo = new BarChart3D("3D Bar Chart");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }
}

Пример BarChartVertical.java

В примере BarChartVertical.java изменим цвет диаграммы и фона plot'а, цвет линиц сетки и удалим осевые линии и метки делений DomainAxis. Интерфейс примера представлен на следующем скриншоте.

Листинг BarChartVertical.java

Для изменения цвета диаграммы и фонового цвета plot'a используется метод setBackgroundPaint. Цвет сетки определяется методом setRangeGridlinePaint. Осевая линия и метки делений удаляются методами setAxisLineVisible и setTickMarksVisible.

Вертикальное расположение столбцов определяется параметров PlotOrientation.VERTICAL.

import java.awt.Color;

import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.ChartFactory;

import org.jfree.chart.axis.Axis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.AxisLocation;

import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;

import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

import org.jfree.data.category.CategoryDataset;

public class BarChartVertical extends ApplicationFrame 
{
    private static final long serialVersionUID = 1L;

    private static final  String TITLE = "Bar Chart вертикальный";

    public BarChartVertical(final String title) 
    {
        super(title);
        CategoryDataset dataset    = Dataset.createDataset2();
        JFreeChart      chart      = createChart(dataset);        
        ChartPanel      chartPanel = new ChartPanel(chart);
        
        chartPanel.setPreferredSize(new java.awt.Dimension(560, 320));
        setContentPane(chartPanel);
    }

    private JFreeChart createChart(final CategoryDataset dataset) {
        
        final JFreeChart chart = ChartFactory.createBarChart(
                TITLE,   // chart title
                null,                       // domain axis label
                "Значение, %",              // range axis label
                dataset,                    // data
                PlotOrientation.VERTICAL,   // orientation
                true,                       // include legend
                true,
                false);

        // Определение фона диаграммы
        chart.setBackgroundPaint(new Color(232, 224, 224));

        // Настройка plot'а
        final CategoryPlot plot = chart.getCategoryPlot();
        // Фон plot'a
        plot.setBackgroundPaint    (new Color(248, 248, 232));
        // Линии шкалы деления 
        plot.setRangeAxisLocation  (AxisLocation.BOTTOM_OR_LEFT);
        plot.setRangeGridlinePaint (Color       .lightGray     );
        
        // Настройка значений меток NumberAxis (только целочисленные значения)
        final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setRange(0.0, 100.0);
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        
        // Удаляем из диаграммы осевую линию и метки делений
        Axis axis = plot.getDomainAxis();
        axis.setAxisLineVisible(false);    // осевая линия
        axis.setTickMarksVisible(false);   // метки деления оси 
        
        return chart;
    }
    
    public static void main(final String[] args) {

        final BarChartVertical demo = new BarChartVertical(TITLE);
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }
}

Пример BarChartHorizontal.java

В примере BarChartHorizontal.java изменим цвет диаграммы и фона plot'а, определим цвет линиц сетки и удалим осевые линии. Интерфейс примера представлен на следующем скриншоте.

Листинг BarChartHorizontal.java

Для изменения цвета диаграммы и фонового цвета plot'a используется метод setBackgroundPaint. Цвет сетки определяется методом setRangeGridlinePaint. Осевые линии удаляются методом setAxisLineVisible. Смещение осевых меток определяется методом setAxisOffset.

Горизонтальное расположение столбцов определяется параметров PlotOrientation.HORIZONTAL.

public class BarChartHorizontal extends ApplicationFrame 
{
    private static final long serialVersionUID = 1L;

    private static final  String TITLE = "Bar Chart горизонтальный";

    public BarChartHorizontal(final String title)
    {
        super(title);
        CategoryDataset dataset    = Dataset.createDataset2();
        JFreeChart      chart      = createChart(dataset);
        ChartPanel      chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(560, 360));
        setContentPane(chartPanel);

    }
    private JFreeChart createChart(final CategoryDataset dataset) {
        
        final JFreeChart chart = ChartFactory.createBarChart(
                TITLE,                       // chart title
                null      ,                  // domain axis label
                "Score, %",                  // range axis label
                dataset   ,                  // data
                PlotOrientation.HORIZONTAL,  // orientation
                true,                        // include legend
                true,
                false);

        chart.setBackgroundPaint(new Color(236, 236, 236));

        // get a reference to the plot for further customisation...
        CategoryPlot plot = chart.getCategoryPlot();
        plot.setBackgroundPaint    (new Color(248, 248, 248));
        // Определение отступа меток делений
        plot.setAxisOffset(new RectangleInsets (1.0, 1.0, 1.0, 1.0));

        plot.setRangeAxisLocation  (AxisLocation.BOTTOM_OR_LEFT);
        plot.setRangeGridlinePaint (Color       .lightGray     );
        
        // Определение цвета столбцов диаграммы
        plot.getRenderer().setSeriesPaint(0, new Color(  0,   0, 255));
        plot.getRenderer().setSeriesPaint(1, new Color( 75,  75, 255));
        plot.getRenderer().setSeriesPaint(2, new Color(150, 150, 255));

        // change the auto tick unit selection to integer units only...
        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setRange(0.0, 100.0);
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        
        // Удаляем из диаграммы осевые линии
        Axis axis = plot.getRangeAxis();
        axis.setAxisLineVisible(false);
        axis = plot.getDomainAxis();
        axis.setAxisLineVisible(false);
        
        return chart;
    }
    public static void main(final String[] args)
    {
        final BarChartHorizontal demo = new BarChartHorizontal(TITLE);
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }
}

Пример BarChartLayered.java

В примере BarChartLayered.java совместим представление значений разных объектов в одном столбце и удалим осевые линии. Интерфейс примера представлен на следующем скриншоте.

Листинг BarChartLayered.java

Для создания слоеной диаграммы используется объект типа LayeredBarRenderer, у которого необходимо настроить ширину столбцов. Для этого вызывается метод setSeriesBarWidth с идентификатором столбца (отсчет от 0) и шириной столбца (1 соответствует 100%).

Для настройки параметров осевой линии domainAxis используются методы setCategoryMargin, setUpperMargin и setLowerMargin, позволяющие сжимать и разжимать столбцы, а также смещать их вправо и влево.

import java.awt.Color;

import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;

import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.CategoryAxis;

import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;

import org.jfree.data.category.CategoryDataset;

import org.jfree.chart.renderer.category.LayeredBarRenderer;

public class BarChartLayered extends ApplicationFrame
{
    private static final long serialVersionUID = 1L;

    public BarChartLayered(final String title)
    {
        super(title);
        CategoryDataset    dataset      = Dataset.createDataset2    ();
        CategoryAxis       categoryAxis = new CategoryAxis("Category");
        ValueAxis          valueAxis    = new NumberAxis  ("Score, %");
        LayeredBarRenderer renderer     = new LayeredBarRenderer    ();
        
        CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, 
                                             valueAxis, renderer);
        
        plot.setOrientation(PlotOrientation.VERTICAL);
        JFreeChart chart = new JFreeChart( "Layered Bar Chart", 
                                 JFreeChart.DEFAULT_TITLE_FONT, 
                                 plot, true );
        
        chart.setBackgroundPaint(new Color(232, 232, 232));

        // Индивидуальная настройка каждого столбца
        // Ширина столбца (в %) определяется значением от 0 до 1
        renderer.setSeriesBarWidth(0, 1.0);
        renderer.setSeriesBarWidth(1, 0.6);
        renderer.setSeriesBarWidth(2, 0.3);

        renderer.setItemMargin(0.01);

        final CategoryAxis domainAxis = plot.getDomainAxis();
        domainAxis.setCategoryMargin(0.25);
        domainAxis.setUpperMargin(0.05);
        domainAxis.setLowerMargin(0.05);

        // Размещение диаграммы на панели
        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(540, 270));
        setContentPane(chartPanel);
    }

    public static void main(final String[] args) 
    {
        BarChartLayered demo = new BarChartLayered("Layered Bar Chart");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }
}

Пример BarChartStacked.java

В примере создания полосковой диаграммы BarChartStacked.java используем градиентную заливку столбцов и создадим легенду. Интерфейс примера представлен на следующем скриншоте.

Листинг BarChartStacked.java

В качестве градиентной заливки используется класс GradientPaint (float x1, float y1, Color color1, float x2, float y2, Color color2). Цвета заливки вынесены в отдельные массивы, чтобы можно было их согласовать с легендой.

Легенда диаграммы представляет собой коллекцию типа LegendItemCollection. При создании легенды в методе createLegendItems() необходимо согласовать наименование объекта и цвет представления его значения на диаграмме.

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Paint;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.LegendItem;
import org.jfree.chart.LegendItemCollection;
import org.jfree.chart.axis.SubCategoryAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;

import org.jfree.data.KeyToGroupMap;
import org.jfree.data.category.CategoryDataset;

import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.ui.GradientPaintTransformType;
import org.jfree.ui.StandardGradientPaintTransformer;

import org.jfree.chart.renderer.category.GroupedStackedBarRenderer;

public class BarChartStacked extends ApplicationFrame
{
    private static final long serialVersionUID = 1L;

    private static final  String TITLE = "Stacked Bar Chart";

    private final Color  COLOR_1 = new Color(0x32, 0x32, 0xFF);
    private final Color  COLOR_2 = new Color(0x32, 0xFF, 0x32);
    private final Color  COLOR_3 = new Color(0xFF, 0x32, 0x32);
    private final Color  COLOR_4 = new Color(0xFF, 0xFF, 0x32);

    private final Color  COLOR_1_ = new Color(0x96, 0x96, 0xFF);
    private final Color  COLOR_2_ = new Color(0x96, 0xFF, 0x96);
    private final Color  COLOR_3_ = new Color(0xFF, 0x96, 0x96);
    private final Color  COLOR_4_ = new Color(0xFF, 0xFF, 0x96);

    public BarChartStacked(final String title) 
    {
        super(title);
        CategoryDataset  dataset    = Dataset.createDataset3();
        JFreeChart       chart      = createChart(dataset);
        ChartPanel       chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(590, 350));
        setContentPane(chartPanel);
    }
    
    private GradientPaint createGradientPaint(Color color1,Color color2)
    {
        return new GradientPaint(0.0f,0.0f, color1, 0.0f,0.0f, color2);
    }

    private JFreeChart createChart(final CategoryDataset dataset) 
    {
        SubCategoryAxis           domainAxis;
        GroupedStackedBarRenderer renderer;

        final JFreeChart chart = ChartFactory.createStackedBarChart(
            TITLE     ,               // chart title
            "Category",               // domain axis label
            null      ,               // range axis label
            dataset   ,               // data
            PlotOrientation.VERTICAL, // the plot orientation
            true,                     // legend
            true,                     // tooltips
            false                     // urls
        );
        
        KeyToGroupMap map = new KeyToGroupMap("G1");
        map.mapKeyToGroup("Чай (Офис 1)", "G1");
        map.mapKeyToGroup("Чай (Офис 2)", "G1");
        map.mapKeyToGroup("Чай (Офис 3)", "G1");
        map.mapKeyToGroup("Чай (Офис 4)", "G1");
        
        map.mapKeyToGroup("Кофе (Офис 1)", "G2");
        map.mapKeyToGroup("Кофе (Офис 2)", "G2");
        map.mapKeyToGroup("Кофе (Офис 3)", "G2");
        map.mapKeyToGroup("Кофе (Офис 4)", "G2");
        
        map.mapKeyToGroup("Коктейль (Офис 1)", "G3");
        map.mapKeyToGroup("Коктейль (Офис 2)", "G3");
        map.mapKeyToGroup("Коктейль (Офис 3)", "G3");
        map.mapKeyToGroup("Коктейль (Офис 4)", "G3");
        
        renderer = new GroupedStackedBarRenderer();
        renderer.setSeriesToGroupMap(map); 
        
        renderer.setItemMargin(0.0);
        Paint p1 = createGradientPaint(COLOR_1, COLOR_1_);
        renderer.setSeriesPaint(0, p1);
        renderer.setSeriesPaint(4, p1);
        renderer.setSeriesPaint(8, p1);
         
        Paint p2 = createGradientPaint(COLOR_2, COLOR_2_);
        renderer.setSeriesPaint(1, p2); 
        renderer.setSeriesPaint(5, p2); 
        renderer.setSeriesPaint(9, p2); 
        
        Paint p3 = createGradientPaint(COLOR_3, COLOR_3_);
        renderer.setSeriesPaint(2, p3);
        renderer.setSeriesPaint(6, p3);
        renderer.setSeriesPaint(10, p3);
            
        Paint p4 = createGradientPaint(COLOR_4, COLOR_4_);
        renderer.setSeriesPaint(3, p4);
        renderer.setSeriesPaint(7, p4);
        renderer.setSeriesPaint(11, p4);
        renderer.setGradientPaintTransformer(
            new StandardGradientPaintTransformer(
                          GradientPaintTransformType.HORIZONTAL)
        );
        
        domainAxis = new SubCategoryAxis("Напитки / Месяц");
        domainAxis.setCategoryMargin(0.25);
        domainAxis.addSubCategory("Чай"     );
        domainAxis.addSubCategory("Кофе"    );
        domainAxis.addSubCategory("Коктейль");
        // Удаляем из диаграммы осевые линии и метки делений
        domainAxis.setAxisLineVisible(false);    // осевая линия
        domainAxis.setTickMarksVisible(false);   // метки деления оси 
        
        CategoryPlot plot = (CategoryPlot) chart.getPlot();
        plot.setDomainAxis(domainAxis);
        plot.setRenderer(renderer);
        plot.setFixedLegendItems(createLegendItems());
        
        plot.setBackgroundPaint (new Color(232, 232, 248));

        return chart;        
    }

    /**
     * Создание легенды для диаграммы
     * @return LegendItemCollection
     */
    private LegendItemCollection createLegendItems()
    {
        LegendItemCollection legend = new LegendItemCollection();

        LegendItem item1 = new LegendItem("Офис 1", COLOR_1); 
        LegendItem item2 = new LegendItem("Офис 2", COLOR_2);
        LegendItem item3 = new LegendItem("Офис 3", COLOR_3);
        LegendItem item4 = new LegendItem("Офис 4", COLOR_4);

        legend.add(item1);
        legend.add(item2);
        legend.add(item3);
        legend.add(item4);
        return legend;
    }

    public static void main(final String[] args)
    {
        final BarChartStacked demo = new BarChartStacked(TITLE);
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }
}

Скачать примеры

Исходные коды примеров создания диаграмм Bar Chart с использованием библиотеки JFreeChart в виде maven-проекта можно скачать здесь (30.0 Кб).

  Рейтинг@Mail.ru