jfreechart实现柱状图排序
今天在网上查了一下,没有发现 Jfreechart柱状图排序的实现方法,也还没来得及研究Jfreechart的代码和文档,所以就自己实现了一下。可能jfreechart自身有这个功能,可是发现以前的这个功能无效了,不知道用什么新方法实现这个功能了,所以只好自己实现了。
package my;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.GradientPaint;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.Iterator;import java.util.List;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.plot.CategoryPlot;import org.jfree.chart.plot.PlotOrientation;import org.jfree.chart.renderer.category.BarRenderer;import org.jfree.data.category.CategoryDataset;import org.jfree.data.category.DefaultCategoryDataset;import org.jfree.ui.ApplicationFrame;import org.jfree.ui.RefineryUtilities;/** * jfreechart排序柱状图. */public class MyBarPic extends ApplicationFrame { /** * * 构造函数,进行初始化操作 * * @param title the frame title. */ public MyBarPic(String title) { super(title); CategoryDataset dataset = createDataset(); JFreeChart chart = createChart(dataset); ChartPanel chartPanel = new ChartPanel(chart, false); chartPanel.setPreferredSize(new Dimension(500, 270)); setContentPane(chartPanel); saveAsFile(chart, "D:\\图\\第一.jpg", 430, 200); } /** * 生成数据集 * * @return */private static CategoryDataset createDataset() {/** * * 数据集数据存放对象 * * @author newlife111 * */class ThreeData implements Comparator{String rowKey;//行标签String colKey;//列标签double value;//值ThreeData(){}ThreeData(double value, String rowKey, String colKey){this.value = value;this.rowKey = rowKey;this.colKey = colKey;}/* * 比较的算法 */public int compare(Object obj1, Object obj2) {double valueTmp = ((ThreeData)obj1).value - ((ThreeData)obj2).value;return valueTmp > 0 ? -1 : (valueTmp < 0 ? 1 : 0); }}/* * 存放数据 */List list = new ArrayList();list.add(new ThreeData(100.00d, "xx", "苹\n果"));list.add(new ThreeData(200.00d, "xx", "葡\n萄"));list.add(new ThreeData(50.00d, "xx", "雪\n梨"));list.add(new ThreeData(24.00d, "xx", "香\n蕉"));list.add(new ThreeData(65.00d, "xx", "橘\n子"));list.add(new ThreeData(125.00d, "xx", "柑\n橘"));list.add(new ThreeData(198.00d, "xx", "柚\n子"));list.add(new ThreeData(160.00d, "xx", "草\n莓"));//进行排序Collections.sort(list,new ThreeData());/* * 添加数据进数据集 */DefaultCategoryDataset dataset = new DefaultCategoryDataset();Iterator iter = list.iterator();while(iter.hasNext()) {ThreeData threeDataTmp = (ThreeData)iter.next();dataset.addValue(threeDataTmp.value, threeDataTmp.rowKey, threeDataTmp.colKey);}return dataset;} /** * 生成图片. * * @param dataset 数据集. * * @return chart 图片对象 */ private static JFreeChart createChart(CategoryDataset dataset) { JFreeChart chart = ChartFactory.createBarChart( "xxx", // 图片标题 "xxx", // 横轴标题 "xxx", // 纵轴标题 dataset, // 数据集 PlotOrientation.VERTICAL, // 图形方向 true, // 是否legend true, // 图形提示 false // 图形url ); //设置图片背景色 chart.setBackgroundPaint(Color.white); //获得数据区对象 CategoryPlot plot = (CategoryPlot) chart.getPlot(); //设置图形背景色 plot.setBackgroundPaint(Color.white); //横轴网格显示 plot.setDomainGridlinesVisible(true); //横轴网格颜色 plot.setRangeGridlinePaint(Color.black); /* * 图形相关设置 */ BarRenderer renderer = (BarRenderer) plot.getRenderer(); renderer.setDrawBarOutline(false); renderer.setBaseItemLabelFont(new Font("黑体", Font.BOLD, 12)); renderer.setBaseLegendTextFont(new Font("Simsun", 0, 10)); renderer.setBaseItemLabelsVisible(true); renderer.setMaximumBarWidth(0.05f); renderer.setDrawBarOutline(false); renderer.setShadowVisible(false); /* * 纵轴相关设置 */ final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); rangeAxis.setLabelFont(new Font("Simsun", 0, 12)); /* * 图形1颜色设置 */ GradientPaint gp0 = new GradientPaint(0.5f, 0.5f, new Color(100,100,255), 0.0f, 0.0f, new Color(0, 0, 64)); renderer.setSeriesPaint(0, gp0); /* * 横轴相关设置 */ CategoryAxis domainAxis = plot.getDomainAxis(); domainAxis.setLabelFont(new Font("Simsun", Font.BOLD, 12)); //Font.BOLD字符加粗可使标签显示清楚些 domainAxis.setTickLabelFont(new Font("Simsun", Font.BOLD, 8)); domainAxis.setLowerMargin(0.03f); //这里设置横轴标签可显示行数,在数据集的横轴字符串上用\n可实现标签字符垂直 domainAxis.setMaximumCategoryLabelLines(255); domainAxis.setCategoryLabelPositionOffset(3); return chart; } /** * 程序入口 * * @param args */ public static void main(String[] args) { MyBarPic demo = new MyBarPic("FirstPic"); demo.pack(); RefineryUtilities.centerFrameOnScreen(demo); demo.setVisible(true); } /** * * 保存为文件 * * @param chart 图片对象 * @param outputPath 保存路径 * @param weight 宽 * @param height 高 */public static void saveAsFile(JFreeChart chart, String outputPath,int weight, int height) {FileOutputStream out = null;try {File outFile = new File(outputPath);if (!outFile.getParentFile().exists()) {outFile.getParentFile().mkdirs();}out = new FileOutputStream(outputPath);//保存为JPEGChartUtilities.writeChartAsJPEG(out,chart,800,600);out.flush();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (out != null) {try {out.close();} catch (IOException e) {}}}}}