【问题标题】:Setting Range for X,Y Axis-JfreeChartX,Y轴设置范围-JfreeChart
【发布时间】:2011-11-06 02:31:50
【问题描述】:

关于如何设置 X 轴和 Y 轴范围的任何建议。

我的“X 轴”范围是“0.00 到 1.00”,相差“0.05”。我的意思是 0.00 0.05 0.10 0.15.....0.90 0.95 1.00

我的“Y 轴”范围是“0.0 到 1.0”,相差“0.1”。我的意思是 0.0 0.1 0.2 0.3 0.4.........0.9 1.0

我尝试过这种方式,但它没有反映在图表上;我不知道如何应用到ChartFactory.createScatterPlot()

final NumberAxis domainAxis = new NumberAxis("X-Axis");
domainAxis.setRange(0.00,1.00);
domainAxis.setTickUnit(new NumberTickUnit(0.1));
final NumberAxis rangeAxis = new NumberAxis("Y-Axis");
rangeAxis.setRange(0.0,1.0);
rangeAxis.setTickUnit(new NumberTickUnit(0.05));

public  JPanel createDemoPanel() {
    XYDataset dataset1 = samplexydataset2();
    JFreeChart jfreechart = ChartFactory.createScatterPlot("Scatter Plot Demo",
        "X", "Y",dataset1, PlotOrientation.VERTICAL, true, true, false);
}

任何有关这方面的帮助都会很棒。

【问题讨论】:

    标签: java jfreechart


    【解决方案1】:

    我猜你的新 NumberAxis 实例没有被情节使用;使用工厂现有的可能更容易。

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.util.*;
    import javax.swing.AbstractAction;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import org.jfree.chart.*;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.axis.NumberTickUnit;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.XYItemRenderer;
    import org.jfree.data.xy.XYDataset;
    import org.jfree.data.xy.XYSeries;
    import org.jfree.data.xy.XYSeriesCollection;
    
    /**
     * @see http://stackoverflow.com/questions/7231824
     * @see http://stackoverflow.com/questions/7205742
     * @see http://stackoverflow.com/questions/7208657
     * @see http://stackoverflow.com/questions/7071057
     */
    public class ScatterAdd extends JFrame {
    
        private static final int N = 8;
        private static final String title = "Scatter Add Demo";
        private static final Random rand = new Random();
        private XYSeries added = new XYSeries("Added");
    
        public ScatterAdd(String s) {
            super(s);
            final ChartPanel chartPanel = createDemoPanel();
            this.add(chartPanel, BorderLayout.CENTER);
            JPanel control = new JPanel();
            control.add(new JButton(new AbstractAction("Add") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    for (int i = 0; i < N; i++) {
                        added.add(rand.nextDouble(), rand.nextDouble());
                    }
                }
            }));
            this.add(control, BorderLayout.SOUTH);
        }
    
        private ChartPanel createDemoPanel() {
            JFreeChart jfreechart = ChartFactory.createScatterPlot(
                title, "X", "Y", createSampleData(),
                PlotOrientation.VERTICAL, true, true, false);
            XYPlot xyPlot = (XYPlot) jfreechart.getPlot();
            xyPlot.setDomainCrosshairVisible(true);
            xyPlot.setRangeCrosshairVisible(true);
            XYItemRenderer renderer = xyPlot.getRenderer();
            renderer.setSeriesPaint(0, Color.blue);
            NumberAxis domain = (NumberAxis) xyPlot.getDomainAxis();
            domain.setRange(0.00, 1.00);
            domain.setTickUnit(new NumberTickUnit(0.1));
            domain.setVerticalTickLabels(true);
            NumberAxis range = (NumberAxis) xyPlot.getRangeAxis();
            range.setRange(0.0, 1.0);
            range.setTickUnit(new NumberTickUnit(0.1));
            return new ChartPanel(jfreechart);
        }
    
        private XYDataset createSampleData() {
            XYSeriesCollection xySeriesCollection = new XYSeriesCollection();
            XYSeries series = new XYSeries("Random");
            for (int i = 0; i < N * N; i++) {
                double x = rand.nextDouble();
                double y = rand.nextDouble();
                series.add(x, y);
            }
            xySeriesCollection.addSeries(series);
            xySeriesCollection.addSeries(added);
            return xySeriesCollection;
        }
    
        public static void main(String args[]) {
            EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    ScatterAdd demo = new ScatterAdd(title);
                    demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    demo.pack();
                    demo.setLocationRelativeTo(null);
                    demo.setVisible(true);
                }
            });
        }
    }
    

    【讨论】:

    • 不客气;你也可以检查JFreeChart.createScatterPlot() 本身。
    • 如何更改蓝色标记的大小?我想让蓝色标记更大,但保持红色标记的大小不变
    • 奇怪,负范围不起作用。即-5.00 到 5.00。只会绘制 >=0 的值。
    • @BakedInhalf:示例添加[0,1)范围内的数据;尝试添加负值以查看差异。
    • @trashgod 我做了,但尝试使用 XYPLOT 和 StandardXYItemRenderer。我有两个 y 轴(左侧在 60-90 范围内),右侧在 -200 到 200 之间。一切正常,除了“右”轴上的任何负数都将被截断,而不是绘制。奇怪的问题,但也许是另一个问题..
    【解决方案2】:

    除非您粘贴的代码不完整,否则您的问题似乎是您没有将您创建的 NumberAxis 对象与您的绘图相关联。

    不要手动创建新的 NumberAxis 对象,而是尝试获取与您的绘图关联的默认 ValueAxis 对象,然后修改它们的属性:

    XYPlot xyPlot = jfreechart.getXYPlot();
    ValueAxis domainAxis = xyPlot.getDomainAxis();
    ValueAxis rangeAxis = xyPlot.getRangeAxis();
    
    domainAxis.setRange(0.0, 1.0);
    domainAxis.setTickUnit(new NumberTickUnit(0.1));
    rangeAxis.setRange(0.0, 1.0);
    rangeAxis.setTickUnit(new NumberTickUnit(0.05));
    

    【讨论】:

    • 感谢您的建议。我会这样做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多