Stacked Bar Chart?

A discussion forum for JFreeChart (a 2D chart library for the Java platform).
Locked
Iceman79
Posts: 1
Joined: Mon Mar 08, 2010 9:21 am
antibot: No, of course not.

Stacked Bar Chart?

Post by Iceman79 » Mon Mar 08, 2010 10:01 am

Hello,

I modify the StackedBarChartDemo2 to get the following result.

Image

Code: Select all

package demo;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Paint;
import java.awt.geom.Rectangle2D;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.util.Locale;

import javax.swing.JPanel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.LegendItem;
import org.jfree.chart.LegendItemCollection;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.HorizontalAlignment;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.RectangleInsets;

/**
 * A stacked bar chart with a horizontal orientation.
 */
public class StackedBarChartDemo2 extends ApplicationFrame {

    /**
     * Creates a new demo instance.
     * @param title the frame title.
     */
    public StackedBarChartDemo2(String title) {
        super(title);
        JPanel chartPanel = createDemoPanel();
        chartPanel.setPreferredSize(new Dimension(500, 270));
        setContentPane(chartPanel);
    }

    /**
     * Returns a sample dataset.
     * @return The dataset.
     */
    private static CategoryDataset createDataset() {

        // create the dataset...
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();

        dataset.addValue(8100000.0, "Against all torture", "Italy");
        dataset.addValue(7200000.0, "Against all torture", "Great Britain");
        dataset.addValue(5800000.0, "Against all torture", "USA");

        dataset.addValue(500000.0, "-", "Italy");
        dataset.addValue(400000.0, "-", "Great Britain");
        dataset.addValue(600000.0, "-", "USA");
        
        dataset.addValue(1400000.0, "Some degree permissible", "Italy");
        dataset.addValue(2400000.0, "Some degree permissible", "Great Britain");
        dataset.addValue(3000000.0, "Some degree permissible", "USA");

        dataset.addValue(1900000.0, "-2", "Italy");
        dataset.addValue(1400000.0, "-2", "Great Britain");
        dataset.addValue(2600000.0, "-2", "USA");
        
        dataset.addValue(5100000.0, "Against all torture2", "Italy");
        dataset.addValue(4200000.0, "Against all torture2", "Great Britain");
        dataset.addValue(2800000.0, "Against all torture2", "USA");
        
        return dataset;

    }

    /**
     * Creates a sample chart.
     * @param dataset the dataset.
     * @return The chart.
     */
    private static JFreeChart createChart(CategoryDataset dataset) {

        // create the chart...
        JFreeChart chart = ChartFactory
                .createStackedBarChart("Public Opinion : Torture of Prisoners",
                                       "Country", // domain axis label
                                       "%", // range axis label
                                       dataset, // data
                                       PlotOrientation.HORIZONTAL, // orientation
                                       false, // include legend
                                       true, // tooltips?
                                       false // URLs?
                );

        // set the background color for the chart...
        chart.setBackgroundPaint(Color.white);
        chart.getTitle().setMargin(2.0, 0.0, 0.0, 0.0);

        // get a reference to the plot for further customisation...
        CategoryPlot plot = (CategoryPlot) chart.getPlot();
        LegendItemCollection items = new LegendItemCollection();
        items.add(new LegendItem("Against all torture",
                                 null,
                                 null,
                                 null,
                                 new Rectangle2D.Double(-6.0, -3.0, 12.0, 6.0),
                                 Color.green));
        items.add(new LegendItem("Some degree permissible",
                                 null,
                                 null,
                                 null,
                                 new Rectangle2D.Double(-6.0, -3.0, 12.0, 6.0),
                                 Color.red));
        items.add(new LegendItem("Other permissible",
                                 null,
                                 null,
                                 null,
                                 new Rectangle2D.Double(-6.0, -3.0, 12.0, 6.0),
                                 Color.blue));
        plot.setFixedLegendItems(items);
        plot.setInsets(new RectangleInsets(5, 5, 5, 20));
        LegendTitle legend = new LegendTitle(plot);
        legend.setPosition(RectangleEdge.BOTTOM);
        chart.addSubtitle(legend);

        plot.setBackgroundPaint(Color.lightGray);
        plot.setDomainGridlinePaint(Color.white);
        plot.setDomainGridlinesVisible(true);
        plot.setRangeGridlinePaint(Color.white);

        DateAxis rangeAxis = new DateAxis();
        rangeAxis.setStandardTickUnits(DateAxis.createStandardDateTickUnits());
        rangeAxis.setDateFormatOverride(DateFormat.getDateTimeInstance(DateFormat.SHORT,
                                                                       DateFormat.MEDIUM,
                                                                       Locale.GERMAN));
        rangeAxis.setRange(0.0, 20000000.0);
        plot.setRangeAxis(rangeAxis);

        // disable bar outlines...
        BarRenderer renderer = (BarRenderer) plot.getRenderer(0);
        renderer.setDrawBarOutline(false);

        // set up gradient paints for series...
        GradientPaint gp0 = new GradientPaint(0.0f,
                                              0.0f,
                                              Color.green,
                                              0.0f,
                                              0.0f,
                                              new Color(0, 64, 0));
        Paint gp1 = new Color(0, 0, 0, 0);
        GradientPaint gp2 = new GradientPaint(0.0f,
                                              0.0f,
                                              Color.red,
                                              0.0f,
                                              0.0f,
                                              new Color(64, 0, 0));
        GradientPaint gp3 = new GradientPaint(0.0f,
                                              0.0f,
                                              Color.blue,
                                              0.0f,
                                              0.0f,
                                              new Color(0, 0, 64));
        renderer.setSeriesPaint(0, gp0);
        renderer.setSeriesPaint(1, gp1);
        renderer.setSeriesPaint(2, gp2);
        renderer.setSeriesPaint(3, gp3);
        renderer.setSeriesPaint(4, gp0);
        return chart;

    }

    /**
     * Creates a panel for the demo (used by SuperDemo.java).
     * @return A panel.
     */
    private static JPanel createDemoPanel() {
        JFreeChart chart = createChart(createDataset());
        try {
            byte[] b = ChartUtilities.encodeAsPNG(chart.createBufferedImage(500, 270));
            FileOutputStream stream = new FileOutputStream("c:\\test.png");
            stream.write(b);
            stream.flush();
            stream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new ChartPanel(chart);
    }

    /**
     * Starting point for the demonstration application.
     * @param args ignored.
     */
    public static void main(String[] args) {
        new StackedBarChartDemo2("Stacked Bar Chart Demo 2");
    }

}


I need to set each dataset value an own color. How can i do this, to get an chart like this:

Image

Locked