Автоматическое масштабирование оси Y в JfreeChart - PullRequest
6 голосов
/ 04 августа 2011

Я использую JFreeChart для создания свечных графиков в моем приложении Java. Тем не менее, мои графики выглядят так:

capturebhx http://imageshack.us/photo/my-images/69/capturebhx.png/

Я бы хотел, чтобы ось Y автоматически масштабировалась, чтобы диаграмма выглядела примерно так:

capture2wl http://imageshack.us/photo/my-images/717/capture2wl.png/

Я думаю, org.jfree.chart.axis.NumberAxis.configure() сделает это, но я не уверен. Я не могу найти способ привязать мой JFreeChart объект или ChartPanel объект к этому NumberAxis объекту. Пожалуйста, помогите мне, я заблудился и долго искал, чтобы связать эти объекты вместе. Или, если вы можете найти другой путь, это тоже было бы здорово!

Код:

...
private DefaultHighLowDataset dataset;
private JFreeChart chart;
private ChartPanel chart_panel;

...

// creates dataset, then chart from dataset, then chart_panel from chart
dataset = new DefaultHighLowDataset("", date, high, low, open, close, volume);
chart = ChartFactory.createCandlestickChart("Blank", "Time", "Price", dataset, false);
chart_panel = new ChartPanel(chart); // what you see in the images
...

Ответы [ 2 ]

7 голосов
/ 04 августа 2011

Обязательно setAutoRangeIncludesZero(false) или «диапазон оси… вынужден включать ноль».

Добавление:

Я до сих пор не знаюзнать, как связать объект NumberAxis с объектом ChartPanel или JFreeChart.

Вы можете посмотреть примеры в org.jfree.chart.demo и здесь .Если это terra incognita , я бы рекомендовал Руководство разработчика JFreeChart .

Отказ от ответственности: Не связан с Object Refinery Limited;просто довольный клиент и очень незначительный вкладчик.

4 голосов
/ 14 сентября 2011

Я сделал это так:

     final JFreeChart chart = ChartFactory.createCandlestickChart(
            "Candlestick Demo", "Time", "Price", dataset, false);

    double lowestLow = getLowestLow(dataset);
    double highestHigh = getHighestHigh(dataset);

    chart.getXYPlot().getRangeAxis().setRange(lowestLow*0.95, highestHigh*1.05);

Я рассчитываю самый низкий минимум и самый низкий максимум, используя эти функции

private double getLowestLow(DefaultHighLowDataset dataset){
    double lowest;
    lowest = dataset.getLowValue(0,0);
    for(int i=1;i<dataset.getItemCount(0);i++){
        if(dataset.getLowValue(0,i) < lowest){
            lowest = dataset.getLowValue(0,i);
        }
    }

    return lowest;
}


private double getHighestHigh(DefaultHighLowDataset dataset){
    double highest;
    highest = dataset.getHighValue(0,0);
    for(int i=1;i<dataset.getItemCount(0);i++){
        if(dataset.getLowValue(0,i) > highest){
            highest = dataset.getHighValue(0,i);
        }
    }

    return highest;
}   

Это, кажется, дает мне очень хороший подсвечник, который делаетхорошее использование диапазона оси Y.Надеюсь, это поможет.

...