I modify the StackedBarChartDemo2 to get the following result.
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: