Java でのデータとテキストの座標平面の回転
この問題は、データ ポイントのプロットと Y 軸上のラベルの回転における課題を扱います。データプロットの。提供されたコードは、データとラベルをプロットするための基本構造を定義しますが、次の 2 つの問題に遭遇します。
問題の解決
これらの問題に対処するには、次の変更に焦点を当てましょう:
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 で座標平面と Y 軸ラベルを回転するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。