2012-01-14 5 views
1

저는 지난 주에 JFreeChart가 아래 이미지와 비슷한 것을 표시 할 수있는 방법을 찾기 위해 노력했습니다. 기본적으로 당신은 fill inbetween와 함께 3 가지 시리즈 (위, 중간, 아래)를보고 있습니다. 그리고 밑에는 연한 녹색의 채우기 색이 있거나, 일부는 아마도 그것을 부르는 영역 차트가 있습니다. 외견 상 의미가 없습니다.XYDifference (Renderer) 그래프 아래에 영역 그래프 만들기

enter image description here

나는 심지어 XYDifferenceRenderer를 서브 클래스와 결합하는 시도 : 아래 채우기/영역 차트 :

enter image description here

정말 내가 가지고 올 것을에서 누락 된 유일한 것은 마지막 부분입니다 그것은 Areachart에 대한 렌더러와 함께하지만, 기본적으로 음모를 위로 채우는, 아첨꾼의 높이를 제어 할 수 없습니다. 그래서 그 일은 아무 것도 아니었다. 이전에 둥근 막대 차트를 만들기 위해 간단한 렌더러를 만들었으므로 XYDifferenceRenderer에 대한 코드를 변경할 수 있다고 생각했습니다. 그러나 XYDifferenceRenderer의 코드는 JFree 차트의 기하학 및 내부 동작 중 상당 부분을 차지합니다. 작업은 다소 압도적이었습니다. 따라서 "JFreeChart의 내부 동작을 해킹하는 것을 포함하지 않는"일반적인 방법으로이 효과를 얻는 방법에 대한 팁은 무엇입니까?

답변

2

이전 게시판 describing how to use two renderers in the same plot이 발견되었습니다.이 경우에는 그저 그랬습니다. 사용자가 만든

  1. 에 필요한 아래

    는 채우기를 얻으려면 두 개의 새로운 시리즈
    • 하나는 낮은
    • 다른 차이 플롯의 하한 값 인의 하단에 줄거리 - 종종 단지 0입니다. 쉽게 새로운 데이터 세트에 추가하고 나는 음모가 여러 데이터 세트를 가질 수 있다는 것을 모르고 있었다 플롯 이 추가
  2. plot.getRangeAxis().getLowerBound()를 호출하여 얻었다. 하나의 인덱스 만 사용하여 액세스 할 수 있습니다.
    • 새로운 렌더러 권리 채우기
    • 새로운 렌더러
    에게로 새로운 데이터 세트에 대한 rendererer을 설정 페인트 설정
  3. 를 만들려면 "입력"데이터 세트에 대한 새로운 렌더러를 만들

코드는 채우기 페인트가 분명히 당신에게 달려 있습니다.

static void addFill(Plot plot) { 

    XYSeries lowerLimitSeries = ((XYSeriesCollection) (plot.getDataset())).getSeries(1); 
    XYSeriesCollection fillSet = new XYSeriesCollection(); 
    double lowerBound = plot.getRangeAxis().getLowerBound(); 
    fillSet.addSeries(lowerLimitSeries); 
    fillSet.addSeries(createLowerFillSeries(lowerLimitSeries, lowerBound)); 
    plot.setDataset(1, fillSet); 
    Paint fillPaint = Color.GREEN; 
    XYDifferenceRenderer fillRenderer = new XYDifferenceRenderer(fillPaint, fillPaint, false); 
    fillRenderer.setSeriesStroke(0, new BasicStroke(0)); //do not show 
    fillRenderer.setSeriesStroke(1, new BasicStroke(0)); //do not show 
    plot.setRenderer(1, fillRenderer); 
    ... 
} 

static XYSeries createLowerFillSeries(XYSeries lowerLimitSeries, double lowerLimit) { 
    int size = lowerLimitSeries.getItems().size(); 
    XYSeries res = new XYSeries("lowerFillSeries"); 
    for (int i = 0; i < size; i++) res.add(new XYDataItem(lowerLimitSeries.getX(i), lowerLimit)); 
    return res; 
} 
+0

doc에서 두 개의 렌더러를 사용하는 또 다른 예제는 다음과 같습니다. http://www.java2s.com/Code/Java/Chart/JFreeChartOverlaidBarChartDemo.htm – oligofren