ホームページ  >  記事  >  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 軸上のラベルの回転における課題を扱います。データプロットの。提供されたコードは、データとラベルをプロットするための基本構造を定義しますが、次の 2 つの問題に遭遇します。

  • 原点と 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 Graphics](https:// docs.oracle.com/javase/8/docs/technotes/guides/2d/index.html)

以上がデータ視覚化のために Java で座標平面と Y 軸ラベルを回転するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。