2013-04-19 2 views
2

이것은 약간 이상합니다. JFreeChart에서 차트를 생성하고 .svg 파일로 저장하는 코드가 있습니다. 이클립스의 시험 방법을 통해 코드를 실행하면 다음과 같이, 그것은 출력 :JFreeChart 축은 실행 환경에 따라 다르게 나타납니다.

Graph from Test Method

주 좋은 LogAxis 레이블입니다. I 톰캣의 컨트롤러에서 동일한 코드를 실행하는 경우 지금

, I 다음 이미지 : 아크가 동일하면서

Graph as created from Tomcat

참고 번째 이미지 축이 더 이상 게재 것을 멋진 로그 진행. 두 번째 경우에는 틱 마크가 멋진 로그를 보여줄뿐만 아니라 잘못된 것입니다.

다음은 그래프를 생성하는 컨트롤러 코드입니다. 이

 


    private static final String pn = "T495D477M004ATE100"; 

     private File generateMaxCurrentVoltageGraph() 
      throws IOException, InitializationException, ClassNotFoundException 
     { 
      String title = "Current and Voltage - " + pn + " @ 25\u00B0C with 2 VDC Bias"; 
      String frequencyAxisLabel = "Frequency (Hz)"; 
      String valueAxisLabel1 = "Max Current (ARMS)"; 
      String valueAxisLabel2 = "Max Voltage (VRMS)"; 

      List datasets = createVoltageCurrentDatasets(); 
      JFreeChart chart = ChartFactory.createXYLineChart(title, frequencyAxisLabel, valueAxisLabel1, null, PlotOrientation.VERTICAL, true, false, false); 
      chart.setBackgroundPaint(Color.white); 

      final XYPlot plot = chart.getXYPlot(); 
      plot.setDataset(0, datasets.get(0)); 
      plot.setDataset(1, datasets.get(1)); 

      plot.setBackgroundPaint(Color.white); 
      plot.setDomainGridlinePaint(Color.lightGray); 
      plot.setRangeGridlinePaint(Color.lightGray); 

      final XYLineAndShapeRenderer renderer1 = new XYLineAndShapeRenderer(); 
      renderer1.setSeriesShapesVisible(0, false); 
      renderer1.setSeriesShapesVisible(1, false); 
      renderer1.setSeriesPaint(0, Color.red); 
      plot.setRenderer(0, renderer1); 
      final XYLineAndShapeRenderer renderer2 = new XYLineAndShapeRenderer(); 
      renderer2.setSeriesShapesVisible(0, false); 
      renderer2.setSeriesShapesVisible(1, false); 
      renderer2.setSeriesPaint(0, Color.blue); 
      plot.setRenderer(1, renderer2); 

      final LogAxis rangeAxis1 = new LogAxis(valueAxisLabel1); 
      rangeAxis1.setStandardTickUnits(LogAxis.createLogTickUnits(Locale.ENGLISH)); 
      rangeAxis1.setRange(0.1, 10.0); //100 mA to 10 A 
      rangeAxis1.setNumberFormatOverride(new UnitNumberFormat(UnitValue.AMPS)); 
      rangeAxis1.setLabelPaint(Color.red); 
      plot.setRangeAxis(0, rangeAxis1); 

      final LogAxis rangeAxis2 = new LogAxis(valueAxisLabel2); 
      rangeAxis2.setStandardTickUnits(LogAxis.createLogTickUnits(Locale.ENGLISH)); 
      rangeAxis2.setRange(0.01, 10.0); //10 mV to 10 V 
      rangeAxis2.setNumberFormatOverride(new UnitNumberFormat(UnitValue.VOLTS)); 
      rangeAxis2.setLabelPaint(Color.blue); 
      plot.setRangeAxis(1, rangeAxis2); 
      plot.mapDatasetToRangeAxis(1, 1); 

      final LogAxis domainAxis = new LogAxis(frequencyAxisLabel); 
      domainAxis.setStandardTickUnits(LogAxis.createLogTickUnits(Locale.ENGLISH)); 
      domainAxis.setRange(100, 10000000); //100Hz to 10MHz 
      domainAxis.setNumberFormatOverride(new UnitNumberFormat(UnitValue.HERTZ)); 
      plot.setDomainAxis(domainAxis); 

      LegendTitle legendTitle = chart.getLegend(); 
      LegendTitle legendTitleNew = new LegendTitle(plot, new ColumnArrangement(), new ColumnArrangement()); 
      legendTitleNew.setPosition(legendTitle.getPosition()); 
      legendTitleNew.setBackgroundPaint(legendTitle.getBackgroundPaint()); 
      legendTitleNew.setBorder(0.25, 0.25, 0.25, 0.25); 
      chart.removeLegend(); 
      chart.addLegend(legendTitleNew); 

      chart.getTitle().setBackgroundPaint(Color.lightGray); 
      chart.getTitle().setFont(rangeAxis1.getLabelFont()); 
      chart.getTitle().setExpandToFitSpace(true); 
      chart.setPadding(new RectangleInsets(10, 10, 10, 10)); 

      File graphFile = File.createTempFile("CurrentVoltageGraph", ".svg"); 

      return writeGraphFile(chart, graphFile); 
     } 


     private List createVoltageCurrentDatasets() 
      throws FileNotFoundException, IOException, InitializationException, ClassNotFoundException 
     { 
      List datasets = new ArrayList(); 
      XYSeriesCollection dataset1 = new XYSeriesCollection(); 
      XYSeriesCollection dataset2 = new XYSeriesCollection(); 
    //  String sourceDataPath = "/etc/intellidata/prototype/CurrentVoltageTestGraphData.csv"; 
      String sourceDataPath = "C:\\Users\\BrianTrezise\\Desktop\\Downloads\\CurrentVoltageTestGraphData.csv"; 
      CSVRowIterator csv = new CSVRowIterator(new FileInputStream(sourceDataPath)); 
      XYSeries series1 = new XYSeries("T495D477M004ATE100-I"); 
      XYSeries series2 = new XYSeries("T495D477M004ATE100-V"); 

      while(csv.hasNext()) 
      { 
      Row row = csv.next(); 
      String frequencyString = (String) row.get("Frequency"); 
      String currentString = (String) row.get("Current"); 
      String voltageString = (String) row.get("Voltage"); 

      Double frequency = decodeValue(frequencyString); 
      Double current = decodeValue(currentString); 
      Double voltage = decodeValue(voltageString); 

      series1.add(frequency, current); 
      series2.add(frequency, voltage); 
      } 

      dataset1.addSeries(series1); 
      datasets.add(dataset1); 
      dataset2.addSeries(series2); 
      datasets.add(dataset2); 

      return datasets; 
     } 


     private File writeGraphFile(JFreeChart chart, File graphFile) 
      throws IOException 
     { 
      // Get a DOMImplementation and create an XML document 
      DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation(); 
      Document document = domImpl.createDocument(null, "svg", null); 

      // Create an instance of the SVG Generator 
      SVGGraphics2D svgGenerator = new SVGGraphics2D(document); 
      svgGenerator.setSVGCanvasSize(new Dimension(720, 470)); 

      // draw the chart in the SVG generator 
      Rectangle bounds = new Rectangle(10, 10, 700, 450); 
      chart.draw(svgGenerator, bounds); 

      // Write svg file 
      OutputStream outputStream = new FileOutputStream(graphFile); 
      Writer out = new OutputStreamWriter(outputStream, "UTF-8"); 
      svgGenerator.stream(out, true /* use css */); 
      outputStream.flush(); 
      outputStream.close(); 

      return graphFile; 
     } 

 

아무도 그것을 실행 할 때보다 톰캣에서 다르게 행동하는 이유에 관해서는 어떤 아이디어가 있습니까

빠른 프로토 타입이기 때문입니다 - 몇 가지가 정상적으로되지 않을 것 방법으로 고정 배선되어 있습니다 Eclipse에서 직접? 참고 : 동일한 작업을 수행하는 두 번째 그래프도 생성하고 있습니다. 테스트 메소드에서 잘 작동합니다. Tomcat 컨트롤러와 함께 실행되는 동일한 코드에는 로그 코드 사이에 이상한 잘못된 눈금이 있습니다.

답변

1

글쎄, 여전히 이클립스와는 다른 동작을하는 이유를 모르겠습니다. 즉, (각 데이터 축에 대해) 다음 코드 줄을 삽입하면 문제가 해결되는 것 같습니다.

rangeAxis1.setAutoTickUnitSelection (false);

아무도 그러나 나는 환경의 차이에 대해 언급 할 수

+1

감사 것이에 대한 추가 정보를 추가 할 수 있지만 겉으로는 무작위 간격의 작은 눈금 레이블 간격을 만드는 피할 JFreeChart가 위의 코드의 회선을 사용 할 수 있습니다. 정말 고마워! – ggkmath

+0

@ggkmath 대환영! upvote 주셔서 감사합니다 :) – StormeHawke

관련 문제