Rumah  >  Artikel  >  Java  >  Bagaimana untuk Menganotasi Fail PNG dengan Kapak dan Label di Java?

Bagaimana untuk Menganotasi Fail PNG dengan Kapak dan Label di Java?

DDD
DDDasal
2024-11-07 05:51:02138semak imbas

How to Annotate a PNG File with Axes and Labels in Java?

Cara Menganotasi Fail PNG dengan Kapak dan Label dalam Java

Menambah paksi dan label pada imej PNG sedia ada boleh mencabar. Daripada mencuba pengubahsuaian yang boleh membawa kepada ralat dan ketidakkonsistenan, adalah disyorkan untuk menyepadukan anotasi semasa proses penciptaan carta.

Menyesuaikan Kapak dan Label Menggunakan JFreeChart

JFreeChart menyediakan API komprehensif untuk menyesuaikan rupa carta, termasuk paksi dan label. Contoh berikut menggambarkan cara membuat carta tersuai dengan anotasi yang disesuaikan:

<code class="java">import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class ResponseTime {

    private static final int N = 600;
    private static final String title = "ResponseTime";
    private static final Random random = new Random();
    private static final Shape circle = new Ellipse2D.Double(-3, -3, 6, 6);
    private static final Color line = Color.gray;

    private ChartPanel createPanel() {
        JFreeChart chart = ChartFactory.createXYLineChart(
            title, "Elapsed Time (secs)", "Response Time (secs)",
            createDataset(), PlotOrientation.VERTICAL, true, true, false);
        XYPlot plot = chart.getXYPlot();
        MyRenderer renderer = new MyRenderer(true, true, N);
        plot.setRenderer(renderer);
        renderer.setSeriesShape(0, circle);
        renderer.setSeriesPaint(0, line);
        renderer.setUseFillPaint(true);
        renderer.setSeriesShapesFilled(0, true);
        renderer.setSeriesShapesVisible(0, true);
        renderer.setUseOutlinePaint(true);
        renderer.setSeriesOutlinePaint(0, line);
        ValueAxis range = plot.getRangeAxis();
        range.setLowerBound(0.5);
        return new ChartPanel(chart);
    }

    private static class MyRenderer extends XYLineAndShapeRenderer {

        private List<Color> clut;

        public MyRenderer(boolean lines, boolean shapes, int n) {
            super(lines, shapes);
            clut = new ArrayList<>(n);
            for (int i = 0; i < n; i++) {
                clut.add(Color.getHSBColor((float) i / n, 1, 1));
            }
        }

        @Override
        public Paint getItemFillPaint(int row, int column) {
            return clut.get(column);
        }
    }

    private XYDataset createDataset() {
        XYSeriesCollection result = new XYSeriesCollection();
        XYSeries series = new XYSeries("Series 1");
        for (double x = 0; x < N - 1; x++) {
            series.add(x, f(x));
        }
        series.add(25, 1.75); // outlier
        result.addSeries(series);
        return result;
    }

    private double f(double x) {
        double y = 0.004 * x + .75;
        return y + random.nextGaussian() * y / 10;
    }

    private void display() {
        JFrame f = new JFrame(title);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(createPanel());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ResponseTime().display();
            }
        });
    }
}</code>

Pendekatan ini membolehkan anda mengawal setiap aspek carta, termasuk gaya dan peletakan paksi, label dan elemen plot.

Item Individu Pengekodan Warna

Untuk kod warna item individu, JFreeChart menyediakan kaedah getItemFillPaint() dalam kelas XYLineAndShapeRenderer. Begini cara untuk menggunakannya:

<code class="java">private static class MyRenderer extends XYLineAndShapeRenderer {

    private List<Color> clut;

    public MyRenderer(boolean lines, boolean shapes, int n) {
        super(lines, shapes);
        clut = new ArrayList<>(n);
        for (int i = 0; i < n; i++) {
            clut.add(Color.getHSBColor((float) i / n, 1, 1));
        }
    }

    @Override
    public Paint getItemFillPaint(int row, int column) {
        return clut.get(column);
    }
}</code>

Dengan mengatasi kaedah ini, anda boleh menentukan warna tersuai untuk setiap item dalam carta. Kaedah Color.getHSBColor() digunakan untuk menjana spektrum penuh warna.

Dengan mengikuti teknik ini, anda boleh membuat carta tersuai dengan anotasi yang memenuhi keperluan khusus anda.

Atas ialah kandungan terperinci Bagaimana untuk Menganotasi Fail PNG dengan Kapak dan Label di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn