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绘制堆积图的实例,并且实现了将图像文件保存到磁盘的功能。