2013-11-26 2 views
2

내 응용 프로그램에 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 방법을 사용하여 기본 긍정적 인 품목 레이블 위치를 설정할 수 있습니다. 이 시도 :

라벨이 항목을 존중 배치 될 위치를 지정할 수 있습니다 OUTSIDE, INSIDE, 또는 CENTER 사용
renderer.setBasePositiveItemLabelPosition(
        new ItemLabelPosition(ItemLabelAnchor.OUTSIDE8, TextAnchor.CENTER)); 

.

+0

이 나던 작품. 위 코드의 o/p는 위에 표시된 실제 출력과 같습니다. 하지만 내 기대되는 이미지처럼 필요합니다 – Hariprasath

+0

레이블의 위치는 항목에 상대적이므로 차트 하단과 축 위에 쓸 수는 없다고 생각합니다. 항목의 값을 범주 값에 연결하고'categoryAxis.setMaximumCategoryLabelLines (2); '와 함께 중단 줄을 시도 할 수는 있지만 좋은 결과를 보장하지는 않습니다. –

+0

답변을 찾았습니다. 그것을 참조하고 실수를 발견하면 저에게 제안하십시오 – Hariprasath

관련 문제