2012-01-14 64 views
1

我一直在嘗試在上週找到一種方法讓JFreeChart顯示類似於下圖的東西。基本上,你正在看三個系列(上,中,下)和填充。在下面有一個(淺綠色)填充顏色,或者一些區域圖,有些人可能會這樣稱呼它 - 沒有意義,只是爲了看起來。在XYDifference(渲染器)圖下創建區域圖

enter image description here

從我已經想出真正唯一缺少的是最後一部分:下面填充/區域圖:

enter image description here

我甚至試圖繼承XYDifferenceRenderer並結合它與Areachart的渲染器一起使用,但我無法控制區域圖的高度,基本上填滿了該圖的頂部。所以這是一個不行。之前創建了一個簡單的渲染器來創建四捨五入的條形圖,我認爲我可以更改XYDifferenceRenderer的代碼。但是XYDifferenceRenderer的代碼是JFree圖表的幾個幾何和內部工作,而且任務有點令人難以置信。因此,有關如何以任何「正常」方式實現這種效果的提示(不涉及黑客JFreeChart的內部工作)?

回答

2

找到一箇舊的帖子describing how to use two renderers in the same plot,這只是在這種情況下的事情。

要下你需要

  1. 創建得到填充兩個新系列
    • 一個是在的底部下限差異圖
    • 其他的是價值觀情節 - 通常只是零。通過調用plot.getRangeAxis().getLowerBound()
  2. 將它們添加到一個新的數據集,將其添加到情節 我不知道,一個情節可以有多個數據集輕鬆得到。原來,只能使用索引來訪問它們。
  3. 創建一個新的渲染爲「補」數據集
    • 創建一個新的渲染
    • 設置正確的補漆
    • 設置了新的數據集的rendererer成爲新的渲染

該代碼類似於以下內容,其中填充Paint顯然取決於您:

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

關於使用文檔中兩個呈現器的另一個示例:http://www.java2s.com/Code/Java/Chart/JFreeChartOverlaidBarChartDemo.htm – oligofren 2012-01-16 12:30:24