Создание графика области под графиком XYDifference (Renderer) - PullRequest
1 голос
/ 15 января 2012

В течение последней недели я пытался найти способ заставить JFreeChart отображать что-то похожее на изображение ниже.В основном вы смотрите на три серии (верхнюю, среднюю, нижнюю) с промежуточной заливкой.А под ним (светло-зеленый) цвет заливки или диаграмма с областями, как некоторые, возможно, назвали бы это - не имеет значения, только для внешнего вида.

enter image description here

Единственное, чего действительно не хватаетиз того, что я придумал, есть последняя часть: заливка под диаграммой / областью:

enter image description here

Я даже пытался создать подкласс XYDifferenceRenderer и объединить его с средством визуализации для Areachart, ноЯ не мог контролировать высоту площади, в основном заполняя сюжет до самого верха.Так что это было запрещено.Создав простой рендерер для создания закругленных гистограмм ранее, я подумал, что смогу изменить код для XYDifferenceRenderer.Но код для XYDifferenceRenderer - это довольно небольшая часть геометрии и внутренней работы диаграммы JFree, и задача была немного сложной.Итак, есть ли какие-нибудь советы о том, как добиться этого эффекта любым «нормальным» способом (который не включает в себя взлом внутренней работы JFreeChart)?

1 Ответ

2 голосов
/ 16 января 2012

Нашел старый пост , описывающий, как использовать два средства визуализации на одном и том же графике , что в данном случае было именно таким.

Чтобы получить заполнение внизу, вам нужно

  1. создать две новые серии
    • это нижняя граница разностного графика
    • другие значения в нижней части графика - часто просто ноль. Легко добраться по телефону plot.getRangeAxis().getLowerBound()
  2. добавьте их в новый набор данных и добавьте их на график Я не знал, что на графике может быть несколько наборов данных. Оказывается, можно просто использовать индекс для доступа к ним.
  3. создать новый рендер для набора данных "fill"
    • создать новый рендерер
    • установить правильную заливку краски
    • установить средство визуализации для нового набора данных как новое средство визуализации

Код похож на следующий, где заливка 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;
}
...