Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
133 views
in Technique[技术] by (71.8m points)

java - CombinedDomainXYPlot not rescaling domain axis

When I hide number of series from a chart that is using a CombinedDomainXYPlot, all range axes are auto rescaled nicely. Howver, the domain axis does not get rescaled. Is there any way to manually refresh scaling, or perhaps there is a setting I am missing to enable auto scaling of a domain axis in this setting?

Question&Answers:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

CombinedDomainXYPlot establishes the combined maximal Range for its shared domain axis in getDataRange(). This is required to allow the axis to be shared. Changing the visibility of a series has no effect on the shared domain axis; changing the Dataset updates the shared domain axis via its configure() method. In either case, the subplots' range axes can be updated indepedently.

The example below allows one to update a subplot or change a series' visibility independently. Break on configure() to see the effect. Your suggestion to toggle setAutoRange () can be replaced with a single call to configure(); but the effect should be nil, as the data and its combined maximal Range are unchanged.

mainPlot.getDomainAxis().configure();

To automatically update the shared domain axis, use addSeries() or removeSeries() instead of setSeriesVisible().

As an aside, don't neglect Initial Threads and pack().

combined plot image

import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.Random;
import javax.swing.*;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CombinedDomainXYPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import static org.jfree.chart.renderer.xy.StandardXYItemRenderer.*;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 * @see https://stackoverflow.com/a/64508866/230513
 * @see https://stackoverflow.com/q/11870416/230513
 */
public class CombinedPlot {

    private static final int MAX = 3;
    private static final Random RND = new Random();

    public static void main(String[] args) {
        EventQueue.invokeLater(CombinedPlot::init);
    }

    private static void init() {
        XYItemRenderer renderer = new StandardXYItemRenderer(SHAPES_AND_LINES);
        XYPlot plot1 = new XYPlot(
            generateData(), null, new NumberAxis("Range 1"), renderer);
        XYPlot plot2 = new XYPlot(
            generateData(), null, new NumberAxis("Range 2"), renderer);
        final CombinedDomainXYPlot plot =
            new CombinedDomainXYPlot(new NumberAxis("Domain"));
        plot.setDomainPannable(true);
        plot.setRangePannable(true);
        plot.add(plot1);
        plot.add(plot2);
        plot.setOrientation(PlotOrientation.VERTICAL);
        JFreeChart chart = new JFreeChart(
            "Combined Plots", JFreeChart.DEFAULT_TITLE_FONT, plot, true);
        ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new Dimension(800, 500));

        JPanel controlPanel = new JPanel();
        controlPanel.add(new JButton(new UpdateAction(plot, 0)));
        controlPanel.add(new JButton(new UpdateAction(plot, 1)));
        for (int i = 0; i < MAX; i++) {
            JCheckBox jcb = new JCheckBox(new VisibleAction(renderer, i));
            jcb.setSelected(true);
            renderer.setSeriesVisible(i, true);
            controlPanel.add(jcb);
        }

        JFrame frame = new JFrame("Combined Plot Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(chartPanel, BorderLayout.CENTER);
        frame.add(controlPanel, BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private static class UpdateAction extends AbstractAction {

        private final XYPlot plot;

        public UpdateAction(CombinedDomainXYPlot plot, int i) {
            super("Update plot " + (i + 1));
            this.plot = (XYPlot) plot.getSubplots().get(i);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            plot.setDataset(CombinedPlot.generateData());
        }
    }

    private static class VisibleAction extends AbstractAction {

        private XYItemRenderer renderer;
        private int i;

        public VisibleAction(XYItemRenderer renderer, int i) {
            super("Series " + (i + 1));
            this.renderer = renderer;
            this.i = i;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            renderer.setSeriesVisible(i, !renderer.getSeriesVisible(i));
        }
    }

    private static XYSeriesCollection generateData() {
        XYSeriesCollection data = new XYSeriesCollection();
        for (int i = 0; i < MAX; i++) {
            data.addSeries(generateSeries("Series " + (i + 1)));
        }
        return data;
    }

    private static XYSeries generateSeries(String key) {
        XYSeries series = new XYSeries(key);
        for (int i = 0; i < 16; i++) {
            series.add(RND.nextGaussian(), RND.nextGaussian());
        }
        return series;
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...