Несколько осей по тем же данным

Я пытаюсь иметь две оси по тем же данным.

Данные представляют собой пару DefaultTableXYDatasets . Сюжет XYPlot , и у меня есть два XYLineAndShapeRenderers и один StackedXYAreaRenderer2 .

Все данные находятся в метрах для значений y, и я хочу, чтобы одна ось отображала ее в метрах, а одна ось отображала ее в футах. Теперь это похоже на обычную вещь, но я не могу решить наиболее очевидный способ сделать это. Один из способов работы – дублировать данные и иметь значения y в футах, а затем добавить еще один NumberAxis и выполнить с ним.

Но я подумал, что было бы разумнее подclassифицировать NumberAxis или NumberAxis некоторые функции в NumberAxis для масштабирования значений. Или я должен пойти с первым подходом?

Как вы думаете?

В конце концов, я остановился на этом решении, он может быть не самым элегантным, но он сработал. У меня есть вторая ось feetAxis и добавлена AxisChangeListener на первой оси, называемой meterAxis . Когда изменения meterAxis устанавливают диапазон на feetAxis .

Я использовал SwingUtilities.invokeLater , в противном случае диапазон был бы неправильным при масштабировании диаграммы, тогда feetAxis будет идти только от 0 до 1. Однако не проверял, почему.

 feetAxis = new NumberAxis("Height [ft]"); metersAxis = new NumberAxis("Height [m]"); pathPlot.setRangeAxis(0, metersAxis); pathPlot.setRangeAxis(1, feetAxis); metersAxis.addChangeListener(new AxisChangeListener() { @Override public void axisChanged(AxisChangeEvent event) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { feetAxis.setRange(metersAxis.getLowerBound() * MetersToFeet, metersAxis.getUpperBound() * MetersToFeet); } }); } }); 

Чтобы избежать дублирования данных, вы можете использовать метод mapDatasetToRangeAxes() для сопоставления индекса набора данных с перечнем индексов осей. В приведенном ниже примере meters являются главной осью, а диапазон соответствующей оси осей соответственно масштабируется, как показано здесь . Обратите внимание, что invokeLater() требуется для того, чтобы ось осей масштабировалась после любого изменения оси meters .

образ

 import java.awt.EventQueue; import java.util.Arrays; import java.util.List; import javax.swing.JFrame; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.AxisLocation; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.event.AxisChangeEvent; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYItemRenderer; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.data.xy.XYDataset; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; /** * @see https://stackoverflow.com/q/13358758/230513 */ public class AxisTest { private static final int N = 5; private static final double FEET_PER_METER = 3.28084; private static XYDataset createDataset() { XYSeriesCollection data = new XYSeriesCollection(); final XYSeries series = new XYSeries("Data"); for (int i = -N; i < N * N; i++) { series.add(i, i); } data.addSeries(series); return data; } private JFreeChart createChart(XYDataset dataset) { NumberAxis meters = new NumberAxis("Meters"); NumberAxis feet = new NumberAxis("Feet"); ValueAxis domain = new NumberAxis(); XYItemRenderer renderer = new XYLineAndShapeRenderer(); XYPlot plot = new XYPlot(dataset, domain, meters, renderer); plot.setRangeAxis(1, feet); plot.setRangeAxisLocation(1, AxisLocation.BOTTOM_OR_LEFT); List axes = Arrays.asList(0, 1); plot.mapDatasetToRangeAxes(0, axes); scaleRange(feet, meters); meters.addChangeListener((AxisChangeEvent event) -> { EventQueue.invokeLater(() -> { scaleRange(feet, meters); }); }); JFreeChart chart = new JFreeChart("Axis Test", JFreeChart.DEFAULT_TITLE_FONT, plot, true); return chart; } private void scaleRange(NumberAxis feet, NumberAxis meters) { feet.setRange(meters.getLowerBound() * FEET_PER_METER, meters.getUpperBound() * FEET_PER_METER); } private void display() { JFrame f = new JFrame("AxisTest"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(new ChartPanel(createChart(createDataset()))); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(() -> { new AxisTest().display(); }); } } 

Кроме того, вы можете использовать JCheckBox для переключения между двумя сериями, метрами и футами, как показано в этом примере . Используя методы, доступные для XYLineAndShapeRenderer , вы можете скрыть строки, фигуры и легенды второй серии. Сама серия должна быть видимой, чтобы установить диапазон осей.

  • JFreechart Loop через сектора полярных диаграмм
  • Как отобразить легенду для круговой диаграммы в столбцах?
  • CombinedDomainXYPlot не перемасштабирует доменную ось
  • Как установить разные цвета в столбцы в гистограмме в штабеле в iireport?
  • Добавить значения в указанную строку в DynamicTimeSeriesCollection
  • JFreeChart масштабирование ящиков с несколькими категориями
  • Локарифмическая привязка этикеток / тиков
  • JFreeChart PolarPlot: математическая ориентация
  • Отображение гистограммы данных изображения
  • Световая диаграмма JFreechart - странное поведение при перетаскивании
  • Несколько графиков на нескольких фигурах с использованием jFreeChart
  • Interesting Posts

    Я хочу получить Year, Month, Day и т. Д. Из Java Date для сравнения с григорианской датой календаря на Java. Это возможно?

    Передача ArrayList через намерение

    Как получить разницу между двумя датами в Год / Месяц / Неделя / День?

    Что пробуждает мой компьютер?

    Обозначение Postfix в дереве выражений

    Windows 7 Professional больше не монтирует мой USB-накопитель

    Как сделать мультизагрузочный USB-ключ?

    Диск 0 (C :) отсутствует в вкладке «Производительность диспетчера задач» в Windows 10

    Что представляет собой современное состояние для текстового рендеринга в OpenGL с версии 4.1?

    Как запросить контент-провайдера Android MediaStore, избегая потерянных изображений?

    Можно ли использовать диск с памятью (например, USB-накопитель) в качестве ОЗУ?

    Excel: Как я могу ссылаться на целую строку, за исключением пары ячеек?

    Программирование приложения P2P

    Как очистить кеш браузера при нажатии кнопки браузера в MVC4?

    Запрос MySQL для расчета предыдущего месяца

    Давайте будем гением компьютера.