如何将轴放在 java 中的 .png 文件上? [英] How can I put axis on a .png file in java?

查看:28
本文介绍了如何将轴放在 java 中的 .png 文件上?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有带有数据的chart.png,我想在简单的X-Y轴上加上一些标签.我也想尽量不使用任何非 java 自带的外部软件.我被允许使用
(来源:goldb.org)

这个图表只是一个例子,它看起来与我的实际图表完全不同……我的真实图表可以包含每个 rgb 颜色值.我知道如何创建绘图,我只是不知道如何在我创建的 BufferImage 上放置轴/标签

解决方案

我不认为修改静态图像会很好,因为它不可避免地会导致配准错误和样式不匹配.相反,将任何渲染集成到图表的创建中.使用此处概述的方法,sscce 下面说明了一些根据需要自定义渲染形状、颜色和轴的方法.

附录:要为单个项目着色,API 推荐使用此处所示的方法,其中自定义渲染器覆盖 getItemPaint().Color.getHSBColor() 用于创建全光谱的颜色.

这是用于比较的原始默认渲染器:

import java.awt.Color;导入 java.awt.EventQueue;导入 java.awt.Paint;导入 java.awt.Shape;导入 java.awt.geom.Ellipse2D;导入 java.util.ArrayList;导入 java.util.List;导入 java.util.Random;导入 javax.swing.JFrame;导入 org.jfree.chart.ChartFactory;导入 org.jfree.chart.ChartPanel;导入 org.jfree.chart.JFreeChart;导入 org.jfree.chart.axis.ValueAxis;导入 org.jfree.chart.plot.PlotOrientation;导入 org.jfree.chart.plot.XYPlot;导入 org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;导入 org.jfree.data.xy.XY 数据集;导入 org.jfree.data.xy.XYSeries;导入 org.jfree.data.xy.XYSeriesCollection;/** @see https://stackoverflow.com/q/9843451/230513 */公共类响应时间{私有静态最终 int N = 600;private static final String title = "ResponseTime";私有静态最终随机随机=新随机();private static final Shape circle = new Ellipse2D.Double(-3, -3, 6, 6);private static final Color line = Color.gray;私人 ChartPanel createPanel() {JFreeChart 图表 = ChartFactory.createXYLineChart(标题,经过时间(秒)",响应时间(秒)",createDataset(), PlotOrientation.VERTICAL, true, true, false);XYPlot 图 = chart.getXYPlot();MyRenderer 渲染器 = new MyRenderer(true, true, N);plot.setRenderer(渲染器);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);返回新的图表面板(图表);}私有静态类 MyRenderer 扩展 XYLineAndShapeRenderer {私人列表<颜色>离合器;公共 MyRenderer(布尔线,布尔形状,int n){超级(线条,形状);clut = new ArrayList<颜色>(n);for (int i = 0; i < n; i++) {clut.add(Color.getHSBColor((float) i/n, 1, 1));}}@覆盖public Paint getItemFillPaint(int row, int column) {返回 clut.get(column);}}私人 XYDataset createDataset() {XYSeriesCollection 结果 = 新的 XYSeriesCollection();XYSeries 系列 = new XYSeries("系列 1");for (double x = 0; x 

I have chart.png with data in it that I would like to put a simple X - Y axis on with some labeling. I also would like to try not to use any external software that doesn't come with java. I'm allowed to use jfreechart but if there is a way to make it look nice, while just using some plan java code, that would be better. Does anyone have a good idea about how to do this sort of thing?

Update: Something like this but the data would be color coded with rgb values and of course there would be no axis / labeling.


(source: goldb.org)

This graph is just an example it looks nothing like what my actual graphs look like... My real graphs can have every rgb color value in them. I know how to create the plot, I just don't know how to put axis / labeling on the BufferImage that I've created

解决方案

I don't think modifying a static image will work very well, as it will inevitably lead to registration errors and mismatched styles. Instead, integrate any rendering into the chart's creation. Using the approach outlined here, the sscce below illustrates a few of the ways to customize the rendered shapes, colors and axes as desired.

Addendum: To color individual items, the API recommends the approach shown here, in which a custom renderer overrides getItemPaint(). Color.getHSBColor() is used to create a full spectrum of colors.

Here is the original, default renderer for comparison:

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Paint;
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;

/** @see https://stackoverflow.com/q/9843451/230513 */
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<Color>(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();
            }
        });
    }
}

这篇关于如何将轴放在 java 中的 .png 文件上?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆