2014-06-24 2 views
1

각 카테고리마다 상한값이있는 누적 막 대형 차트를 생성하려고합니다. 상한선은 각 카테고리마다 다르며 수평선으로 표시됩니다.jfreechart를 사용하여 상한선이있는 누적 막 대형 차트

필자는 누적 가로 막 대형 차트를 생성 할 수 있었지만 상한선을 나타내는 가로선이 표시되었습니다.

다음은 샘플 차트입니다.

Sample Stacked Bar Chart

는 여기에 내가 addRangeMarker를 사용하는 경우, 그것은 나에게 연속 수평 라인을 제공

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.GradientPaint; 
import java.awt.Paint; 
import java.awt.Stroke; 
import java.io.IOException; 
import java.io.OutputStream; 

import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartUtilities; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.LegendItem; 
import org.jfree.chart.LegendItemCollection; 
import org.jfree.chart.axis.SubCategoryAxis; 
import org.jfree.chart.plot.CategoryMarker; 
import org.jfree.chart.plot.CategoryPlot; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.chart.plot.ValueMarker; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.renderer.category.GroupedStackedBarRenderer; 
import org.jfree.data.KeyToGroupMap; 
import org.jfree.data.category.CategoryDataset; 
import org.jfree.data.category.DefaultCategoryDataset; 
import org.jfree.ui.GradientPaintTransformType; 
import org.jfree.ui.Layer; 
import org.jfree.ui.StandardGradientPaintTransformer; 

public class StackedBarServlet extends HttpServlet{ 
    private static final long serialVersionUID = 1L; 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 

     response.setContentType("image/png"); 

     OutputStream outputStream = response.getOutputStream(); 
     final CategoryDataset dataset = createDataset(); 
     final JFreeChart chart = createChart(dataset); 
     int width = 800; 
     int height = 350; 
     ChartUtilities.writeChartAsPNG(outputStream, chart, width, height); 

    } 
     private CategoryDataset createDataset() { 
      DefaultCategoryDataset result = new DefaultCategoryDataset(); 

      result.addValue(20.3, "Product 1 (US)", "Jan 04"); 
      result.addValue(27.2, "Product 1 (US)", "Feb 04"); 
      result.addValue(19.7, "Product 1 (US)", "Mar 04"); 
      result.addValue(20.3, "Product 1 (US)", "Apr 04"); 
      result.addValue(27.2, "Product 1 (US)", "May 04"); 
      result.addValue(19.7, "Product 1 (US)", "Jun 04"); 
      result.addValue(20.3, "Product 1 (US)", "Jul 04"); 
      result.addValue(27.2, "Product 1 (US)", "Aug 04"); 
      result.addValue(19.7, "Product 1 (US)", "Sep 04"); 
      result.addValue(20.3, "Product 1 (US)", "Oct 04"); 
      result.addValue(27.2, "Product 1 (US)", "Nov 04"); 
      result.addValue(19.7, "Product 1 (US)", "Dec 04"); 
      result.addValue(20.3, "Product 1 (US)", "Bab 04"); 
      result.addValue(27.2, "Product 1 (US)", "Lal 04"); 
      result.addValue(19.7, "Product 1 (US)", "Sha 04"); 

      result.addValue(20.3, "Product 1 (UK)", "Jan 04"); 
      result.addValue(27.2, "Product 1 (UK)", "Feb 04"); 
      result.addValue(19.7, "Product 1 (UK)", "Mar 04"); 
      result.addValue(20.3, "Product 1 (UK)", "Apr 04"); 
      result.addValue(27.2, "Product 1 (UK)", "May 04"); 
      result.addValue(19.7, "Product 1 (UK)", "Jun 04"); 
      result.addValue(20.3, "Product 1 (UK)", "Jul 04"); 
      result.addValue(27.2, "Product 1 (UK)", "Aug 04"); 
      result.addValue(19.7, "Product 1 (UK)", "Sep 04"); 
      result.addValue(20.3, "Product 1 (UK)", "Oct 04"); 
      result.addValue(27.2, "Product 1 (UK)", "Nov 04"); 
      result.addValue(19.7, "Product 1 (UK)", "Dec 04"); 
      result.addValue(20.3, "Product 1 (UK)", "Bab 04"); 
      result.addValue(27.2, "Product 1 (UK)", "Lal 04"); 
      result.addValue(19.7, "Product 1 (UK)", "Sha 04"); 

      result.addValue(20.3, "Product 1 (IND)", "Jan 04"); 
      result.addValue(27.2, "Product 1 (IND)", "Feb 04"); 
      result.addValue(19.7, "Product 1 (IND)", "Mar 04"); 
      result.addValue(20.3, "Product 1 (IND)", "Apr 04"); 
      result.addValue(27.2, "Product 1 (IND)", "May 04"); 
      result.addValue(19.7, "Product 1 (IND)", "Jun 04"); 
      result.addValue(20.3, "Product 1 (IND)", "Jul 04"); 
      result.addValue(27.2, "Product 1 (IND)", "Aug 04"); 
      result.addValue(19.7, "Product 1 (IND)", "Sep 04"); 
      result.addValue(20.3, "Product 1 (IND)", "Oct 04"); 
      result.addValue(27.2, "Product 1 (IND)", "Nov 04"); 
      result.addValue(19.7, "Product 1 (IND)", "Dec 04"); 
      result.addValue(20.3, "Product 1 (IND)", "Bab 04"); 
      result.addValue(27.2, "Product 1 (IND)", "Lal 04"); 
      result.addValue(19.7, "Product 1 (IND)", "Sha 04"); 

      result.addValue(20.3, "Product 1 (EUROPE)", "Jan 04"); 
      result.addValue(27.2, "Product 1 (EUROPE)", "Feb 04"); 
      result.addValue(19.7, "Product 1 (EUROPE)", "Mar 04"); 
      result.addValue(20.3, "Product 1 (EUROPE)", "Apr 04"); 
      result.addValue(27.2, "Product 1 (EUROPE)", "May 04"); 
      result.addValue(19.7, "Product 1 (EUROPE)", "Jun 04"); 
      result.addValue(20.3, "Product 1 (EUROPE)", "Jul 04"); 
      result.addValue(27.2, "Product 1 (EUROPE)", "Aug 04"); 
      result.addValue(19.7, "Product 1 (EUROPE)", "Sep 04"); 
      result.addValue(20.3, "Product 1 (EUROPE)", "Oct 04"); 
      result.addValue(27.2, "Product 1 (EUROPE)", "Nov 04"); 
      result.addValue(19.7, "Product 1 (EUROPE)", "Dec 04"); 
      result.addValue(20.3, "Product 1 (EUROPE)", "Bab 04"); 
      result.addValue(27.2, "Product 1 (EUROPE)", "Lal 04"); 
      result.addValue(19.7, "Product 1 (EUROPE)", "Sha 04"); 

      return result; 
     } 

     private JFreeChart createChart(final CategoryDataset dataset) { 

      final JFreeChart chart = ChartFactory.createStackedBarChart(
       "Stacked Bar", // chart title 
       "Category",     // domain axis label 
       "Value",      // range axis label 
       dataset,      // data 
       PlotOrientation.VERTICAL, // the plot orientation 
       true,      // legend 
       true,      // tooltips 
       false      // urls 
      ); 

      GroupedStackedBarRenderer renderer = new GroupedStackedBarRenderer(); 
      KeyToGroupMap map = new KeyToGroupMap("G1"); 
      map.mapKeyToGroup("Product 1 (US)", "G1"); 
      map.mapKeyToGroup("Product 1 (Europe)", "G1"); 
      map.mapKeyToGroup("Product 1 (Asia)", "G1"); 
      map.mapKeyToGroup("Product 1 (Middle East)", "G1"); 

      renderer.setSeriesToGroupMap(map); 

      renderer.setItemMargin(0.0); 
      Paint p1 = new GradientPaint(
       0.0f, 0.0f, new Color(0x22, 0x22, 0xFF), 0.0f, 0.0f, new Color(0x88, 0x88, 0xFF) 
      ); 
      renderer.setSeriesPaint(0, p1); 
      renderer.setSeriesPaint(4, p1); 
      renderer.setSeriesPaint(8, p1); 

      Paint p2 = new GradientPaint(
       0.0f, 0.0f, new Color(0x22, 0xFF, 0x22), 0.0f, 0.0f, new Color(0x88, 0xFF, 0x88) 
      ); 
      renderer.setSeriesPaint(1, p2); 
      renderer.setSeriesPaint(5, p2); 
      renderer.setSeriesPaint(9, p2); 

      Paint p3 = new GradientPaint(
       0.0f, 0.0f, new Color(0xFF, 0x22, 0x22), 0.0f, 0.0f, new Color(0xFF, 0x88, 0x88) 
      ); 
      renderer.setSeriesPaint(2, p3); 
      renderer.setSeriesPaint(6, p3); 
      renderer.setSeriesPaint(10, p3); 

      Paint p4 = new GradientPaint(
       0.0f, 0.0f, new Color(0xFF, 0xFF, 0x22), 0.0f, 0.0f, new Color(0xFF, 0xFF, 0x88) 
      ); 
      renderer.setSeriesPaint(3, p4); 
      renderer.setSeriesPaint(7, p4); 
      renderer.setSeriesPaint(11, p4); 
      renderer.setGradientPaintTransformer(
       new StandardGradientPaintTransformer(GradientPaintTransformType.HORIZONTAL) 
      ); 

      SubCategoryAxis domainAxis = new SubCategoryAxis("Product"); 
      domainAxis.setCategoryMargin(0.15); 

      CategoryPlot plot = (CategoryPlot) chart.getPlot(); 
      plot.setDomainAxis(domainAxis); 
      plot.setRenderer(renderer); 
      plot.setFixedLegendItems(createLegendItems()); 

      /* 
      * This is used to draw a vertical line 
      */ 
    /*  Stroke stroke = new BasicStroke(2.0f); 
      ValueMarker marker = new ValueMarker(100); // position is the value on the axis 
      marker.setPaint(Color.black); 
      marker.setStroke(stroke); 

      CategoryPlot plot1 = chart.getCategoryPlot(); 
      plot1.addRangeMarker(marker,Layer.FOREGROUND); */ 

      return chart; 

     } 

     private LegendItemCollection createLegendItems() { 
      LegendItemCollection result = new LegendItemCollection(); 
      LegendItem item1 = new LegendItem("US", new Color(0x22, 0x22, 0xFF)); 
      LegendItem item2 = new LegendItem("Europe", new Color(0x22, 0xFF, 0x22)); 
      LegendItem item3 = new LegendItem("Asia", new Color(0xFF, 0x22, 0x22)); 
      LegendItem item4 = new LegendItem("Middle East", new Color(0xFF, 0xFF, 0x22)); 
      result.add(item1); 
      result.add(item2); 
      result.add(item3); 
      result.add(item4); 
      return result; 
     } 
} 

누적 막대 그래프를 생성하는 내 코드입니다. 그러나 제 경우에는 각 범주마다 여러 개의 수평선이 필요합니다.

다음은 addRangeMarker가있는 샘플 이미지입니다. 사전에

enter image description here

감사합니다.

+0

아무 코드없이 말하기는 어렵습니다. 하지만 귀하의 CategoryPlot 객체에 addRangeMarker 호출이 있다고 생각합니다 – JEY

+0

귀하의 답변에 대해 JEY에게 감사드립니다. 내 질문을 편집하고 코드를 추가했습니다. 이미 addRangeMarker를 사용 했으므로 연속적인 수평선을 제공합니다. 하지만 제 경우에는 다른 범주에 대해 다른 상한선이 필요합니다. 어떤 제안이라도 대단히 감사합니다. – chandu

답변

2

수평 검은 선으로 표시 할 값이 들어있는 두 번째 데이터 집합을 만들어야합니다. LevelRenderer과 함께 해당 데이터 세트를 플롯에 추가하십시오.

+0

정말 고마워요. 이것은 도움이 :) – chandu

관련 문제