【问题标题】:Java Swing Line GraphJava Swing 折线图
【发布时间】:2018-05-22 23:18:14
【问题描述】:

我正在尝试根据数组中保存的数据绘制折线图。我设法绘制了 X 和 Y 轴。但是,当我将带有数据的线绘制到图表上时,它不会与 X 和 Y 轴值对齐。我不确定如何解决这个问题。我已经展示了下面的代码:

public void drawLineG(Graphics g, int yCoords[]) {
    String maxY = Integer.toString(getMax(yCoords));
    String minY = Integer.toString(getMin(yCoords));
    String maxX = Double.toString((xInterval * yCoords.length) - xInterval);
    String minX = Double.toString(xStart);

    g.setColor(Color.BLUE);
    int height = (getHeight() / 2);
    int x = 200; // start x point

    // previous coord positions.
    int prevX = x;
    int prevY = yCoords[0];

    g.setColor(Color.BLACK);
    g.drawLine(prevX, getHeight() / 2, 500, getHeight() / 2);
    g.drawLine(prevX, 200, 200, getHeight() / 2);

    g.setColor(Color.BLUE);
    g.drawString(minY, 190, (getHeight() / 2));
    g.drawString(maxY, 180, (getHeight() / 2) - 255);
    g.drawString(yLabel, 140, (getHeight() / 2) - 100);
    g.drawString(minX, 192, (getHeight() / 2) + 20);
    g.drawString(maxX, 500, (getHeight() / 2) + 20);
    g.drawString(xLabel, 350, (getHeight() / 2) + 50);
    for (int y : yCoords) {
        g.setColor(Color.RED);
        g.drawLine(prevX, height - prevY, x, height - y);
        prevX = x;
        prevY = y;

        // add an increment to the X pos.
        x = x + 50;
    }
}

我一直在测试的数据数组包含以下值:0, 3, 4, 7, 5, 10, 3

但是,当它绘制在图表上时,它与 x 和 y 轴上的值不一致。

当前:https://i.stack.imgur.com/Ju8BQ.jpg 我想要达到的目标:https://i.stack.imgur.com/n9Aio.jpg

有什么帮助吗?
谢谢

【问题讨论】:

  • "它与 x 和 y 轴上的值不一致。" 是什么意思?它在轴的左/右?还是在他们之上/之下?这些坐标仅适用于y 坐标?你能发一个合适的minimal reproducible example吗?
  • 嗨,我已经包含了显示内容的图像。我只是想绘制 y 值。 x 轴由 xinterval 值决定。然而,最后一个值为 10 并且应该显示在图表的右上角
  • 你能发布一张应该是什么输出的图片吗?
  • 刚刚添加

标签: java swing


【解决方案1】:

您的问题是您的比例,您正在尝试按照给定的方式绘制 yCoords(3, 10 等),但它们应该是:30, 100 以适应窗口的比例(Window =你的程序窗口)。

例如在我下面的代码中,每个“正方形”或每个“单位”都是 30 x 30 像素,所以我必须将 yCoord = 3 转换为等效的 3 * 30 = 90 但因为轴低于起始在400,我必须减去它,这样我才能从轴或窗口底部获得坐标到真正的yCoord,即400 - 90 = 310,现在这是我必须绘制的真正要点。

但是绘画应该在paintComponent方法中完成。

在我的示例中,我没有为 0, 10, 0.0, 90.0 绘制字符串,但如果您愿意,可以稍后再绘制

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class GraphSample {
    private JFrame frame;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new GraphSample()::createAndShowGui);
    }

    private void createAndShowGui() {
        frame = new JFrame(getClass().getSimpleName());

        GraphDrawer drawer = new GraphDrawer(new int[] {0, 3, 4, 7, 5, 10, 3});

        frame.add(drawer);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @SuppressWarnings("serial")
    class GraphDrawer extends JPanel {
        private int[] yCoords;
        private int startX = 100;
        private int startY = 100;
        private int endX = 400;
        private int endY = 400;
        private int unitX = (endX - startX) / 10;
        private int unitY = (endY - startY) / 10;
        private int prevX = startX;
        private int prevY = endY;

        public GraphDrawer(int[] yCoords) {
            this.yCoords = yCoords;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;

            //We draw in the following 2 loops the grid so it's visible what I explained before about each "unit"
            g2d.setColor(Color.BLUE);
            for (int i = startX; i <= endX; i += unitX) {
                g2d.drawLine(i, startY, i, endY);
            }

            for (int i = startY; i <= endY; i += unitY) {
                g2d.drawLine(startX, i, endX, i);
            }

            //We draw the axis here instead of before because otherwise they would become blue colored.
            g2d.setColor(Color.BLACK);
            g2d.drawLine(startX, startY, startX, endY);
            g2d.drawLine(startX, endY, endX, endY);

            //We draw each of our coords in red color
            g2d.setColor(Color.RED);
            for (int y : yCoords) {
                g2d.drawLine(prevX, prevY, prevX += unitX, prevY = endY - (y * unitY));
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(endX + 100, endY + 100);
        }
    }
}

我希望很清楚错误是什么。

这是一个 10 x 10 网格的输出样例

【讨论】:

  • 感谢您的帮助。但是,如果输入的数据不同会怎样?例如,如果我将数据更改为 0、100、200、400、700、1024,则它无法正确缩放
  • 嗯,您提供的数据是带有3, 4, 7... 的数据,您将收到的实际数据是什么?
  • 我每次都收到不同的数据,它需要绘制在相同大小的图表上。例如,有时值是 {40, 90, 101, 60., 90, 100. 95, 101, 99., 124, 128, 64, 32}。我正在从文件中读取所有这些数据,然后用接收到的值绘制图表。
  • 最小值和最大值是多少?
  • 有时值很大,例如100,000
猜你喜欢
  • 2016-02-27
  • 2011-02-03
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多