当前位置: 首页 > 知识库问答 >
问题:

CombinedDomainXYPlot未重新缩放域轴

利稳
2023-03-14

当我从使用CombinedDomainXYPlot的图表中隐藏系列的数量时,所有的范围轴都可以很好地自动重新缩放。但是,域轴不会重新缩放。是否有任何方法手动刷新缩放,或者可能有一个设置,我错过了启用自动缩放域轴在此设置?

共有1个答案

郑宏朗
2023-03-14

CombinedDomainXyPlotGetDataRange()中为其共享域轴建立组合的最大范围。这是允许共享轴所必需的。更改序列的可见性对共享域轴没有影响;更改数据集会通过其configure()方法更新共享域轴。在任何一种情况下,子图的范围轴都可以独立更新。

下面的示例允许用户独立地更新子图或更改系列的可见性。在configure()上中断查看效果。您对切换setautorange()的建议可以替换为对configure()的单个调用;但效果应该是零,因为数据及其组合的最大范围不变。

mainPlot.getDomainAxis().configure();

若要自动更新共享域轴,请使用AddSeries()RemoveSeries()而不是SetSeriesVisible()

另外,不要忽略初始线程pack()

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;
    }
}
 类似资料:
  • 我有一个DefaultMessageListenerContainer,它(在我看来)没有扩展。容器被定义为侦听队列,其中有100条消息。 我希望容器可以达到任何长度,消息将尽可能快地被使用(通过观察maxConcurrentConsumers配置)。所以我假设有7个ConcurrentConsumer。(在container-startup时由2个ConcurrentConsumer开始)一些日

  • 问题内容: 我需要实现变焦为包含在。我已经通过覆盖方法和调用来成功进行缩放。 这是不正常:对的和的规模如预期,但一定会得到的和这样的寄存器在预分频的位置。我能做什么?感谢您的阅读。 问题答案: 显示了如何使用明确的转化方法扩展鼠标坐标:,,和。)。

  • 我最近开始使用JFreeChart,我想做一些事情,但我不确定是否可能。我的程序应该从wav文件中绘制声谱图(声音图)。因此,我设法从双arraylist中的wav文件中获取数据,并将其显示在图表中。但现在我希望能够选择我的频谱图的一个区域(与相同的工具用于缩放)没有缩放,并能够播放我的声音上只选择的部分。但我根本找不到任何成功的方法。以下是我的图表代码: getChartPanelun()返回一

  • 问题内容: 我正在使用matplotlib在Python中绘制数据。我正在基于一些计算更新图的数据,并希望ylim和xlim自动重新缩放。取而代之的是,比例是根据初始图的限制设置的。MWE是 第一个plot命令从中生成一个图,我可以看到一切正常。最后,y-data数组的起始位置大于,但该图的y限制仍然存在。 我知道我可以使用手动更改限制,但是我不知道将其更改为什么。在循环中,我可以告诉pyplot

  • 问题内容: 如何使用https://www.amcharts.com/demos/line-chart-with-scroll-and- zoom/ 这样的图表 我对这些功能特别感兴趣 为了能够使用这两个选择控件选择域轴窗口。 为了能够通过选择部分域轴进行缩放。 为了能够缩小并查看大图。 为了能够映射到范围轴(Y)并在任意点(无标记)像工具提示一样查看该气球上的值 我在这里尝试了可滚动的JFree

  • 如何拥有像https://www.amcharts.com/demos/line-chart-with-scroll-and-zoom/这样的图表 null 我在这里做了初步尝试,可滚动JFree域轴和自定义标记标签,在垃圾上帝的帮助下,我使域可滚动。 我仍然缺少这些功能,以便能够有效地使用graph。