gpt4 book ai didi

java - 如何在 java 中将轴放在 .png 文件上?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:04:16 24 4
gpt4 key购买 nike

我有 chart.png 里面有数据,我想在上面放一个简单的 X - Y 轴并加上一些标签。我也想尽量不要使用任何非java自带的外部软件。我可以使用 jfreechart但是如果有办法让它看起来不错,同时只使用一些计划 java 代码,那会更好。有没有人知道如何做这类事情?

更新:类似这样,但数据将使用 rgb 值进行颜色编码,当然不会有轴/标签。

pyplot latency example
(来源:goldb.org)

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

最佳答案

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

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

Response Time chart

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

Response Time chart

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 - 如何在 java 中将轴放在 .png 文件上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9843451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com