如何将axis放在java中的.png文件中?
我有一个chart.png,里面有数据,我想用一些标签在上面放一个简单的X-Y轴。我还希望尽量不使用任何不随java提供的外部软件。我可以使用,但如果有一种方法可以让它看起来很漂亮,而只是使用一些PlanJava代码,那就更好了。有人知道怎么做这类事情吗 更新:类似这样,但是数据将用rgb值进行颜色编码,当然没有轴/标签如何将axis放在java中的.png文件中?,java,swing,png,jfreechart,axis-labels,Java,Swing,Png,Jfreechart,Axis Labels,我有一个chart.png,里面有数据,我想用一些标签在上面放一个简单的X-Y轴。我还希望尽量不使用任何不随java提供的外部软件。我可以使用,但如果有一种方法可以让它看起来很漂亮,而只是使用一些PlanJava代码,那就更好了。有人知道怎么做这类事情吗 更新:类似这样,但是数据将用rgb值进行颜色编码,当然没有轴/标签 (来源:) 这张图只是一个例子,它和我的实际图完全不一样。。。我的真实图形中可以包含所有rgb颜色值。我知道如何创建绘图,只是不知道如何在我创建的BufferImage上放置
(来源:)
这张图只是一个例子,它和我的实际图完全不一样。。。我的真实图形中可以包含所有rgb颜色值。我知道如何创建绘图,只是不知道如何在我创建的
BufferImage上放置轴/标签,我将图像读入BufferedImage
,然后在图像的Graphics
实例上使用drawXxxx()
方法
然后,要么将该图像写回文件,要么将其显示在某个gui中。据我所知,这将非常困难。准备好图像后,您可以在上面绘制任何其他内容,但如何计算单位以使其与图像成比例?以后如何布局整个图像?使用jfreechart这样的图表工具,您可以自由地使用标签、轴和单位。但是当在图表实际创建之后绘制它们时,事情会复杂得多。我不知道你们为什么要自己画axis,也不知道你们是否要在网上展示这些图表。我确实发现用jfreechart生成的图表有时在网页上看起来不太好看——文本看起来模糊,字体颜色与同一页面上的其他文本不匹配
如果要将它们放在web页面上,另一种选择是使用Javascript从服务器检索数据,并在客户端动态绘制图表 我认为修改静态图像不会很好,因为它将不可避免地导致注册错误和样式不匹配。相反,将任何渲染集成到图表的创建中。使用概述的方法,下面演示了一些根据需要自定义渲染形状、颜色和轴的方法
附录:为了给单个项目上色,API推荐所示的方法,其中自定义渲染器覆盖<代码>颜色。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<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.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.XYDataset;
导入org.jfree.data.xy.XYSeries;
导入org.jfree.data.xy.XYSeriesCollection;
/**@见https://stackoverflow.com/q/9843451/230513 */
公共课堂反应时间{
专用静态最终整数N=600;
私有静态最终字符串title=“ResponseTime”;
私有静态最终随机=新随机();
专用静态最终形状圆=新椭圆2d.Double(-3,-3,6,6);
专用静态最终颜色线=Color.gray;
私有ChartPanel createPanel(){
JFreeChart chart=ChartFactory.createXYLineChart(
标题,“运行时间(秒)”,“响应时间(秒)”,
createDataset(),PlotOrientation.VERTICAL,true,true,false);
XYPlot=chart.getXYPlot();
MyRenderer=新的MyRenderer(true、true、N);
plot.setRenderer(渲染器);
渲染器.setSeriesShape(0,圆);
渲染器.setSeriesPaint(0,行);
renderer.setUseFillPaint(true);
renderer.setSeriesShapesFilled(0,true);
renderer.SetSeriessShapesVisible(0,true);
renderer.setUseOutlinePaint(true);
渲染器.setSeriesOutlinePaint(0,线);
ValueAxis范围=plot.getRangeAxis();
设置下限范围(0.5);
返回新的图表面板(图表);
}
私有静态类MyRenderer扩展了XYLineAndShapeRenderer{
私人名单俱乐部;
公共MyRenderer(布尔线、布尔形状、int n){
超级(线条、形状);
clut=新阵列列表(n);
对于(int i=0;i
我认为jfreechart库是实现报告的正确方法
但是如果你只是在寻找代码来画一些la
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);
}