Как я могу создать гистограмму с помощью JFreeChart, которая укорачивает слишком длинные столбцы с видимой подсказкой?

Я хочу создать гистограмму, но чрезвычайно высокие значения должны быть сокращены. Примером является это изображение:

укороченный график
(источник: epa.gov)

Надеюсь, понятно, чего я хочу.

Мой вопрос: как я могу сделать это с помощью JFreeChart. Если это невозможно с JFreeChart, вы можете порекомендовать альтернативные библиотеки Java с открытым исходным кодом для получения такого вывода.


person Mnementh    schedule 07.09.2009    source источник


Ответы (2)


Вы можете сделать это с помощью CombinedDomainCategoryPlot или CombinedDomainXYPlot. Установите ось диапазона первого графика на значение отсечения, а затем сделайте что-то подобное со вторым графиком. Затем добавьте их в комбинированный сюжет.

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.CombinedDomainCategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;

public class PlayChart {

    public static void main(String[] args) {


        DefaultCategoryDataset ds = new DefaultCategoryDataset();
        ds.addValue(100, "A", "A");
        ds.addValue(200, "A", "B");
        ds.addValue(400, "A", "C");
        ds.addValue(500, "A", "D");
        ds.addValue(2000, "A", "E");


        JFreeChart bc = ChartFactory.createBarChart("My Bar Chart", "Things", "Counts",  ds, PlotOrientation.VERTICAL, true, false, false);
        JFreeChart bcTop = ChartFactory.createBarChart("My Bar Chart", "Things", "Counts",  ds, PlotOrientation.VERTICAL, true, false, false);

        CombinedDomainCategoryPlot combinedPlot = new CombinedDomainCategoryPlot();
        CategoryPlot topPlot = bcTop.getCategoryPlot();
        NumberAxis topAxis = (NumberAxis) topPlot.getRangeAxis();
        topAxis.setLowerBound(1500);
        topAxis.setUpperBound(2000);

        combinedPlot.add(topPlot, 1);
        CategoryPlot mainPlot = bc.getCategoryPlot();
        combinedPlot.add(mainPlot, 5);

        NumberAxis mainAxis = (NumberAxis) mainPlot.getRangeAxis();;
        mainAxis.setLowerBound(0);
        mainAxis.setUpperBound(600);

        JFreeChart combinedChart = new JFreeChart("Test", combinedPlot);

        ChartFrame cf = new ChartFrame("Test", combinedChart);
        cf.setSize(800, 600);
        cf.setVisible(true);

    }

}

Графики будут иметь одну и ту же ось X. Вам нужно будет поиграть с визуализаторами, чтобы установить цвета и метки.

удалена неработающая ссылка на ImageShack

person pjp    schedule 07.09.2009
comment
Отлично, это выглядит именно так, как хотелось, спасибо за быструю помощь. - person Mnementh; 07.09.2009
comment
Я знаю, что это было давно, но это невероятно подробный ответ. - person Chris Hagan; 07.02.2011

Я не уверен, что вы можете сделать это в JFreeChart.

Решение (которое не очень приятно) состоит в том, чтобы преобразовать диаграмму в изображение, а затем манипулировать ею (нарезать и т. д.) как изображением, используя RenderedImage, а не как JFreeChart. К сожалению, это будет немного больно, так как вы, вероятно, захотите отрезать определенное место на оси Y и т. д.

person Brian Agnew    schedule 07.09.2009