2013-11-26 24 views
2

Im對我的應用程序使用jfree圖表。我需要一個圖表,筆劃點值出現在x軸標籤上方。如何在jfree折線圖中添加註釋

預期

enter image description here

,我需要去除刻度標記中的值(54%和2008)之間。 我曾嘗試下面的代碼來獲取註釋,

final DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 

     dataset.addValue(23, "Line", "2008"); 
     dataset.addValue(145, "Line", "2009"); 
     dataset.addValue(245, "Line", "2010"); 
     dataset.addValue(322, "Line", "2011"); 
     final JFreeChart chart = ChartFactory.createLineChart(
       "", // chart title 
       "", // domain axis label 
       "", // range axis label 
       dataset, // data 
       PlotOrientation.VERTICAL, // orientation 
       false, // include legend 
       false, // tooltips 
       false // urls 
       ); 

     chart.setBackgroundPaint(Color.WHITE); 
     chart.setBorderVisible(true); 
     chart.setBorderPaint(Color.decode("#EEEEEE")); 
     chart.setPadding(new RectangleInsets(10, 10, 5, 5)); 

     final CategoryPlot plot = (CategoryPlot) chart.getPlot(); 
     plot.setBackgroundPaint(Color.WHITE); 
     plot.setRangeZeroBaselinePaint(Color.RED); 
     plot.setOutlineVisible(false); 
     plot.setRangeGridlinePaint(Color.white); 
     plot.setDomainGridlinePaint(Color.BLUE);   

     final CategoryAxis categoryAxis = (CategoryAxis) plot.getDomainAxis(); 
     categoryAxis.setAxisLineVisible(false); 
     categoryAxis.setTickMarksVisible(false); 
     categoryAxis.setTickLabelFont(new java.awt.Font("Arial", java.awt.Font.PLAIN, 8));   

     final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); 
     rangeAxis.setVisible(false); 
     rangeAxis.setLabelPaint(Color.BLUE); 
     rangeAxis.setRangeWithMargins(21, 600); 

     DecimalFormat format = new DecimalFormat("###,###"); 

     StandardCategoryItemLabelGenerator labelGenerator = new StandardCategoryItemLabelGenerator("{2}", format); 
     final LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer(); 
     renderer.setBaseShapesVisible(true); 
     renderer.setBaseShapesFilled(true); 
     renderer.setSeriesStroke(0, new BasicStroke(1.5f)); 
     renderer.setSeriesItemLabelsVisible(0, true); 
     renderer.setBaseItemLabelGenerator(labelGenerator); 
     renderer.setBaseItemLabelFont(new java.awt.Font("Arial", java.awt.Font.PLAIN, 9)); 
     Shape circle = new Ellipse2D.Double(-2, -2, 4, 4); 
     renderer.setSeriesShape(0, circle);   
     plot.getRenderer().setSeriesPaint(0, Color.decode("#0066CC"));   
     //  CategoryAnnotation categoryAnnotation=new CategoryLineAnnotation(Male1, 248, Male2, 216, null, null); 
//  XYLineAnnotation annotation=new XYLineAnnotation(8, 0, 8, 24, new BasicStroke(2.0f), Color.blue); 
//  plot.addAnnotation((CategoryAnnotation) annotation); 

     try { 
      ChartUtilities.saveChartAsPNG(new File("E:\\jfreeLinechart.png"), chart, 290, 95); 
      System.out.println("=====chart====="); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

從上面的代碼即時得到如下圖

實際

enter image description here

請幫我拿到jfree折線圖中的預期圖像。

回答

1

我找到了解決方案。對於預期的圖表,您必須創建虛擬系列值。並使用此代碼。

public String createLineChart() throws IOException { 
     System.out.println("Line chart"); 
     final DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 

     dataset.addValue(14, "Line", "2008"); 
     dataset.addValue(18, "Line", "2009"); 
     dataset.addValue(22, "Line", "2010"); 

     dataset.addValue(13, "Line2", "2008"); 
     dataset.addValue(13, "Line2", "2009"); 
     dataset.addValue(13, "Line2", "2010"); 
     final JFreeChart chart = ChartFactory.createLineChart(
       "", // chart title 
       "", // domain axis label 
       "", // range axis label 
       dataset, // data 
       PlotOrientation.VERTICAL, // orientation 
       false, // include legend 
       false, // tooltips 
       false // urls 
     ); 

     chart.setBackgroundPaint(Color.WHITE); 
     final CategoryPlot plot = (CategoryPlot) chart.getPlot(); 
     plot.setBackgroundPaint(Color.WHITE); 
     plot.setRangeZeroBaselinePaint(Color.RED); 
     plot.setOutlineVisible(false); 
     plot.setRangeGridlinePaint(Color.white); 
     plot.setDomainGridlinePaint(Color.BLUE); 

     final CategoryAxis categoryAxis = (CategoryAxis) plot.getDomainAxis(); 
     categoryAxis.setAxisLineVisible(false); 
     categoryAxis.setTickMarksVisible(false); 
     categoryAxis.setMaximumCategoryLabelLines(2); 

     final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); 
     rangeAxis.setVisible(false); 
     rangeAxis.setLabelPaint(Color.BLUE); 
     rangeAxis.setRange(13, 23); 
     rangeAxis.setTickUnit(new NumberTickUnit(20)); 

     final LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer(); 
     renderer.setBaseShapesVisible(true); 
     renderer.setBaseShapesFilled(true); 
     renderer.setSeriesStroke(0, new BasicStroke(2.0f)); 
     renderer.setSeriesItemLabelsVisible(1, Boolean.TRUE); 
     Shape circle = new Ellipse2D.Double(-3, -3, 6, 6); 
     renderer.setSeriesShape(0, circle); 
     renderer.setSeriesShape(1, null); 
     renderer.setBaseItemLabelGenerator(new CustomLabelGenerator()); 
//  MyGenerator generator=new MyGenerator(); 
//  renderer.setSeriesItemLabelGenerator(1, generator); 
     renderer.setBaseItemLabelsVisible(true); 
     plot.getRenderer().setSeriesPaint(0, Color.decode("#0066CC")); 
     plot.getRenderer().setSeriesPaint(1, Color.WHITE); 

//  ValueAxis range = plot.getRangeAxis(); 
//  range.setUpperMargin(0.20); 
     try { 
      ChartUtilities.saveChartAsPNG(new File("/media/root/668ea9a3-d26c-4896-a2f0-756dfb532756/jfreeLinechart.png"), chart, 400, 200); 
      System.out.println("=====chart====="); 
     } catch (IOException e) { 
      System.out.println("Line chart :" + e); 
     } 
     xyLineChart(); 
     return "success"; 
    } 

    static class CustomLabelGenerator extends AbstractCategoryItemLabelGenerator implements CategoryItemLabelGenerator { 

      public CustomLabelGenerator() { 
       super("", NumberFormat.getCurrencyInstance()); 
      } 

      public String generateLabel(CategoryDataset dataset, int series, int category) { 

       String result = null; 
       if (series == 1) { 
        series = 0; 
        Number value = dataset.getValue(series, category); 
        result = value.toString(); 
        System.out.println("===========result===============" + series + "====category======" + category); 
       } 
       return result; 
      } 

      public String generateRowLabel(CategoryDataset arg0, int arg1) { 
       return null; 
      } 

      public String generateColumnLabel(CategoryDataset arg0, int arg1) { 
       return null; 
      } 
     } 

你會得到相應的圖表......

+0

它看起來很好的解決方案!使用白色或使用jfreechart隱藏/顯示系列是很常見的做這種事情 –

2

使用方法setBasePositiveItemLabelPosition您可以設置基本正項目標籤的位置。試試這個:

renderer.setBasePositiveItemLabelPosition(
        new ItemLabelPosition(ItemLabelAnchor.OUTSIDE8, TextAnchor.CENTER)); 

使用OUTSIDEINSIDE,或者CENTER您可以指定該標籤將被放置尊重的項目。

+0

這並不作品。上面的代碼的o/p就像我上面顯示的實際輸出。但我需要像我期望的圖像 – Hariprasath

+0

標籤的位置是相對於項目,所以我認爲它是不可能寫在圖表的底部和軸上方。你可以嘗試將項目的值連接到類別值,並用'categoryAxis.setMaximumCategoryLabelLines(2);'嘗試一個斷行;但它不能保證一個好的結果 –

+0

我找到了答案。請參考它,並建議我,如果你發現任何錯誤 – Hariprasath