代码之家  ›  专栏  ›  技术社区  ›  frogatto

缩放时范围轴上的自动范围

  •  1
  • frogatto  · 技术社区  · 7 年前

    我正在尝试创建一个烛台图表,用户可以缩放和平移,就像这样 TradingView chart .

    // Domain axis
    DateAxis dateAxis = new DateAxis();
    
    // Range axis
    NumberAxis priceAxis = new NumberAxis("Price");
    priceAxis.setRangeType(RangeType.POSITIVE);
    priceAxis.setAutoRange(true);
    priceAxis.setAutoRangeIncludesZero(false);
    
    // Plot
    CandlestickRenderer renderer = new CandlestickRenderer();
    XYPlot plot = new XYPlot(mPriceDataSet, dateAxis, priceAxis, renderer);
    plot.setDomainPannable(true);
    plot.setRangePannable(false);
    
    // Chart
    mChart = new JFreeChart("Price History", plot);
    

    哪一个 mPriceDataSet 是我的数据集,类型为 DefaultOHLCDataset .下面是我如何创建 ChartPanel :

    ChartPanel chartPanel = new ChartPanel(mChart);
    chartPanel.setMouseZoomable(true);
    chartPanel.setRangeZoomable(false);
    chartPanel.setMouseWheelEnabled(true);
    

    行为: 绘制图表时,一切正常,但是当用户缩放和/或平移视图端口时,范围轴不会缩放并显示第一个范围。

    期望的行为: 在缩放/平移范围时,轴应动态设置其范围。一模一样 TrandingView charts .


    麦克维

    我根据你的 Sample8 .要重现问题,只需运行应用程序,并在12:5使用鼠标拖动选择蜡烛。如您所见,缩放/选择后的图表将不会自动调整范围,用户必须使用关联菜单手动调整范围。

    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.*;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.renderer.xy.CandlestickRenderer;
    import org.jfree.data.time.Minute;
    import org.jfree.data.time.ohlc.OHLCSeries;
    import org.jfree.data.time.ohlc.OHLCSeriesCollection;
    
    import javax.swing.*;
    import java.awt.*;
    import java.text.SimpleDateFormat;
    
    public class AutoRangeTestApp {
    
        private final ChartPanel chartPanel;
        private final OHLCSeriesCollection seriesCollection = new OHLCSeriesCollection();
    
        public AutoRangeTestApp() {
            JFreeChart chart = ChartFactory.createCandlestickChart(
                    "Sample8", "Time", "Price", seriesCollection, true);
            chart.getXYPlot().setOrientation(PlotOrientation.VERTICAL);
            chart.getXYPlot().setDomainPannable(true);
            CandlestickRenderer r = (CandlestickRenderer) chart.getXYPlot().getRenderer();
            r.setAutoWidthMethod(CandlestickRenderer.WIDTHMETHOD_SMALLEST);
    
            // Y-axis
            NumberAxis numberAxis = (NumberAxis) chart.getXYPlot().getRangeAxis();
            numberAxis.setAutoRangeIncludesZero(false);
            numberAxis.setAutoRangeStickyZero(false);
    
            // X-axis
            DateAxis dateAxis = (DateAxis) chart.getXYPlot().getDomainAxis();
            dateAxis.setDateFormatOverride(new SimpleDateFormat("HH:mm"));
            dateAxis.setTickUnit(new DateTickUnit(DateTickUnitType.MINUTE, 1));
            dateAxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);
    
            // chartPanel
            chartPanel = new ChartPanel(chart) {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(800, 400);
                }
            };
            chartPanel.setMouseWheelEnabled(true);
            chartPanel.setMouseZoomable(true);
            chartPanel.setRangeZoomable(false);
    
            // series
            addSeries1();
        }
    
        private void addSeries1() {
            OHLCSeries series = new OHLCSeries("One");
            series.add(new Minute(0, 12, 1, 1, 2014), 97.23D, 98.47D, 97.15D, 97.43);
            series.add(new Minute(1, 12, 1, 1, 2014), 96.47D, 98.81D, 96.27D, 97.49);
            series.add(new Minute(2, 12, 1, 1, 2014), 95.88D, 96.87D, 96.11D, 96.75);
            series.add(new Minute(3, 12, 1, 1, 2014), 96.05D, 96.94D, 95.89D, 96.59);
            series.add(new Minute(4, 12, 1, 1, 2014), 95.92D, 97.00D, 95.69D, 96.92);
            series.add(new Minute(5, 12, 1, 1, 2014), 96.34D, 96.71D, 95.68D, 96.70);
            series.add(new Minute(6, 12, 1, 1, 2014), 96.65D, 96.87D, 94.91D, 96.38);
            series.add(new Minute(7, 12, 1, 1, 2014), 97.75D, 98.20D, 96.90D, 97.24);
            series.add(new Minute(8, 12, 1, 1, 2014), 97.72D, 98.47D, 97.35D, 97.64);
            series.add(new Minute(9, 12, 1, 1, 2014), 98.30D, 98.77D, 97.56D, 97.99);
            seriesCollection.addSeries(series);
        }
    
        public ChartPanel getChartPanel() {
            return chartPanel;
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
    
                public void run() {
                    AutoRangeTestApp app = new AutoRangeTestApp();
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(app.getChartPanel());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    }
    
    0 回复  |  直到 7 年前