首頁  >  文章  >  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>

完整代碼

完整代碼

完整代碼
<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>

完整代碼

<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>

完整代碼

完整代碼
完整代碼完整代碼完整代碼經過這些調整的修改後的代碼應該可以解決以下問題:DataGUI.javaDataPanel.java其他資源有關圖形轉換的更多信息,請參閱:[Java 2D Graphics](https:/ / docs.oracle.com/javase/8/docs/technotes/guides/2d/index.html)

以上是如何在Java中旋轉座標平面和y軸標籤以實現資料視覺化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn