2013-11-26 3 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)); 

Использование OUTSIDE, INSIDE или CENTER вы можете указать, где метка будет помещена уважая деталь.

+0

это не делает работы. O/p приведенного выше кода похож на мой фактический вывод, как показано выше. Но мне нужно, как и ожидаемое изображение. – Hariprasath

+0

Позиция метки относительно элемента, поэтому я думаю, что их невозможно записать в нижней части диаграммы и над осью. Вы можете попытаться объединить значение элемента в значение категории и попробовать строку прерывания с помощью 'categoryAxis.setMaximumCategoryLabelLines (2);' но это не гарантирует хороший результат. –

+0

Я нашел ответ. Пожалуйста, обратитесь к нему и предложите мне, если вы обнаружили какую-либо ошибку. – Hariprasath

Смежные вопросы