You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java技术问询:如何将已绘制矩阵图转为数组映射的X,Y坐标点

把矩阵图转换为基于数据数组的X,Y坐标点绘制

我来帮你把现有的矩阵图改成基于数据数组生成坐标点的绘制方式~ 核心思路是把数组里的每个元素映射成图表上的(X,Y)坐标,再用这些坐标来画点、连线或者其他图形。我补全并修改了你的代码,直接就能用:

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class Graph1 extends JPanel {
    int[] data = {21, 0, 0, 1, 86, 88, 74, 87, 54, 77, 61, 55, 48, 60, 49, 36, 38, 27, 20, 18};
    final int PAD = 20;

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        int width = getWidth();
        int height = getHeight();

        // 先找出数据最大值,用来把数值映射到Y轴范围里
        int maxValue = 0;
        for (int num : data) {
            if (num > maxValue) {
                maxValue = num;
            }
        }
        maxValue = Math.max(maxValue, 1); // 防止数据全0时除以0

        // 计算每个数据对应的(X,Y)坐标
        double xStep = (double) (width - 2 * PAD) / (data.length - 1); // X轴上每个点的间隔
        Point2D[] points = new Point2D[data.length];
        for (int i = 0; i < data.length; i++) {
            // X坐标:从左边距开始,按索引均匀分布
            double x = PAD + i * xStep;
            // Y坐标:把数据值映射到上下边距之间,因为Java坐标系Y从上到下,所以反转数值让大值在上方
            double y = PAD + (height - 2 * PAD) * (maxValue - data[i]) / (double) maxValue;
            points[i] = new Point2D.Double(x, y);
        }

        // 绘制坐标轴
        g2.draw(new Line2D.Double(PAD, PAD, PAD, height - PAD)); // Y轴
        g2.draw(new Line2D.Double(PAD, height - PAD, width - PAD, height - PAD)); // X轴

        // 绘制数据连线和点
        g2.setColor(Color.BLUE);
        // 先画连线
        for (int i = 0; i < points.length - 1; i++) {
            g2.draw(new Line2D.Double(points[i], points[i + 1]));
        }
        // 再画点(椭圆),放在连线上面避免被遮挡
        for (Point2D p : points) {
            g2.fill(new Ellipse2D.Double(p.getX() - 3, p.getY() - 3, 6, 6));
        }

        // 可选:给每个点加上数值标签
        g2.setColor(Color.BLACK);
        for (int i = 0; i < points.length; i++) {
            g2.drawString(String.valueOf(data[i]), (int) points[i].getX() + 5, (int) points[i].getY() - 5);
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Data Array Graph");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new Graph1());
        frame.setSize(800, 600);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

关键细节说明:

  • 坐标映射逻辑:
    • X坐标:根据数组索引均匀分布在绘图区域的水平范围内,保证所有点铺满左右边距之间的空间。
    • Y坐标:利用数据最大值把数值转换成图表的垂直位置,因为Java的坐标系原点在左上角,所以用maxValue - data[i]反转了数值,让数据越大的点越靠近图表顶部,符合我们日常看图表的习惯。
  • 绘制顺序:先画连线再画点,这样点会在连线上方,不会被挡住;如果不需要连线,直接删掉连线的循环就行。
  • 灵活调整:
    • 要改边距的话,直接修改PAD的值;
    • 如果你的X轴不是用数组索引,而是有自定义的X值数组,比如int[] xData = {1,2,3,...},把X坐标的计算换成x = PAD + (width-2*PAD)*(xData[i]-minX)/(maxX-minX)就行(记得先算xData的最大最小值);
    • 要换颜色、点的大小,直接修改对应的颜色值和椭圆的尺寸(代码里的6是直径,3是半径)。

内容的提问来源于stack exchange,提问作者nano mano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:21:39