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

我有chart.png,其中有数据,我想用一些标签放一个简单的X – Y轴。 我也想尝试不使用任何没有附带java的外部软件。 我被允许使用jfreechart但是如果有办法使它看起来不错,而只是使用一些计划java代码,那会更好。 有没有人对如何做这类事情有个好主意?

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

pyplot延迟示例http://sofzh.miximages.com/java/pylot_latency_sample.png

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

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

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

响应时间表

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

响应时间表

 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 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(); } }); } } 

我认为jfreechart库是实现报告的正确方法。

但是如果你只是在寻找代码来在图像上绘制一些标签,那么就是这样。

 public static void main(String[] args) throws IOException { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setSize(800, 600); BufferedImage modifiedImg = ImageIO.read(new File("c:\\test.png")); Graphics graphics = modifiedImg.getGraphics(); graphics.setColor(Color.red); graphics.drawString("Label", 100, 100);// draw text graphics.drawLine(1, 100, 100, 100);// draw line JLabel label = new JLabel(); label.setIcon(new ImageIcon(modifiedImg)); frame.getContentPane().add(label, BorderLayout.CENTER); frame.setVisible(true); } 

我不使用jfreechart,我们使用的是Jide,他们得到了一些可爱的图表库。 除了价格,我喜欢它,但无论如何老板付了钱。 您可以在此处查看屏幕截图: http : //www.jidesoft.com/products/charts.htm

我将图像读入BufferedImage ,然后在图像的Graphics实例上使用drawXxxx()方法。

然后将该图像写回文件或以某些gui显示。

据我所知,这将是非常困难的。 准备好图像后,您可以在其上绘制任何其他内容,但是如何计算单位以使其与图像成比例? 如何在以后布局整个图像? 使用像jfreechart这样的图表工具,您可以自由地使用标签,轴和单位进行游戏。 但是,在实际创建图表之后绘制它们时,事情会变得非常复杂。 我不知道你为什么要自己绘制轴,或者你是否要在网上展示这些图表。 我确实发现使用jfreechart生成的图表有时在网页上看起来不太好 – 文本看起来很模糊,字体颜色与同一页面上的其他文本不匹配。

如果您要将它们放在网页上,另一种选择是使用Javascript从服务器检索数据并在客户端动态绘制图表。