【问题标题】:How to stop line from passing through 0?如何阻止线通过0?
【发布时间】:2021-12-06 07:38:30
【问题描述】:

我正在使用此代码生成 XYChart,但该线始终下降到原点,然后继续跟随点。我怎样才能防止这种情况发生?

import java.awt.Color; import java.awt.BasicStroke; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.data.xy.XYDataset; import org.jfree.data.xy.XYSeries;import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.ChartFactory; import org.jfree.chart.plot.PlotOrientation; import org.jfree.data.xy.XYSeriesCollection; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
public class Graph  extends ApplicationFrame {
    static MenuCode mc = new MenuCode();

    public static void main(String args []) {
        Graph chart = new Graph(mc.eq,mc.eq);
        chart.pack();          
        RefineryUtilities.centerFrameOnScreen(chart);          
        chart.setVisible(true); 
    }

    private XYDataset createDataset() {
        final XYSeries equation1 = new XYSeries(mc.eq);          
        for (short i = 0; i<200; i++){
            equation1.add(mc.x[i] , mc.y[i]);
        }

        //for (short i = 0; i<200; i++){
            //equation2.add(mc.x[i] , mc.y[i]);
        //}      

        final XYSeriesCollection dataset = new XYSeriesCollection();          
        dataset.addSeries(equation1);          
        //dataset.addSeries(eq2);          
        return dataset;
    }
    
    public Graph( String applicationTitle, String chartTitle ) {
        super(applicationTitle);
        JFreeChart xylineChart = ChartFactory.createXYLineChart(chartTitle, "X", "Y", createDataset(), PlotOrientation.VERTICAL ,true , true , false);
        ChartPanel chartPanel = new ChartPanel(xylineChart);
        chartPanel.setPreferredSize(new java.awt.Dimension(2560 , 1600));
        final XYPlot plot = xylineChart.getXYPlot();
        
        XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
        renderer.setSeriesPaint(0, Color.RED);
        renderer.setSeriesStroke(0, new BasicStroke(3.0f));
        //renderer.setSeriesPaint(1 , Color.GREEN);
        //renderer.setSeriesStroke(1, new BasicStroke(3.0f));
        plot.setRenderer(renderer); 
        setContentPane(chartPanel); 
    }
}

x 轴和 y 轴点取自另一个类中的数组。 截图:

【问题讨论】:

  • 您可以添加结果图表的屏幕截图吗?
  • 更正您的数据。
  • 它就是这样 - 改变方程式以适应您的期望或数据。
  • 我们能看到MenuCode类的代码,特别是x和y函数吗
  • 可能duplicate:建议hereautoSortallowDuplicateXValues默认为true

标签: java jfreechart


【解决方案1】:

您似乎想要绘制从两个geometric lines 中选择的点:y = 2x + 2y = -2x - 2。由于两条线在点 (-1, 0) 相交,因此很明显,当 x 为零时,您正在添加一个额外的点。

我更改了您的示例,以展示我如何从 -N ... N 中对每一行进行采样,以根据其方程生成 XYSeries

另外,您创建一个新的XYLineAndShapeRenderer,但您可以重复使用由ChartFactory.createXYLineChart() 创建的那个。

这可能是一个设置吗?

XYSeries 自动对数据进行排序并禁止重复。在createSeries() 中调用series.add(0, 0) 完全可以重现您的结果。尝试将allowDuplicateXValues 设置为false,如下所示:

…new XYSeries("y = " + m + "x + " + b, true, false);

如果您的数据包含重复项,编译器将抛出 SeriesException:

Exception in thread "main"
    org.jfree.data.general.SeriesException:
        X-value already exists.
import java.awt.BasicStroke;
import java.awt.Dimension;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.ChartPanel;
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;

//* https://stackoverflow.com/q/70242185/261156 */
public class LineTest {

    private static final int N = 4;

    private static XYSeries createSeries(int m, int b) {
        XYSeries series = new XYSeries("y = " + m + "x + " + b, true, true);
        for (int x = -N; x <= N; x++) {
            series.add(x, m * x + b);
        }
        return series;
    }

    private static XYDataset createDataset() {
        XYSeriesCollection collection = new XYSeriesCollection();
        collection.addSeries(createSeries(2, 2));
        collection.addSeries(createSeries(-2, -2));
        return collection;
    }

    private static JFreeChart createChart(final XYDataset dataset) {
        JFreeChart chart = ChartFactory.createXYLineChart(
            "Linear Equations", "X", "Y", dataset);
        XYPlot p = (XYPlot) chart.getPlot();
        p.setDomainCrosshairVisible(true);
        p.setRangeCrosshairVisible(true);
        XYLineAndShapeRenderer r = (XYLineAndShapeRenderer) p.getRenderer();
        r.setDefaultShapesVisible(true);
        BasicStroke s = new BasicStroke(3.0f);
        for (int i = 0; i < dataset.getSeriesCount(); i++) {
            r.setSeriesStroke(i, s);
        }
        return chart;
    }

    public static void main(String[] args) {

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        XYDataset dataset = createDataset();
        JFreeChart chart = createChart(dataset);
        ChartPanel chartPanel = new ChartPanel(chart) {

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(600, 400);
            }
        };
        f.add(chartPanel);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

【讨论】:

  • 我检查了方程给出的点,没有输出 (0,0)。会不会是设定?
  • 对不起,没有设置可以修复坏数据。我更新了答案以显示可能有助于确定问题的设置。
猜你喜欢
  • 2020-05-19
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
相关资源
最近更新 更多