2016-11-30 6 views
1

私はチャートを生成しようとしていて、次のコードでレスポンスでレンダリングしています。PNG形式でエンコードする前にJFreeChartのサイズを変更するには

Applicationクラス

@SpringBootApplication 
@EnableWebMvc 
@EnableWebSecurity 
public class JChartPoc extends WebSecurityConfigurerAdapter{ 
public static void main(String[] args) { 

    SpringApplication.run(JChartPoc.class, args); 
} 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
      .authorizeRequests() 
      .antMatchers("/**").permitAll() 
      .and() 
      .csrf().disable(); 
} 
} 

チャートは寸法500×500と完全に微細なレンダリングが、私は、これらの寸法を指定する場合には、352×90 enter image description here

として画像をレンダリングする制約を有しますグラフは切り捨てられます。 enter image description here

Iは

コントローラクラスに次のコードで折れ線グラフを生成しました。

@RestController 
public class LineChartController { 

@RequestMapping(value = "chartsPNG", method = RequestMethod.GET, produces = MediaType.IMAGE_PNG_VALUE) 
public ResponseEntity<byte[]> getPNGChart(@RequestHeader HttpHeaders headers) 
     throws Exception { 
    List<String> acceptLanguageList = headers 
      .get(HttpHeaders.ACCEPT_LANGUAGE); 
    String acceptLanguage = acceptLanguageList.get(0); 
    if (acceptLanguage.equalsIgnoreCase("en-us")) { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ChartUtilities.writeBufferedImageAsPNG(baos, createLineChart().createBufferedImage(380, 90)); 
     return new ResponseEntity<byte[]>(baos.toByteArray(), HttpStatus.OK); 
    } 
    return new ResponseEntity<byte[]>("Language Not Supported".getBytes(), 
      HttpStatus.I_AM_A_TEAPOT); 
} 

private JFreeChart createLineChart() { 
    DefaultCategoryDataset lineDataSet = new DefaultCategoryDataset(); 
    lineDataSet.setValue(122, "weekly", "3 Weeks Ago"); 
    lineDataSet.setValue(200, "weekly", "2 Weeks Ago"); 
    lineDataSet.setValue(246, "weekly", "1 Week Ago"); 
    lineDataSet.setValue(348, "weekly", "This Week"); 

    JFreeChart lineChart = ChartFactory.createLineChart(null, null, null,lineDataSet); 
    modifyChart(lineChart); 
    return lineChart; 
} 

protected void modifyChart(JFreeChart chart) { 
    // plot manipulations 
    CategoryPlot categoryPlotModifier = chart.getCategoryPlot(); 
    categoryPlotModifier.getRangeAxis().setTickLabelsVisible(false); 
    categoryPlotModifier.setOutlineVisible(false); 
    categoryPlotModifier.getRangeAxis().setVisible(false); 
    categoryPlotModifier.getDomainAxis().setTickMarkInsideLength(10); 
    categoryPlotModifier.getDomainAxis().setCategoryLabelPositionOffset(6); 
    categoryPlotModifier.getDomainAxis().setLabelFont(
      new Font("SansSerif", Font.PLAIN, 100)); 
    categoryPlotModifier.setAxisOffset(new RectangleInsets()); 
    // categoryPlotModifier.getRangeAxis().resizeRange(500.); 
    // change fonts on charts 
    categoryPlotModifier.setBackgroundPaint(Color.WHITE); 
    LineAndShapeRenderer renderer = (LineAndShapeRenderer) categoryPlotModifier 
      .getRenderer(); 
    renderer.setBaseShape(new Polygon(), true); 
    renderer.setBaseFillPaint(Color.WHITE, true); 
    renderer.setBaseShapesVisible(true); 
    renderer.setDrawOutlines(true); 
    renderer.setUseFillPaint(true); 
    // renderer.setSeriesStroke(0, new BasicStroke(1), true); 
    CategoryItemLabelGenerator labelGenerator = new StandardCategoryItemLabelGenerator(
      "{2}", new DecimalFormat("0.00")); 
    renderer.setBaseItemLabelGenerator(labelGenerator); 
    renderer.setBaseItemLabelsVisible(true, true); 
    // renderer.setBasePaint(Color.GREEN, true); 
    // why not baseColor and why can't we change the color of individual 
    // series 
    renderer.setSeriesPaint(0, ChartColor.VERY_DARK_MAGENTA, true); 
    // logger.info(Boolean.toString(renderer.getBaseShapesVisible())); 
    chart.removeLegend(); 

} 
} 

コントローラでこの行は

ChartUtilities.writeBufferedImageAsPNG(BAOを、createLineChart()createBufferedImage(380、 90)。)レンダリングするために使用される大きさを制御します。

スムージングされずに適切にサイズが変更された352 x 90 PNGイメージとしてレンダリングするためにグラフのサイズを変更する方法はありますか?

+1

90ピクセルはあまりありません。あなたの問題を示す[mcve]を含むように質問を編集してください。 [screenshots](http://meta.stackoverflow.com/questions/99734/how-do-i-create-a-screenshot-to-illustrate-a-post)および/または目的の結果の図は、問題がはっきりしない。 – trashgod

+0

@trashgodエラーを再現するために最小限のコードで質問を更新しました。 – Norbert

+1

範囲軸上で、[ここ](http://stackoverflow.com/search?tab=votes&q=%5bjfreechart%5d%20setUpperMargin)に記載されている 'setUpperMargin()'を試してみるかもしれません。 – trashgod

答えて

0

@ trashgodがsetUpperMargin()を提案した後の解決策。 setUpperMargin関数に必要な値を計算するためのプログラム的な方法があると確信しています。実装するとこの回答が更新されます。

@RestController 
public class LineChartController { 

    @RequestMapping(value = "chartsPNG", method = RequestMethod.GET, produces = MediaType.IMAGE_PNG_VALUE) 
    public ResponseEntity<byte[]> getPNGChart(@RequestHeader HttpHeaders headers) 
      throws Exception { 
     List<String> acceptLanguageList = headers 
       .get(HttpHeaders.ACCEPT_LANGUAGE); 
     String acceptLanguage = acceptLanguageList.get(0); 
     if (acceptLanguage.equalsIgnoreCase("en-us")) { 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      ChartUtilities.writeBufferedImageAsPNG(baos, createLineChart().createBufferedImage(352, 90)); 
      return new ResponseEntity<byte[]>(baos.toByteArray(), HttpStatus.OK); 
     } 
     return new ResponseEntity<byte[]>("Language Not Supported".getBytes(), 
       HttpStatus.I_AM_A_TEAPOT); 
    } 

    private JFreeChart createLineChart() { 
     DefaultCategoryDataset lineDataSet = new DefaultCategoryDataset(); 
     lineDataSet.setValue(122, "weekly", "3 Weeks Ago"); 
     lineDataSet.setValue(200, "weekly", "2 Weeks Ago"); 
     lineDataSet.setValue(246, "weekly", "1 Week Ago"); 
     lineDataSet.setValue(348, "weekly", "This Week"); 

     JFreeChart lineChart = ChartFactory.createLineChart(null, null, null,lineDataSet); 
     modifyChart(lineChart); 
     return lineChart; 
    } 

    protected void modifyChart(JFreeChart chart) { 
     Color lineChartColor = new Color(40, 54, 67); 
     // plot manipulations 
     CategoryPlot categoryPlotModifier = chart.getCategoryPlot(); 
     categoryPlotModifier.setOutlineVisible(false); 
     categoryPlotModifier.setBackgroundPaint(Color.WHITE); 

     //Axis modifications 
     categoryPlotModifier.getRangeAxis().setVisible(false); 
     categoryPlotModifier.getDomainAxis().setTickMarkInsideLength(10); 
     categoryPlotModifier.getDomainAxis().setLabelFont(new Font("SansSerif", Font.PLAIN, 1));  
     //Needed to avoid truncation of plot and squeeze of category label name during resized rendering (352X90) 
     categoryPlotModifier.getRangeAxis().setUpperMargin(.5); 
     categoryPlotModifier.getDomainAxis().setCategoryMargin(.02); 

//  Actual data point manipulations 
     LineAndShapeRenderer renderer = (LineAndShapeRenderer) categoryPlotModifier.getRenderer(); 
     renderer.setSeriesShape(0,new Ellipse2D.Double(-3, -3, 6, 6), true); 
     renderer.setBaseFillPaint(lineChartColor, true); 
     renderer.setBaseShapesVisible(true); 
     renderer.setDrawOutlines(true); 
     renderer.setUseFillPaint(true); 
     CategoryItemLabelGenerator labelGenerator = new StandardCategoryItemLabelGenerator("{2}", new DecimalFormat("0.00")); 
     renderer.setBaseItemLabelGenerator(labelGenerator); 
     renderer.setBaseItemLabelsVisible(true, true); 
     /*renderer.setBasePaint(Color.GREEN, true); 
     // why doesn't setBasePaint change the color of all shapes and lines 
     * in data points and why can't we change the color of individual series 
     */ 
     renderer.setSeriesPaint(0, lineChartColor, true); 
     // logger.info(Boolean.toString(renderer.getBaseShapesVisible())); 
     chart.removeLegend(); 

    } 
} 
関連する問題