>  기사  >  Java  >  데이터 시각화를 위해 Java에서 좌표 평면과 y축 레이블을 어떻게 회전합니까?

데이터 시각화를 위해 Java에서 좌표 평면과 y축 레이블을 어떻게 회전합니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-06 04:21:02245검색

How do I rotate the coordinate plane and y-axis labels in Java for data visualization?

Java에서 데이터 및 텍스트에 대한 좌표 평면 회전

이 문제는 데이터 포인트를 플롯하고 Y축에서 레이블을 회전하는 문제를 다룹니다. 데이터 플롯의 제공된 코드는 데이터 및 레이블을 그리기 위한 기본 구조를 정의하지만 두 가지 어려움에 직면합니다.

  • 원점 및 Y축 방향으로 인해 데이터 포인트가 잘못 표시됩니다.
  • Y- 축 레이블이 화면에 표시되지 않습니다.

문제 해결

이러한 문제를 해결하려면 다음 수정 사항에 중점을 두세요.

1. 좌표 평면 회전

다음 코드를 사용하여 좌표 평면을 회전하여 새 원점(파란색 직사각형의 왼쪽 하단 모서리)에 정렬하고 y축을 반전시킬 수 있습니다.

<code class="java">g2d.translate(leftStartPlotWindow, blueTop);//translate origin to bottom-left corner of blue rectangle
g2d.scale(1, -1);//invert the y-axis</code>

2. 데이터 플롯

데이터에 스칼라를 곱하여 회전된 좌표 평면에 맞도록 데이터를 조정합니다.

<code class="java">double Scalar = blueWidth/maxPlot;
ArrayList<Double> scaledDiffs = new ArrayList<>();
for(int e = 0;e<myDiffs.size();e++){scaledDiffs.add(myDiffs.get(e)*Scalar);}</code>

3. Y축 레이블에 대한 텍스트 회전

Y축에서 레이블을 회전하려면 다음 코드를 사용합니다.

<code class="java">g2d.rotate(Math.toRadians(-90), 0, 0);//rotate text 90 degrees counter-clockwise
g.drawString(yString, -(height/2)-(yStrWidth/2), yStrHeight);
g2d.rotate(Math.toRadians(+90), 0, 0);//rotate text 90 degrees clockwise</code>

전체 코드

이러한 조정을 통해 수정된 코드는 문제를 해결해야 합니다.

DataGUI.java

<code class="java">//... Previous code omitted for brevity
import java.awt.geom.AffineTransform;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;

class DataGUI extends JFrame{
//... Previous code omitted for brevity

    @Override
    public void paint(Graphics g) {
        // ... Previous code omitted for brevity
        int height = getHeight();
        int width = getWidth();
        ins = getInsets();

        // Obtain data about graphics environment and text
        Graphics2D g2d = (Graphics2D) g;
        FontMetrics fontMetrics = g2d.getFontMetrics();
        String xString = "x-axis Label";
        int xStrWidth = fontMetrics.stringWidth(xString);
        int xStrHeight = fontMetrics.getHeight();

        // Set parameters for the inner rectangle
        int hPad = 10;
        int vPad = 6;
        int testLeftStartPlotWindow = ins.left + 5 + (3 * yStrHeight);
        int testInnerWidth = width - testLeftStartPlotWindow - ins.right - hPad;

        // Find minimum and maximum values
        getMaxMinDiffs();
        getMaxPlotVal();

        // Determine the maximum number of ticks for the axes
        double increment = 5.0;
        int numTicks = (int) (maxPlot / increment);
        int remainder = testInnerWidth % numTicks;
        int leftStartPlotWindow = testLeftStartPlotWindow - remainder;

        // Calculate the bottom padding and blue rectangle dimensions
        int bottomPad = (3 * xStrHeight) - vPad;
        int blueTop = ins.bottom + (vPad / 2) + titleStrHeight;
        int blueHeight = height - bottomPad - blueTop;
        int blueWidth = blueHeight;
        int blueBottom = blueHeight + blueTop;

        // Start drawing
        // ... Previous code omitted for brevity

        // Scale the diffs to fit the window
        double Scalar = blueWidth / maxPlot;
        List<Double> scaledDiffs = new ArrayList<>();
        for (Double myDiff : myDiffs) {
            scaledDiffs.add(myDiff * Scalar);
        }

        // Rotate the graphics context for plotting data
        AffineTransform at = g2d.getTransform();
        g2d.translate(leftStartPlotWindow, blueTop);
        g2d.scale(1, -1);

        // Plot the scaled diffs
        for (int w = 0; w < scaledDiffs.size(); w++) {
            if (w > 0) {
                double prior = scaledDiffs.get(w - 1);
                int priorInt = (int) prior;
                double current = scaledDiffs.get(w);
                int currentInt = (int) current;
                g2d.drawOval(priorInt, currentInt, 4, 4);
            }
        }

        // Restore the transform for conventional rendering
        g2d.setTransform(at);
        // ... Rest of the code omitted for brevity
    }

    // ... Previous code omitted for brevity
}</code>

DataPanel.java

<code class="java">//... Previous code omitted for brevity

@Override
protected void paintComponent(Graphics g) {
//... Previous code omitted for brevity

int blueTop = ins.bottom+(vPad/2)+titleStrHeight;
int blueHeight = height-bottomPad-blueTop;
int blueWidth = blueHeight;
int blueBottom = blueHeight+blueTop;

//... Previous code omitted for brevity

// Rotate the graphics context for y-axis labels
g2d.rotate(Math.toRadians(-90), 0, 0);
g.drawString(yString, -(height/2)-(yStrWidth/2), yStrHeight);

// Restore the graphics context for normal rendering
g2d.rotate(Math.toRadians(+90), 0, 0);

//... Previous code omitted for brevity
}</code>

추가 리소스

그래픽 변환에 대한 자세한 내용은 다음을 참조하세요.

  • [Java 2D 그래픽](https:// docs.oracle.com/javase/8/docs/technotes/guides/2d/index.html)

위 내용은 데이터 시각화를 위해 Java에서 좌표 평면과 y축 레이블을 어떻게 회전합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.