HDC調試需求開發(fā)(15萬預算),能者速來!>>>
使用Jfreechart時,我的X軸數(shù)據(jù)TimeSeries的時間跨度是從0-23點,可是我發(fā)現(xiàn)當數(shù)據(jù)中包含12點的時候,TimeSeries會自動將該時間設置為0點,難道是要將X軸設置為24小時制?但是貌似除了12點有問題外,它默認的是為24小時制的。求解!
代碼如下:
package com.sinocrm.utils; import com.sun.image.codec.jpeg.JPEGImageEncoder; import org.apache.poi.hssf.usermodel.*; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.StandardChartTheme; import org.jfree.chart.axis.DateAxis; import org.jfree.chart.labels.ItemLabelAnchor; import org.jfree.chart.labels.ItemLabelPosition; import org.jfree.chart.labels.StandardXYItemLabelGenerator; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYItemRenderer; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.data.time.*; import org.jfree.data.xy.XYDataset; import org.jfree.ui.RectangleInsets; import org.jfree.ui.TextAnchor; import sun.awt.image.codec.JPEGImageEncoderImpl; import sun.tools.jar.resources.jar_fr; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; /** * Created by ds on 14-7-11. * 創(chuàng)建一個橫坐標為時間的圖標 */ public class JfreeChartUtil { /** * 設置工廠創(chuàng)建的圖表樣式 * 此設置主要解決中文亂碼問題 */ private static void setCNTheme() { //創(chuàng)建主題樣式 StandardChartTheme standardChartTheme = new StandardChartTheme("CN"); //設置標題字體 standardChartTheme.setExtraLargeFont(new Font("隸書", Font.BOLD, 20)); //設置圖例的字體 standardChartTheme.setRegularFont(new Font("宋書", Font.PLAIN, 15)); //設置軸向的字體 standardChartTheme.setLargeFont(new Font("宋書", Font.PLAIN, 15)); //設置畫布背景為白色 standardChartTheme.setPlotBackgroundPaint(Color.white); //設置網格豎線顏色為紅色 standardChartTheme.setDomainGridlinePaint(Color.pink); //設置網格橫線顏色為紅色 standardChartTheme.setRangeGridlinePaint(Color.pink); //設置曲線圖與XY軸的距離 standardChartTheme.setAxisOffset(new RectangleInsets(0d, 0d, 0d, 0d)); //應用主題樣式 ChartFactory.setChartTheme(standardChartTheme); } /** * 創(chuàng)建一個橫坐標為時間,只有一個序列的折線圖 * * @param title 圖形的title * @param yLabel Y軸的標簽 * @param seriesName 序列的名稱(用于圖例顯示) * @param list 數(shù)據(jù)集合(object[]數(shù)據(jù)中第一個參數(shù)為時間(String或者是date),第二參數(shù)為具體數(shù)據(jù) * @return */ public static JFreeChart createTimeSeriesChart(String title, String yLabel, String seriesName, List list) { //設置畫布的默認主題 setCNTheme(); //創(chuàng)建圖形線 XYDataset dataset = createDataset(seriesName, list); //創(chuàng)建圖形 return createTimeChart(title, yLabel, dataset); } /** * 創(chuàng)建一個橫坐標為時間,只有一個序列的折線圖 * * @param title 圖形的title * @param yLabel Y軸的標簽 * @param seriesName 序列的名稱集合,與data的長度一致(用于圖例顯示) * @param data 數(shù)據(jù)按照序列集合存放(object[]數(shù)據(jù)中第一個參數(shù)為時間(String或者是date),第二參數(shù)為具體數(shù)據(jù) ) * @return */ public static JFreeChart createTimeSeriesChart(String title, String yLabel, String[] seriesName, List> data) { //設置畫布的默認主題 setCNTheme(); //創(chuàng)建圖形線 XYDataset dataset = createDataset(seriesName, data); //創(chuàng)建圖形 return createTimeChart(title, yLabel, dataset); } /** * 用給定數(shù)據(jù)集創(chuàng)建一個時間折線圖 * * @param title 圖title m * @param yLabel Y軸標簽 * @param dataset 數(shù)據(jù)集合 * @return JFreeChart
*/ private static JFreeChart createTimeChart(String title, String yLabel, XYDataset dataset) { //獲取X軸的標簽 String xLabel = "時間",format = "yyyy-MM-dd"; Number t1 = dataset.getX(0, 0),t2 = dataset.getX(0, dataset.getItemCount(0) - 1); Date d1 = new Date(t1.longValue()),d2= new Date(t2.longValue()); if(MyUtils.compareDate(d1,d2,format)==0){ xLabel += "("+MyUtils.dateToStr(d1,format)+")"; }else { xLabel += "("+MyUtils.dateToStr(d1,format)+"至"+MyUtils.dateToStr(d2,format)+")"; } JFreeChart freeChart = createTimeChart(title, xLabel, yLabel, dataset); return freeChart; } /** * 用給定數(shù)據(jù)集創(chuàng)建一個時間折線圖 * * @param title 圖title m * @param xLabel x軸標簽 * @param yLabel Y軸標簽 * @param dataset 數(shù)據(jù)集合 * @return JFreeChart
*/ private static JFreeChart createTimeChart(String title, String xLabel,String yLabel, XYDataset dataset) { JFreeChart freeChart = ChartFactory.createTimeSeriesChart(title, xLabel, yLabel, dataset); //設置X軸的時間格式 /*XYPlot xyplot = freeChart.getXYPlot(); DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis(); SimpleDateFormat sfd = new SimpleDateFormat("HH:mm"); dateaxis.setRange(MyUtils.strToDate("00:00:00","HH????ss"),MyUtils.strToDate("23:59:59","HH????ss")); dateaxis.setDateFormatOverride(sfd); xyplot.setDomainAxis(dateaxis);*/ /* 設置是否顯示數(shù)據(jù)點并且顯示具體數(shù)據(jù)信息 //設置數(shù)據(jù)樣式 XYPlot plot = freeChart.getXYPlot(); XYLineAndShapeRenderer lineRender = (XYLineAndShapeRenderer) plot.getRenderer(); //是否顯示數(shù)據(jù)點 lineRender.setBaseShapesVisible(true); //顯示數(shù)據(jù)點 XYItemRenderer itemRenderer = plot.getRenderer(); itemRenderer.setBaseItemLabelsVisible(true); itemRenderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT)); itemRenderer.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator()); plot.setRenderer(itemRenderer);*/ return freeChart; } /** * 創(chuàng)建數(shù)據(jù)集合 * * @param collection 用于裝載多序列的集合 * @param seriesName 序列名稱 * @param dataList 序列數(shù)據(jù)的集合 * @return TimeSeriesCollection
*/ private static TimeSeriesCollection createDataset(TimeSeriesCollection collection, String seriesName, List dataList) { if (collection == null) { collection = new TimeSeriesCollection(); } TimeSeries timeSeries = new TimeSeries(seriesName); Date date; double data; for (Object[] objects : dataList) { if (objects == null || objects.length < 2 || objects[0] == null || objects[1] == null) { continue; } if (objects[0] instanceof Date) { date = (Date) objects[0]; } else { date = MyUtils.strToDateTime(objects[0].toString()); } if (objects[1] instanceof Integer) { data = (Integer) objects[1] - 0.0; } else { data = Double.parseDouble(objects[1].toString()); } timeSeries.add(new Second(date), data); } collection.addSeries(timeSeries); return collection; } /** * 創(chuàng)建只有單個序列的數(shù)據(jù)集合 * * @param seriesName 序列名稱 * @param dataList 序列數(shù)據(jù)的集合 * @return TimeSeriesCollection
*/ private static TimeSeriesCollection createDataset(String seriesName, List dataList) { return createDataset(null, seriesName, dataList); } /** * 創(chuàng)建包含多個序列的數(shù)據(jù)集合 * * @param seriesName 序列名稱 * @param dataList 序列數(shù)據(jù)的集合 * @return TimeSeriesCollection
*/ private static TimeSeriesCollection createDataset(String[] seriesName, List> dataList) { TimeSeriesCollection collection = new TimeSeriesCollection(); int index = 0; List temp; for (String name : seriesName) { temp = dataList.get(index++); createDataset(collection, name, temp); } return collection; } /** * 將生成的圖表信息導出到Excel文件中 * * @param freeChart 圖表 * @param workbook Excel工作簿 g * @param sheetName 創(chuàng)建的工作區(qū)的名稱 * @throws IOException */ public static void exportChartToExcel(JFreeChart freeChart, HSSFWorkbook workbook, String sheetName) throws IOException { HSSFSheet sheet = workbook.createSheet(sheetName); HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 100, 50, (short) 1, 1, (short) 15, 25); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ChartUtilities.writeChartAsJPEG(outputStream, freeChart, 1000, 500); patriarch.createPicture(anchor, workbook.addPicture(outputStream.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG)); } /** * 將生成的圖表信息導出到Excel文件中 * * @param freeCharts 圖表集合 * @param workbook Excel工作簿 g * @param sheetName 創(chuàng)建的工作區(qū)的名稱 * @throws IOException */ public static void exportChartToExcel(JFreeChart[] freeCharts, HSSFWorkbook workbook, String sheetName) throws IOException { int row1 = 1, row2 = 25, index = 0; HSSFSheet sheet = workbook.createSheet(sheetName); HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); HSSFClientAnchor anchor; ByteArrayOutputStream outputStream; for (JFreeChart freeChart : freeCharts) { anchor = new HSSFClientAnchor(0, 0, 100, 50, (short) 1, row1, (short) 15, row2); outputStream = new ByteArrayOutputStream(); ChartUtilities.writeChartAsJPEG(outputStream, freeChart, 1000, 500); patriarch.createPicture(anchor, workbook.addPicture(outputStream.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG)); row2 += 28; row1 += 28; } } public void testExportToExcel() throws IOException { List list = new ArrayList(); Object[] objects; double[] data = {2.1, 3.2, 4.4, 3.8, 5.6, 1.2, 3, 5, 5.2, 2.4, 2.2, 1, 3, 4, 2, 1, 1, 2}; for (int i = 13; i < 23; i++) { objects = new Object[]{"2014-7-11 " + i + ":10:12", data[i - 13]}; list.add(objects); } for (int i = 0; i < 8; i++) { objects = new Object[]{"2014-7-12 " + i + ":30:12", data[i]}; list.add(objects); } JFreeChart[] freeCharts = new JFreeChart[3]; freeCharts[0] = JfreeChartUtil.createTimeSeriesChart("測試圖例1", "Y軸", "序列一", list); freeCharts[1] = JfreeChartUtil.createTimeSeriesChart("測試圖例2", "Y軸", "序列er一", list); freeCharts[2] = JfreeChartUtil.createTimeSeriesChart("測試圖例3", "Y軸", "序列3一", list); String filePath = "H:/test_file/jFreeChart/excels/test.xls"; HSSFWorkbook workbook = new HSSFWorkbook(); JfreeChartUtil.exportChartToExcel(freeCharts, workbook, "圖表"); OutputStream fos = null; try { File file = new File(filePath); if (file.getParent() != null && !file.exists()) { file.mkdirs(); } fos = new FileOutputStream(filePath); HSSFSheet sheet = workbook.createSheet("test"); for (int i = 0; i < 5; i++) { HSSFRow row = sheet.createRow(i); for (int j = 0; j < 6; j++) { HSSFCell cell = row.createCell(j); cell.setCellValue(i + ":" + j); } } workbook.write(fos); } catch (Exception e) { e.printStackTrace(); } finally { if (fos != null) { fos.close(); } } } public static void testExportToImg() throws IOException { List list = new ArrayList(); Object[] objects; double[] data = {2.1, 3.2, 4.4, 3.8, 5.6, 1.2, 3, 5, 5.2, 2.4, 2.2, 1, 3, 4, 2, 1, 1, 2}; for (int i = 12; i < 23; i++) { objects = new Object[]{"2014-7-11 " + i + ":10:12", data[i - 12]}; list.add(objects); } /*for (int i = 0; i < 8; i++) { objects = new Object[]{"2014-7-12 " + i + ":30:12", data[i]}; list.add(objects); }*/ JFreeChart jFreeChart = JfreeChartUtil.createTimeSeriesChart("測試圖例1","Y軸", "序列一", list); BufferedImage bufferedImage = jFreeChart.createBufferedImage(800, 400); OutputStream outputStream = new FileOutputStream("H:\\test_file\\jFreeChart\\images\\test.jpeg"); JPEGImageEncoder encoder = new JPEGImageEncoderImpl(outputStream); encoder.encode(bufferedImage); outputStream.flush(); outputStream.close(); } public static void main(String[] args) throws IOException { testExportToImg(); } }
運行結果如下:
12點的值默認被置為0點了,這樣的話,如果我的時間是從0點到23點的話,那么生成圖形就會因為時間重復而報錯,請各位幫我分析一下原因,O(∩_∩)O謝謝
來源:開源中國
發(fā)布時間:2014-08-04 16:30:01