2012-03-31 20:26:42|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:Java, Swing, 界面设计|来源:唯设编程网
前面的文章介绍了很多Java利用JFreeChart绘制统计图表的方法,堆积图在统计图表中非常重要,本文将继续介绍堆积图的绘制方法,同时介绍如何将图形保存到磁盘文件,和前面的模式一样,本文依然会给出程序的运行效果和Java源代码。
首先展示程序的运行效果:

Java源码:
package Test.JFreeChar;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.io.File;
import java.io.FileOutputStream;
import java.text.DecimalFormat;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DatasetUtilities;
public class JfreechartStack extends JFrame{
private static final long serialVersionUID = 1L;
private static final String CHART_PATH = "pic/";
JfreechartStack(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("JFreeChart堆积图");
this.add(CreateMainPanel());
this.pack();
this.setVisible(true);
}
private Component CreateMainPanel() {
CategoryDataset dataset = prepareDataset();
JFreeChart chart=createJFreeChart(dataset, "x坐标", "y坐标", "堆积图");
return new ChartPanel(chart);
}
public static void main(String[] args) {
new JfreechartStack().makeStackedBarChart();
}
/**
* 生成堆栈柱状图
*/
public void makeStackedBarChart() {
CategoryDataset dataset = prepareDataset();
saveAsFile("stsckedBar.png",createJFreeChart(dataset,
"x坐标", "y坐标", "堆积图"));
}
private CategoryDataset prepareDataset() {
double[][] data = new double[][] {
{ 0.21, 0.66, 0.23, 0.40, 0.26 },
{ 0.25, 0.21, 0.10, 0.40, 0.16 }
};
String[] rowKeys = { "苹果", "梨子" };
String[] columnKeys = { "北京", "上海", "广州", "成都", "深圳" };
CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);
return dataset;
}
/**
* 创建JFreeChart
* @param dataset
* @param xName
* @param yName
* @param chartTitle
* @return
*/
private JFreeChart createJFreeChart(CategoryDataset dataset,
String xName, String yName, String chartTitle) {
// 2:JFreeChart对象
JFreeChart chart = ChartFactory.createStackedBarChart(chartTitle, // 图表标题
xName, // 目录轴的显示标签
yName, // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
);
// 图例字体清晰
chart.setTextAntiAlias(false);
chart.setBackgroundPaint(Color.WHITE);
// 2 .2 主标题对象 主标题对象是 TextTitle 类型
chart.setTitle(new TextTitle(chartTitle, new Font("隶书", Font.BOLD, 25)));
// 2 .2.1:设置中文
// x,y轴坐标字体
Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
// 2 .3 Plot 对象 Plot 对象是图形的绘制结构对象
CategoryPlot plot = chart.getCategoryPlot();
// 设置横虚线可见
plot.setRangeGridlinesVisible(true);
// 虚线色彩
plot.setRangeGridlinePaint(Color.gray);
// 数据轴精度
NumberAxis vn = (NumberAxis) plot.getRangeAxis();
// 设置最大值是1
vn.setUpperBound(1);
// 设置数据轴坐标从0开始
// vn.setAutoRangeIncludesZero(true);
// 数据显示格式是百分比
DecimalFormat df = new DecimalFormat("0.00%");
vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式
// DomainAxis (区域轴,相当于 x 轴), RangeAxis (范围轴,相当于 y 轴)
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(labelFont);// 轴标题
domainAxis.setTickLabelFont(labelFont);// 轴数值
// x轴坐标太长,建议设置倾斜,如下两种方式选其一,两种效果相同
// 倾斜(1)横轴上的 Lable 45度倾斜
// domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
// 倾斜(2)Lable(Math.PI 3.0)度倾斜
// domainAxis.setCategoryLabelPositions(CategoryLabelPositions
// .createUpRotationLabelPositions(Math.PI / 3.0));
// 横轴上的 Lable 是否完整显示
domainAxis.setMaximumCategoryLabelWidthRatio(0.6f);
plot.setDomainAxis(domainAxis);
// y轴设置
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(labelFont);
rangeAxis.setTickLabelFont(labelFont);
// 设置最高的一个 Item 与图片顶端的距离
rangeAxis.setUpperMargin(0.15);
// 设置最低的一个 Item 与图片底端的距离
rangeAxis.setLowerMargin(0.15);
plot.setRangeAxis(rangeAxis);
// Renderer 对象是图形的绘制单元
StackedBarRenderer renderer = new StackedBarRenderer();
// 设置柱子宽度
renderer.setMaximumBarWidth(0.05);
// 设置柱子高度
renderer.setMinimumBarLength(0.1);
// 设置柱的边框颜色
renderer.setBaseOutlinePaint(Color.BLACK);
// 设置柱的边框可见
renderer.setDrawBarOutline(true);
// // 设置柱的颜色(可设定也可默认)
renderer.setSeriesPaint(0, new Color(204, 255, 204));
renderer.setSeriesPaint(1, new Color(255, 204, 153));
// 设置每个地区所包含的平行柱的之间距离
renderer.setItemMargin(0.4);
plot.setRenderer(renderer);
return chart;
}
/**
* 保存为文件
* @param charName
* @param chart
* @return
*/
private Boolean saveAsFile(String charName, JFreeChart chart) {
FileOutputStream fos_jpg = null;
try {
isChartPathExist(CHART_PATH);
String chartName = CHART_PATH + charName;
fos_jpg = new FileOutputStream(chartName);
ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 500, true, 10);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
fos_jpg.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 柱状图,折线图 数据集
public CategoryDataset getBarData(double[][] data,
String[] rowKeys, String[] columnKeys) {
return DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
}
/**
* 判断文件夹是否存在,如果不存在则新建
* @param chartPath
*/
private void isChartPathExist(String chartPath) {
File file = new File(chartPath);
if (!file.exists()) {
file.mkdirs();
}
}
}
至此,便完成了Java利用JFreeChart绘制堆积图的实例,并且实现了将图像文件保存到磁盘的功能。