jfreechart: как вы строите два сюжета? - PullRequest
1 голос
/ 07 февраля 2011

У меня есть два участка.Мне нужно, чтобы они выстроились в линию, потому что на двух графиках есть данные, которые нужно сравнить.Поэтому, когда вы выстраиваете их в ряд, сравнение легко.

Вот изображение двух графиков на данный момент.На картинке есть несколько красных аннотаций.Красные аннотации показывают, что сейчас существует «дельта».«Дельта» относится к смещению двух графиков.

enter image description here

Как сделать так, чтобы два графика точно совпали?

Пока что я добавил ChartChangeListener, чтобы при изменении верхнего графика я мог получить необходимую информацию ... и настроить нижний график.Но я не могу выяснить, «что такое необходимая информация» и как мне ее использовать для изменения нижней диаграммы.

ОБНОВЛЕНИЕ: Комментатор попросил какой-то код.Итак, вот что такое IMO необходимый кусок кода.

public class TmpChartPanel extends JPanel implements ChartChangeListener {

    ...

    public void addComponentsToContainer(IqDataset iqDataset) {
        this.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.BOTH;
        c.weightx = 1;
        c.weighty = 1;

        // Primarily, the main chart
        ChartPanel chartPanel = new ChartPanel(createChart(this.seriesCollection1));
        c.gridy = 0;
        c.gridx = 0;
        this.add(chartPanel, c);

        // Secondarily, the second plot. TODO: link the two together so that the user sees the data aligned.
        chartPanel = new ChartPanel(createHistogramChart(this.data));
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weighty = 0;
        c.gridy = 1;
        c.gridx = 0;
        this.add(chartPanel, c);
        c.fill = GridBagConstraints.BOTH;
        c.weighty = 1;
    }

    public void chartChanged(ChartChangeEvent event) {
        // NOTE: event is from the PRIMARY or top chart

        /*------ Take the value from the top chart and set the bottom plot ------*/
        // this part works
        XYPlot plot = (XYPlot)event.getChart().getPlot();
        NumberAxis xAxis = (NumberAxis) plot.getDomainAxis();
        Range tmp2 = xAxis.getRange();
        ((XYPlot)this.SECONDARY.getPlot()).getDomainAxis().setRange(tmp2);

        /*------ Make it so that the secondary chart plots the same way directly under the primary chart ------*/
        // can't figure out...
    }

    ...

}

1 Ответ

2 голосов
/ 07 февраля 2011

Похоже, что это может быть просто проблема с LayoutManager. (Трудно сказать без полного примера). Попробуйте это с GridLayout вместо GridBagLayout.

Лучшим решением может быть использование одного комбинированного графика для обоих графиков. Я предполагаю, что, поскольку вы хотите, чтобы они были одинакового размера, один поверх другого, они могли бы иметь общую ось. (Посмотрите на папку «Комбинированные оси» демонстрационного приложения JFreeChart).

...