나의 이야기

[스크랩] JFreeChart 퀵레퍼런스

멋진수야 2009. 7. 28. 21:47

제목 : JFreeChart로 동적 그래프를 만들어 보자.

일시 : 2003년 12월 13일.
발표 : 제1회 UnJ 자유 세미나 2주제.
강사 : 유동환(ideamaiden@empal.com)

 

세미나의 목표 : 순수 자바로 작성된 오픈소스 차트 API인 JFreeChart에 관한 기본 개념을 알아보고 기본적인 차트를 생성해본다. 또한 사용자 이벤트에 따라 동적으로 데이터를 갱신할 수 있는 타임시리즈 차트를 만들어 본다. 예제를 중심으로 각 차트의 세부 내용을 분석한다.  

일러 두기
    - ANT 1.4.1을 사용하여 컴파일.
? - JFreeChart 0.9.13을 적용.  
? - 는 jfreechart-demo-0.9.13.jar를 의미.

1. JFreeChart API에 대해서 알아보자.  

 자바로 만들어진 차트API가 여럿 존재한다. 지금까지 알려진 자바로 된 차트 API는 다음과 같다.

    •  Free라는 단어에 매료되었기 때문일까? 그중에서 이번에는 jfree.org (www.jfree.org)에서 제작하여 오픈소스로 제공하는 JFreeChart를 살펴본다. 왜 이것을 선택하였는가? 가장 큰 이유는 첨부된 DEMO 프로그램을 손쉽게 가져다 쓸 수 있도록 잘 분리가 되어있으며 생성된 차트도 모양이 이뻐서 큰 변경없이 프로젝트에 그대로 적용할 수 있으리라 생각되었기 때문이다. 

       

      A. JFreeChart의 기본 클래스 구조

          1. org.jfree.chart.JFreeChart

             - JFreeChart의 기본 클래스이다. 자바2D로 구현되어 있으며 현재 바 차트 , 라인 차트 , 파이 차트 , XY 플롯(시간에 따른 XY그래프)를 지원한다. JFreeChart클래스는 제목을 나타내는 AbstractTitle객체 , Legend객체 , Plot객체 그리고 DataSet객체로 이루어져 있다.

          2. org.jfree.chart.AbstractTitle

              - 차트의 제목을 나타낸다. 하위 클래스로 ImageTitle , LegendTitle , TextTitle로 구성되어 있다.

          3. org.jfree.chart.Legend

              - 차트에 포함된 시리즈(series)의 이름과 그 표현방식을 구성한다.

          4. org.jfree.chart.plot.Plot

              - JFreeChart클래스는 축과 데이터를 그리는(draw) 작업을 Plot에게 위임하였다. 대표적인 하위 클래스로는 CategoryPlot , PiePlot , XYPlot등이 있다.

          5. org.jfree.data.DataSet

              - 차트의 데이터를 담당한다. 대표적인 구현 클래스로는 DefaultPieDataSet , TimeSeriesCollection등이 있다.

          6. org.jfree.chart.ChartFactory

              - 차트를 생성을 위한 메소드를 제공한다. 예를 들어 pie차트를 만들기 위해서는 creatPieChart() 메소드를 사용한다.

          7. org.jfree.chart.ChartPanel

              - 차트를 생성한 후 JFreeChart 클래스를 ChartPanel에 넣어 스윙 컴포넌트로 사용할 수 있다.

       

      2. 데모 프로그램을 통해 기본적인 차트를 만들어 보자.

       

      A.  데모 프로그램의 시연

       를 가볍게 클릭해보자.

       여기 있는걸 가볍게 클릭해보면 JFreeChart의 모든 기능을 한눈에 알 수 있다. 그리고 여기에 나온 소스들은 src/org/jfree/chart/demo 폴더를 보면 모두 찾아볼 수 있다.

       우리는 이중에서 기본적인 몇 개의 예제를 살펴볼 것이다.

       

      A.  Pie Chart 제작

      제일 간단한 파이 차트로 몸을 풀어 보자. 동봉한 runPie.bat를 실행시키면 다음과 같은 화면을 얻을 수 있다.

       첨부한 PieChartDemo1.java를 살펴보자. 제 생각에는 이 코드가 가장 가독성이 좋은거 같네요.

       다음과 같이 데이터를 삽입하였다.  

       ChartFactory를 이용하여 파이 차트를 생성한다. t

       

       바탕화면은 노랑색으로 한다. 표시는 이름과 백분율을 포함하여 작성한다. 만약 데이터가 없을 때는 "No data available"을 표시한다.

       

       만든 차트를 JFrame으로 나타내기 위해 JPanel을 상속한 ChartPanel객체를 생성한다. 크기는 (500, 270)으로 한다.

       

       이제 main()함수에서 데모 객체를 생성하고 RefineryUtilities 객체를 사용하여 프레임을 화면의 정중앙에 배치하여 데모를 완성한다.

       

      B. XY 차트 만들기

      이번에도 가볍게 runArea.bat를 실행시켜 보자.

      자세한 내용은 AreaChartDemo.java를 살펴보면서 알아보자.

       3개의 시리즈를 사용하고 X축을 Type이라고 명명하여 데이터를 구성한다.

       

       배경색을 노랑으로 하고 , 부제목(subtitle)을 SansSerif체로 설정하여 "An area chart demonstration"이라고 하였습니다.

       그리고 X축의 Type을 세로로 배치하였습니다.

      C. Bar 차트 만들기

       Bar차트 데모는 runBar.bat를 실행시켜 보면 됩니다.

       BarChartDemo2.java 소스코드를 살펴보죠.  

       다음과 같이 2개의 그룹을 묶어 각각 3개의 시리즈에 값을 넣습니다.

       Bar 차트를 생성합니다. 만약 수직축으로 작성하고자 한다면 PlotOrientation.VERTICAL을 사용하시면 됩니다.

       

       마지막으로 legend를 빼고 , 수직축으로 데이터를 정렬해보겠습니다. 결과는 다음과 같습니다. 이게 더 자연스러운지도 모르겠네요.

       

      3. 동적인 차트를 만들어 보자  

       이제 오늘의 주제인 시간축으로 동적으로 갱신이 되는 차트를 만들어보겠습니다.

       runDy.bat를 실행시키세요.  이것은 버튼의 ActionEvent를 받아서 랜덤 데이터를 차트에 뿌려주는 예제입니다. 각 시리즈 1,2만을 갱신할 수도 있고 동시에 갱신도 가능합니다.

       

       소스를 살펴보죠.

       데이터 갱신 단위를 밀리 세컨드(ms)로 조정하고 시간의 흐름에 따른 X축을 의미하는 TimeSeries객체를 사용하였다. 2개의 시리즈를 표현하도록 구성되어 있다.

       X축(DomainAxis)을 동적으로 변경 가능하도록 조정하고 X축의 시간 길이는 60초로 한다. 60000.0 인 이유는 단위가 밀리 세컨드이기 때문이다.

       시리즈2의 설정을 한다. RangeAxis는 Y축을 의미한다.  

       요기가 데이터를 갱신하는 부분입니다. dataset에 포함된 TimeSeries에 직접 갱신을 하게 된다.

       

       간단하죠? ^^

      정리

       이 세미나을 들으시고 프로젝트시 간단하게 차트를 만들 필요가 있을 경우 JFreeChart에 포함된 데모 프로그램을 사용하여 최단시간에 원하는 차트를 만들 수 있기를 바랍니다.  

       다음과 같은 차트를 다루었습니다.

          1. 파이 차트

          2. 바 차트

       

      이문서는 자바까페 유동환님 세미나 자료입니다. 혼자 보기 아까워 올려놓긴 했지만 , 원작자의 불허가 있으면 바로 삭제조치 하겠습니다. ^^*

      제목 : JFreeChart로 동적 그래프를 만들어 보자.

      일시 : 2003년 12월 13일.
      발표 : 제1회 UnJ 자유 세미나 2주제.
      강사 : 유동환(ideamaiden@empal.com)

       

      세미나의 목표 : 순수 자바로 작성된 오픈소스 차트 API인 JFreeChart에 관한 기본 개념을 알아보고 기본적인 차트를 생성해본다. 또한 사용자 이벤트에 따라 동적으로 데이터를 갱신할 수 있는 타임시리즈 차트를 만들어 본다. 예제를 중심으로 각 차트의 세부 내용을 분석한다.  

      일러 두기
          - ANT 1.4.1을 사용하여 컴파일.
      ? - JFreeChart 0.9.13을 적용.  
      ? - 는 jfreechart-demo-0.9.13.jar를 의미.

      1. JFreeChart API에 대해서 알아보자.  

       자바로 만들어진 차트API가 여럿 존재한다. 지금까지 알려진 자바로 된 차트 API는 다음과 같다.

      • the PtPlot project (UC Berkeley copyright);
      • the JOpenChart project (LGPL);

            3. XY 차트(에리어 차트)

            4. 동적 차트.

         

        집필 후기

         원래 이 세미나의 목적은 회사에서 미니 프로젝트를 하면서 "동적 그래프"를 사용할 일이 생겼는데 원하는 성능이 나오지 않아서 고민하는 것을 정리하는데 있었습니다. 결국 JFreeChart의 소스를 고치는 지경에 이르렀는데  이 여정을 소개하려니 1회분으로는 무리가 있는 듯하네요.

         실질적인 쓰임새로는 먼저 위와같은 퀵-레퍼런스를 훑어보시는게 더 유용할 거 같습니다.

         아참~ 소스코드 잘 짰구나 하는 느낌 받았습니다. 나중에 기회가 되면 이부분도 마저 정리해보죠. ^^

        자바카페(JavaCafe.Or.Kr)

    • 덧글쓰기 | 엮인글 쓰기 이 포스트를.. 이 포스트 담기 -->
      [펌] Jfree Chart 이용하기 | JFreeChar 2005/02/18 11:29
      http://blog.naver.com/fdrake/10260436
      출처블로그 : 하하맨의 잡동사니
      [자바팁 연재-3]JFreeChart를 활용해서 서블릿에서 그래프를 그려봅시다.

      [자바팁 연재-3]JFreeChart를 활용해서 서블릿에서 그래프를 그려봅시다.

       JFeeChart는 챠트 그림을 만드는데 특화한 고기능 라이브러리입니다. 물론, J2SE에는 Java2D라는 그림
      생성용의 API가 준비되어 있으므로, JFeeChart같은 라이브러리를 쓰지않고 써도 최소한 그림을 그리는 정도는
      가능합니다만, 기둥그래프같은 비교적 간단한 챠트를 만들기에도, 우선 좌표의 계산등의 세밀한 계산이나
      번잡한 코딩를 해야만 합니다.

       그러나, JFreeChart를 사용하는 것으로, 그래프의 기본이 되는 데이터 세트를 넘겨주는 것만으로,
      기둥그래프나 원 그래프, 버블 챠트, 레이다 챠트, 주식차트 같은 여러가지 챠트를, 간단히 작성할 수
      있습니다. 기본적인 그림그리기는 전부 JFeeChart가 대신해 주니까, 프로그래머는 좌표계산 같은 저 레벨의
      부분에 신경 쓰지 않아도 됩니다. 또, 예를 들어, 한번 작성한 챠트를 기둥챠트로 부터 둥근챠트에 변환하고
      싶다고 생각한 경우에도 , 클래스나 메소드를 바꿔 넣기 만 하면 되기 때문에, 비교적 간단히 바꿀 수 있습니다.
      여러분도 이번 기회에 비주얼 챠트를 사용해서 효과적인 페이지를 작성해 보세요.

      ■해설
      (1)JFreeChart라이브러리를 인스톨 합니다.
       JFreeChart를 이용하기에 앞서, 우선 라이브러리를 인스톨해야만 합니다. JFreeChart라이브러리는,
      아래의 사이트에서 받습니다.

      http://www.jfree.org/jfreechart/

       다운로드파일 jfreechart-X.X.X.zip(X는 버전)을 풀면, 여러가자 파일이 나옵니다.
      그중에서 jfreechart-X.X.X.jar, jcommon-X.X.X.jar를 어플리케이션 밑의 /WEB-INF/lib 폴더에 복사해 주세요.

      (2)서블릿 클래스를 정의합니다.
       이번에는,  우선 클래스 내부에 지정한 배열값으로, 원 그래프를 작성해 보는 것으로 합니다.
      당연히, 배열값을 얻어오는 장소는, 일반적으로 DB등으로 부터 값을 얻어 옵니다.

      ChartServlet.java

      import! java.io.IOException;

      import! javax.servlet.ServletException;
      import! javax.servlet.ServletOutputStream;
      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.data.general.DefaultPieDataset;

      public class ChartServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
          // 그래프 생성용 데이터를 준비합니다.
          String[][] aryDat =
              {
                  {"A", "3000" },
                  {"B", "10000"},
                  {"C", "15000"},
                  {"D", "3500" },
                  {"E", "4500" }
              };
          // 원 그래프를 기본으로 하는 데이터 셋트를 준비합니다.
         
      DefaultPieDataset objDpd=new DefaultPieDataset();
          // 데이타 셋트에 항목명과 값을 순서대로 넣습니다.
        
        for(int i=0;i<aryDat.length;i++){
            objDpd.setValue(aryDat[i][0],Integer.parseInt(aryDat[i][1]));
          }
          // 3차원 원 그래프를 생성( 첫번째 인수로 부터 그래프 타이틀,
          // 데이터 셋트, 판례를 지정 할까, 도구 타이프를 표시할까,
          // URL을 동적으로 생성할까를 지정합니다.)
          JFreeChart objCht=ChartFactory.createPieChart3D(
            "ABCDE....",objDpd,true,false,false);   

          // 바이너리 출력 스트림에 JPEG형식으로 그래프를 출력 (600×400픽셀)
        
        response.setContentType("image/jpeg");
          ServletOutputStream objSos=response.getOutputStream();
          ChartUtilities.writeChartAsJPEG(objSos,objCht,600,400);
        }
      }

      (3)디플로이 디스크립터에 서블릿 클래스 등록합시다.
       여기서 만든 서블릿 클래스를 실행하기에 앞서, 미리 디플로이 디스크립터에 대해, 서블릿의 등록을 할
      필요가 있습니다. <url-pattern>요소에 /chart.jpg 같이 지정하는 것으로, 서블릿 클래스를 마치 동적인
      JPEG파일 인것 처럼 보여주는 것도 할 수 있습니다.

      web.xml
      <?xml version="1.0" encoding="UTF-8" ?>
      <web-app xmlns="
      http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="
      http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
      http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"
        version="2.4">
        …중략…
        <servlet>
          <servlet-name>ChartServlet</servlet-name>
          <servlet-class>ChartServlet</servlet-class>
        </servlet>
        <servlet-mapping>
          <servlet-name>ChartServlet</servlet-name>
          <url-pattern>/chart.jpg</url-pattern>
        </servlet-mapping>
        …중략…
      </web-app>

       이 코드의 실행 결과는,  제일 처음 그림처럼 됩니다.

       로직의 상세한 흐름에 대해서는, 코드 내의 주석을 참조로, 여기서는 JFreeChart를 이용해서 코딩의 간략한 흐름을
      파악해 주세요.

      1. 데이타 세트의 생성(빨간 부분)
      2. 챠트의 생성(보라색 부분)
      3. JPEG그림으로 클라이언트에 출력(녹색 부분)

        이것은, 원 그래프이외의 차트를 만드는 경우에도 공통적인 흐름입니다. 이 흐름을 이해하고 있으면,
      나중에 이용하는 클래스를 바꿔 넣는 것만으로, 여러가지 챠트를 만들수 있습니다. JFreeChart라이브러리에
      속하는 여러가지 클래스의 대해서는 아래를 참조 해주세요..

      http://www.jfree.org/jfreechart/javadoc/

      출처:http://www.atmarkit.co.jp/fjava/javatips/092jspservlet036.html

      덧글쓰기 | 엮인글 쓰기 이 포스트를.. 이 포스트 담기 -->
      [펌] jCharts Guide | JFreeChar 2005/02/18 11:28
      http://blog.naver.com/fdrake/10260413
      출처블로그 : siva6 home

      들어가기
          웹 애플리케이션의 많은 곳에서 조회된 data를 그래프 형태로 볼려고 합니다.
          물론, 단순한 막대 그래프 정도는 HTML TAG만을 이용해서도 충분히 가능하지만, 그래프의 형태가 복잡해 질 수록 엄청난 노력을 필요로 하게 됩니다.
          그래서, 많은 솔루션이 나오게 되었고 간단하게는 위에서 말하는 HTML TAG를 사용하거나, IE전용인 곳에서는 VML을 사용하거나, 아니면 돈 좀 있는 곳에서는 OZ나 Insight같은 것이나 그 밖의 상용 툴을 사용하기도 합니다.
          그런데 이러한 필요성이 생기게 되면 언제든 나타나는 오픈소스 진영에서도 비슷한 기능을 하는 솔루션을 개발하는 여러 프로젝트가 진행중입니다. 아마도 이중에서 java를 사용하는 것들 중에 가장 완성도가 높은것은 jFreeChart 가 아닐가 싶습니다. 하지만, 완성도가 높다는 것은 그만큼 범용성에 신경을 쓰게 되서 접근하기 힘들게 변하기도 합니다. 그래서, 찾게된것은 jCharts입니다.
          지금까지 몇개를 둘러본 결과 jCharts가 접근하기 쉽고, 그에 비해서 강력한 기능을 가진 솔루션이라고 생각합니다.
       
      설치
          1. 프로그램 다운로드
              → 0.7.5 버젼을 다운받는다.(http://jcharts.sourceforge.net/downloads.html) - (최신버젼은 1.0.0 - alpha)
              → 압축을 풀면 최상위에 jCharts-0.7.5.jar 파일이 있다. 이 넘이 이 패키지의 핵심입니다.
                  나머지 폴더에 있는 것들은 나중에 시간이 나면 꼭 챙겨보기 바랍니다.
          2. LIB 설치
              → 어디든 JVM이 수행될때 찾을 수 있게 classpath의 경로상에 존재하면 됩니다.
              → 귀찮게 classpath를 신경쓰기 싫다면 이 파일을 lib/ext에 넣어둡니다.
       
      설치확인
          1. 테스트용 jsp작성
              → 만들기 귀찮으니 Web Server에 압축을 풀면 나오는 폴더 중 demo안에 있는 chart.jsp를
                  Web Server의 테스트할 폴더로 복사합니다.
          2. Web Server reboot.
              → Web Server가 새로울 liberary를 인식해야하니까 손 쉽게 죽였다 다시 살리세요.
          3. 그래프가 뜨는지 확인
              → 꺽은선 그래프가 뜨면 정상입니다.
              → 뜬 사람은 좋겠지만 제 컴에서는 안떴습니다.
                  제가 사용하는 OSDK의 jsp, servlet spec 버젼이 낮아서 생긴 것으로 보이네요.
                  혹시라도 낮은 버젼을 쓴다면,
                      ServletEncoderHelper.encodeJPEG(axisChart, 1.0f, response);
                  라고 되어 있는 마지막 줄을
                      JPEGEncoder13.encode(axisChart, 1.0f, response.getOutputStream());
                  이렇게 변경해 주기 바랍니다.
                  ※ 소스를 본 결과 제가 쓰는 Server에서는 setContentType()에서 문제가 있는 것으로 생각되
                    네요.
              → 그래프가 보이면 설치 완료입니다.
                  이제부터 Sample, demo, api 와 user gride등을 보면서 작업을 하면됩니다.
       
      그래프별 공통사항
          1. 이 lib는 JPG, PNG, SVG를 지원한다고 합니다. SVG는 Batick라는 lib가 추가로 필요하고, PNG는 jdk1.4 이상부터 지원된다고 합니다. 그냥 속편하게 JPEGEncoder13을 사용해서 JPG로만 출력하면 문제가 없을 것입니다. (jdk1.4이상 이라면 JPEGEncoder를 사용해도 상관없음)
          2. 혹시라도 X-Server 없이 LINUX, UNIX에서 사용을 한다면 awt 패키지를 사용하기 위해서 jdk1.4이상을 설치하고 web server를 기동시킬때 -Djava.awt.headless=true 옵션을 추가해야 합니다.
          3. 타이틀 넣기
             
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
              ------------------------------------------------------------------------------
              String[] xAxisLabels   = { "1998", "1999", "2000", "2001", "2002", "2003", "2004"};
              String    xAxisTitle       = "Years";
              String    yAxisTitle       = "Problems";
              String    title                = "Micro$oft At Work";
              DataSeries dataSeries = new DataSeries( xAxisLabels, xAxisTitle, yAxisTitle, title );
              ------------------------------------------------------------------------------
              소스와 각 타이틀, 라벨이 쓰인 것을 보시면 어떤 위치에 들어가지 보이시겠죠.
      기본도표작성순서
          1. 기본DATA를 생성한다.
              - 타이틀등 레이아웃에 관련된 값을 세팅한다.
              - 변경되는 data들(실제 data)을 생성한다.
          2. DATA SET을 생성한다.
              - 생성된 값들로 도표에 관련된 data에 대한 설정을 한다.
              - data들을 가지고 하나의 data set을 만든다.
          3. 도표를 생성한다.
              - 도표에 필요한 설정값들을 설정한다.
              - 설정값과 data set으로 Chart 객체를 생성한다.
          4. 이미지를 생성한다.
              - 화면에 뿌려줄 이미지를 생성한다.
       
      Properties
          ■ 공통 차트 설정(ChartProperties)
              1. 모든 차트에서 공통적으로 사용될 수 있는 설정들을 정의합니다.
              2. 타이틀관련(font, padding) 설정, 테두리관련(stroke, padding) 설정과 배경색을 지정합니다.
       
          ■ 범례 설정(LegendProperties)
              1. 범례는 위의 이미지에서 [Bugs, Security Holes, Backdoors]가 쓰여지 있는 부분을 나타냅니다.
              2. LegendProperties 클래스를 사용하고, AxisChart를 생성할 때 인자로 넘겨주게 됩니다.
                  당연하게 AxisChart를 만들때 null을 넣어주면 범례는 표시되지 않습니다.
                  그렇다면, 생성후 아무값도 설정하지 않고 AxisChart 생성시 넘겨주면 어떻게 될까요?
                  default 값으로 범례가 세팅되어서 표시 됩니다.
                  범례가 필요없다면 null을 꼭 넘겨주세요.
              3. API를 보면 색깔, 배경, 둘레, 아이콘등을 조절 할 수 있다고 되어 있지만, 다 귀찮구...
                  두가지만 사용해 볼 생각입니다.
                      legendProperties.setPlacement( LegendAreaProperties.LEFT );
                      legendProperties.setNumColumns( 2 );
                  위에 것은 범례의 위치를 지정하는 구문이고 아래것은 범례의 컬럼 수를 지정하는 것입니다.
                  아래나 위에 있으면 범례가 한 줄로 쭉~~~ 나와도 상관 없지만,
                  왼쪽이나 오른쪽으로 이동한다면, 컬럼을 제한해야 겠죠.
       
          ■ 축관련 설정(AxisProperties)
              1. 축을 가지고 있는 모든 도표에서 사용되는 설정입니다.
       
      Charts
          ■ Pie Chart
              1. jCharts에서는 크게 NonAxis Chart와 Axis Chart로 구분하는데, Pie는 NonAxis Chart임.
              2. 파이는 특별하게 세팅해 줄 값이 없을것 같고, 있더라도 그냥 default로 사용해도 별 문제가 없을 듯.
              3. 작업순서를 역순으로 작성해 보겠습니다.
                  1) 최종적으로 필요한 객체는 PieChart2D 입니다. 3D도 지원할 생각으로 이렇게 이름을 지은 것 같지만,
                    아직 API에는 존재하지 않네요. 이 객체를 생성하기 위해서는 4개의 객체가 필요합니다.
                      → iPieChartDataSet (IPieChartDataSet) : chart를 그리기위한 데이터의 집합.
               → legendProperties (LegendProperties) : 범례관련 설정값 (범례값 아님)
               → chartProperties (ChartProperties)   : chart관련 설정값
               → pixelWidth (int)                    : chart의 넓이
               → pixelHeight (int)                   : chart의 높이
                  2) 1)의 PieChart2D를 생성하기 위해서 가장 중요한 객체는 IPieChartDataSet입니다.
                      IPieChartDataSet은 interface로 이를 실제로 구현한 PieChartDataSet 을 생성해야 합니다.
               → chartTitle (String)                         : chart의 제목
               → data (double[])                             : data값
               → legendLabels (String[])                     : 범례값 
               → paints (Paint[])                            : 도표의 색깔들
               → pieChart2DProperties (PieChart2DProperties) : Pie Chart를 위한 설정값
                  3) PieChartDataSet을 생성하기 위해서 Pie Chart의 설정을 생성해야 합니다.
                      그역할을 하는 객체는 PieChart2DProperties 입니다.
                      border, currency, label type등의 설정이 가능합니다.
                  4) Chart로 표시하기 위한 double값을 1차원 배열로 생성한다.
              4. 예제
                  // 4) 그래프의 data를 생성.
                  double[] data= { 81d, 55d, 39d, 20.6d };
                  //각 data의 Label생성.
                  String[] labels= { "BMW M5", "BMW M3", "Viper GTS-R", "Corvette Z06" };
                  //각 data의 색깔 세팅. 
                  Paint[] paints= { Color.lightGray, Color.green, Color.blue, Color.red };
                  // 3) pie chart properties 생성.
                  PieChart2DProperties pieChart2DProperties= new PieChart2DProperties();
                  // 2) 지금까지 세팅한 값으로 DataSet생성
                  PieChartDataSet pieChartDataSet= new PieChartDataSet( "Cars That Own", data, labels, paints, pieChart2DProperties );     
                  // 1) DataSet으로 PieChart 생성
                  PieChart2D pieChart2D= new PieChart2D( pieChartDataSet, new LegendProperties(), new ChartProperties(), 320, 320 ); 
                  //생성된 Chart를 화면에 표시
                  JPEGEncoder13.encode(pieChart2D, 1.0f, response.getOutputStream());
       
      Bar Chart
          1. bar chart는 Axis Chart에 속합니다.
          2. bar chart는 normal, clustered, stacked 의 3 종류를 지원합니다.
              3 종류의 Bar Chart를 작성하는 것은 동일합니다.
              단지, AxisChartDataSet을 생성할때 bar type과 type에 만든 properties를 사용하면됩니다.
              ♩ ChartType.BAR                 → BarChartProperties
              ♪  ChartType.BAR_STACKED → stackedBarChartProperties
              ♬ ChartType.BAR_STACKED → stackedBarChartProperties
          3. 이것도 작업순서를 역순으로 작성해 보겠습니다.
              1) 최종적으로 생성되는 객체는 AxisChart 입니다. 이 객체는 아래에서 계속 볼 Axis Chart
                종류에 공통적으로 사용됩니다.
               → iAxisDataSeries (IAxisDataSeries)   : Axis Chart를 그리기위한 data set
               → chartProperties (ChartProperties)   : chart관련 설정값
               → axisProperties (AxisProperties)     : Axis Chart에서 사용되는 설정값
               → legendProperties (LegendProperties) : 범례관련 설정값 (범례값 아님)
                → pixelWidth (int)                    : chart의 넓이
               → pixelHeight (int)                   : chart의 높이
              2) 1)의 AxisChart를 생성하기 위해서 가장 핵심적인 객체는 IAxisDataSeries 이고 이 것은
            interface이기 때문에 이를 구현한 AxisDataSeries를 생성해야 합니다.
                 하지만, AxisDataSeries는 label을 설정할 수 없기 때문에 이를 상속받아 확장한
                 DataSeries  를 생성합니다.
               → axisLabels (String[]) : label들
               → xAxisTitle (String)   : x축 제목
               → yAxisTitle (String)   : y축 제목
               → chartTitle (String)   : chart 전체 제목
            이렇게 생성된 DataSeries에 IAxisPlotDataSet 을 등록합니다. 
            interface인 IAxisPlotDataSet를 구현한 AxisChartDataSet 은 chart로 표시 할 data에
            대한 정보를 가지고 있습니다.
               → data (double[][])      : 표시할 data의 2차원 배열
               → legendLabel (String[]) : 범례 값들
               → parints (Paint[])      : 막대별 색깔
               → chartType (ChartType)  : chart의 형태를 나타내는 ChartType의 상태값
               → chartTypeProperties (ChartTypeProperties) : 해당 chart에 특화된 설정값
              3) AxisDataSet을 생성하기 위핸 객체들을 생성합니다.
                  표시한 data, 범례 그리고 ChartTypeProperties를 생성합니다.
                  Bar Chart에 맞는 ChartTypeProperties는 BarChartProperties입니다.
              4. 예제
                  // 3)
                  // datas
                  double[][] data         = new double[][]{ { 250, 45, -36, 66, 145, 80, 55 },
                                                                                 { 100, 20,    0, 50, 155, 90, 25 }  };
                  // lebels - data의 개수와 label의 개수는 같아야 합니다.
                  String[] xAxisLabels  = { "1998", "1999", "2000", "2001", "2002", "2003", "2004" };
                  // x축 제목
                  String xAxisTitle       = "Years";
                  // y축 제목
                  String yAxisTitle       = "Problems";
                  // 전체 제목
                  String title            = "Micro$oft at Work";
                  // 범례 - 표실할 막대의 개수와 동일해야 함.
                  String[] legendLabels   = { "Bugs", "Fixed" };
                  // 막대 색깔 - 범례와 동일한 개수
                  Paint[] paints          = new Paint[]{ Color.blue.darker(), Color.red };
                  // Bar chart 속성
                   /* normal bar
                  BarChartProperties barChartProperties   = new BarChartProperties();
                  AxisChartDataSet axisChartDataSet = new AxisChartDataSet( data, legendLabels, paints, ChartType.BAR, barChartProperties );
                  */
                  // clustered bar
                  ClusteredBarChartProperties clusteredBarChartProperties   = new ClusteredBarChartProperties();
                  AxisChartDataSet axisChartDataSet = new AxisChartDataSet( data, legendLabels, paints,             ChartType.BAR_CLUSTERED, clusteredBarChartProperties );
                  /* stacked bar
                  StackedBarChartProperties stackedBarChartProperties   = new StackedBarChartProperties();
                  AxisChartDataSet axisChartDataSet = new AxisChartDataSet( data, legendLabels, paints, ChartType.BAR_STACKED, stackedBarChartProperties );
              */
              
                  // 2)
                  DataSeries dataSeries   = new DataSeries( xAxisLabels, xAxisTitle, yAxisTitle, title );
                  dataSeries.addIAxisPlotDataSet( axisChartDataSet );
              
                  // 1)
                  ChartProperties chartProperties     = new ChartProperties();
                  AxisProperties axisProperties       = new AxisProperties();
                  LegendProperties legendProperties   = new LegendProperties();
                  AxisChart axisChart= new AxisChart( dataSeries, chartProperties, axisProperties, legendProperties, 350, 350);
                  JPEGEncoder13.encode(axisChart, 1.0f, response.getOutputStream());
       
      Line Chart
          1. line chart는 Axis Chart에 속합니다.
          2. line chart는 기본적으로 bar chart와 사용법이 동일합니다.
              AxisChartDataSet을 생성할때 ChartType.LINE, LineChartProperties 를 사용하면 됩니다.
       
      나가는말
          이 문서만 보시고 API를 안 보신분들을 위해서 한가지만 더 말씀드리면, DataSeries라는 객체에 AxisChartDataSet을 등록할때 set 메소드가 아니라 add 메소드 입니다. 이런 이름을 지었다는 것은 여러개를 add할 수 있다는 말이 되겠죠. jCharts는 이렇게 add를 함으로써 여러 chart가 복합적으로 들어간 chart를 만들 수가 있습니다.
          jCharts는 제가 보는 입장에서는 단순합니다. 그렇기 때문에 기능이 적을 수도 있지만, 단순한 그래프를 표현하는데는 부족함이 없을꺼라고 생각합니다. 게다가 현재 Radar Chart 가 포함된 1.0.0이 알파버젼으로 개발 중이고, 계속 발전할꺼라고 믿습니다.
       
      ※ 본 문서는 jCharts의 userGuide 0.3.0을 기반으로 제가 테스트하면서 작성한 문서입니다.
          틀린 내용이 있는 경우 아래의 메일로 알려주세요.
      ==================================================
      최초작성일 : 2004-10-22
      최종수정일 : 2004-10-28 15:02:10
      --------------------------------------------------
        본 문서는 자유롭게 배포/복사 할 수 있으나 반드시
        이 문서의 저자에 대한 언급을 삭제하시면 안됩니다.
        (이 내용은 javaservice.net에서 copy.)
      --------------------------------------------------
        이호훈(siva6)
        E-mail:
      siva6@dreamwiz.com
      ==================================================

      Powered By jwFreeNote 2.1 (http://cyber.teamjang.com/)
      덧글쓰기 | 엮인글 쓰기 이 포스트를.. 이 포스트 담기 -->
      [펌] JFreeChart로 차트 그리기 | JFreeChar 2005/02/18 11:22
      http://blog.naver.com/fdrake/10260220
      출처블로그 : 디비(DB)져 자봐(Java)라.

      JFreeChart는 강력한 기능과 무료라는 장점에 비해 공개되어 있는 문서가 거의 없는게 흠이다. 따로 문서를 팔아서 장사를 하려는 회사의 탓도 있겠지만...

       

      암튼 이것으로 프로젝트를 한 경험을 말하자면, 거의 맨땅에 헤딩했다고 할까...

       

      JFreeChart를 설치후 JFreeChart의 소스도 받아서 설치하고, ~/src/org/jfree/chart/demo 로 가면 각 차트별 예제가 다양하게 있다. 일단 이것에서 적당한 차트 종류를 찾아서 실행해본다.

       

      해당 차트가 원하는 종류이면, 일단 소스를 열어서 각 method의 입력값을 바꾸면서 차트가 어떻게 바뀌는지 찾아본다. (이게 맨땅의 헤딩이지...) 좀 하다보면 대충 감이 올 것이다. 데모도 모두 jar 에 묶여 있으므로 테스트로 실행해볼 때는 Class 이름을 바꾸는게 나을 것 같다.

       

      원래 demo로 만들어놓은게 Java application 방식으로 작동하도록 되어 있으므로, 이걸 서블릿이나 이미지 파일로 만들기 위해서는 약간 작업을 더해주어야 한다. 

       

      이건 LineChartDemo2.java 에서 생성자 부분이다.

       

          public LineChartDemo2(String title) {

              super(title);

              XYDataset dataset = createDataset();
              JFreeChart chart = createChart(dataset);
              ChartPanel chartPanel = new ChartPanel(chart);
              chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
              setContentPane(chartPanel);

          }

       

      별다른게 없다. 그냥 dataSet 만들어서 JFreeChart 인스턴스 만들어서 panel 에 그려주는 로직이다.

       

      여기에 좀만 바꿔서

       

          public LineChartDemo2(String title) {

              super(title);

              XYDataset dataset = createDataset();
              JFreeChart chart = createChart(dataset);

              try {
                   BufferedImage bi = chart.createBufferedImage(500, 270);
                   FileOutputStream fo = new FileOutputStream("output.jpg");
                   ChartUtilities.writeBufferedImageAsJPEG(fo, bi);

                   fo.close();
              } catch(IOException ioe) {
                   ioe.printStackTrace();
              }

          }

      파란색으로 표시된 부분을 바꿨다. 즉 FileOutputSteam 을 열고 BufferedImage를 만들어서 JPEG 파일로 쓰는 로직이다. (간단하지 않은가?)

       

      서블릿으로 쓸때는 FileOutputSteam 객체 대신에 HttpServletResponse 객체에 getOutputStream() 메소드를 호출하면 서블릿의 output으로 이미지 파일을 보낼 수 있다... 파란 부분의 밑줄 그은 부분을 다음과 같이 바꿔주면 ..

       

                  ChartUtilities.writeBufferedImageAsJPEG(response.getOutputStream(), bi);

       

      서블릿에서도 쓸 수 있다.

       

      자 이제 되었다... 좀 더 세부적인 각 메소드별 사용방법은 각자가 확인해 봐야 하지 않겠나?

       

      그럼.

      출처 : 곁을 떠나셨지만 그 뜻은 영원합니다.
      글쓴이 : 카즈마 원글보기
      메모 :