Heim  >  Artikel  >  Java  >  Wie drehe ich die Beschriftungen der Koordinatenebene und der Y-Achse in Java zur Datenvisualisierung?

Wie drehe ich die Beschriftungen der Koordinatenebene und der Y-Achse in Java zur Datenvisualisierung?

Barbara Streisand
Barbara StreisandOriginal
2024-11-06 04:21:02245Durchsuche

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

Rotierende Koordinatenebene für Daten und Text in Java

Diese Ausgabe befasst sich mit Herausforderungen beim Zeichnen von Datenpunkten und beim Drehen von Beschriftungen auf der y-Achse eines Datenplots. Der bereitgestellte Code definiert grundlegende Strukturen zum Plotten von Daten und Beschriftungen, stößt jedoch auf zwei Schwierigkeiten:

  • Datenpunkte werden aufgrund des Ursprungs und der Ausrichtung der Y-Achse falsch dargestellt.
  • Y- Achsenbeschriftungen sind auf dem Bildschirm nicht sichtbar.

Beheben der Probleme

Um diese Probleme zu beheben, konzentrieren wir uns auf die folgenden Änderungen:

1. Drehen der Koordinatenebene

Wir können die Koordinatenebene drehen, um sie am neuen Ursprung auszurichten (untere linke Ecke des blauen Rechtecks) und die y-Achse mit dem folgenden Code umkehren:

<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. Daten grafisch darstellen

Wir passen die Daten an die gedrehte Koordinatenebene an, indem wir sie mit einem Skalar multiplizieren:

<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. Rotierender Text für Y-Achsen-Beschriftungen

Um Beschriftungen auf der Y-Achse zu drehen, verwenden wir den folgenden Code:

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

Vollständiger Code

Der geänderte Code mit diesen Anpassungen sollte die Probleme beheben:

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>

Zusätzliche Ressource

Weitere Informationen zu Grafiktransformationen finden Sie unter:

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

Das obige ist der detaillierte Inhalt vonWie drehe ich die Beschriftungen der Koordinatenebene und der Y-Achse in Java zur Datenvisualisierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn