JFreeChart生成坐标曲线图

<dependency>
    <groupId>org.jfree</groupId>
    <artifactId>jfreechart</artifactId>
    <version>1.5.4</version>
</dependency>
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.io.IOException;
import javax.swing.SwingUtilities;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtils;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
	 * 	生成坐标曲线图(1条或多条均可绘制)
	 * @param dataset 数据集,根据此数据集,可绘制1条曲线或多条曲线
	 * @param title 曲线图的标题,例如:2024-09-10 报告汇总
	 * @param xReason X轴的释义说明,例如:时间
	 * @param yReason Y轴的释义说明,例如:数量
	 * @param fileLocalPath 生成的图片存储路径,例如:G:\test\a.jpeg
	 */
	public static void getLineChart(XYSeriesCollection dataset, String title, String xReason, String yReason, String fileLocalPath){
		
		SwingUtilities.invokeLater(() -> {
			
        	//中文乱码处理方法
        	//创建主题样式  
        	StandardChartTheme standardChartTheme=new StandardChartTheme("CN");  
        	//设置标题字体 
        	standardChartTheme.setExtraLargeFont(new Font("隶书",Font.BOLD,20));  
        	//设置图例的字体  
        	standardChartTheme.setRegularFont(new Font("宋书",Font.PLAIN,15));  
        	//设置轴向的字体  
        	standardChartTheme.setLargeFont(new Font("宋书",Font.PLAIN,15));  
        	//应用主题样式  
        	ChartFactory.setChartTheme(standardChartTheme);

            // 创建图表
            JFreeChart chart = ChartFactory.createXYLineChart(
            	title,  // 图表标题
            	xReason,              // X轴标签
            	yReason,              // Y轴标签
                dataset,              // 数据集
                org.jfree.chart.plot.PlotOrientation.VERTICAL, // 图表方向
                true,                 // 包含图例
                true,                 // 生成工具提示
                false                 // 生成 URL
            );
            
            final XYPlot plot = chart.getXYPlot( );
            NumberAxis na = (NumberAxis)plot.getDomainAxis();//x轴整数显示
            na.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
			
			//图表上显示坐标点的数值, 这里显示的是Y轴的数值,根据您的需求
            XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true, true);
            renderer.setSeriesItemLabelGenerator(0, new org.jfree.chart.labels.XYItemLabelGenerator() {
                @Override
                public String generateLabel(org.jfree.data.xy.XYDataset dataset, int series, int item) {
                	//显示y轴
                	return String.format("%d", (int)dataset.getYValue(series, item));
                	//显示x、y轴
                	//return String.format("(%d, %d)", (int)dataset.getXValue(series, item), (int)dataset.getYValue(series, item));
                }
            });
            renderer.setSeriesItemLabelGenerator(1, new org.jfree.chart.labels.XYItemLabelGenerator() {
                @Override
                public String generateLabel(org.jfree.data.xy.XYDataset dataset, int series, int item) {
                	//显示y轴
                	return String.format("%d", (int)dataset.getYValue(series, item));
                	//显示x、y轴
                	//return String.format("(%d, %d)", (int)dataset.getXValue(series, item), (int)dataset.getYValue(series, item));
                }
            });
            renderer.setDefaultItemLabelFont(new java.awt.Font("SansSerif", java.awt.Font.PLAIN, 16));
            renderer.setDefaultItemLabelsVisible(true);
			
			//设置折线的线条粗细
            renderer.setSeriesPaint( 0 , Color.GREEN );
            renderer.setSeriesPaint( 1 ,  Color.RED);
            renderer.setSeriesStroke( 0 , new BasicStroke( 4.0f ) );
            renderer.setSeriesStroke( 1 , new BasicStroke( 3.0f ) );
            plot.setRenderer( renderer );
            
            TextTitle textTitle = chart.getTitle();   
        	textTitle.setFont(new Font("宋体",Font.BOLD,20));
        	
        	LegendTitle legend = chart.getLegend();   
        	if (legend!=null) {
        		legend.setItemFont(new Font("宋体", Font.BOLD, 20));   
        	}
            //保存图片到本地
            File file = new File(fileLocalPath);
            int width = 800;
            int height = 600;
            try {
				ChartUtils.saveChartAsJPEG(file, chart, width, height);
			} catch (IOException e) {
				e.printStackTrace();
			}
        });
	}

//调用示例
public static void main(String[] args) {
		XYSeriesCollection dataset = new XYSeriesCollection();
		XYSeries series1 = new XYSeries("mmm数量");
		series1.add(1, 10);
		series1.add(2, 20);
		series1.add(3, 15);
		series1.add(4, 40);
		series1.add(5, 50);
		XYSeries series2 = new XYSeries("nnn数量");
		series2.add(1, 15);
		series2.add(2, 25);
		series2.add(3, 35);
		series2.add(4, 23);
		series2.add(5, 55);
		dataset.addSeries(series1);
		dataset.addSeries(series2);
		String title = "2024-09-10 报告汇总";
		String xReason = "X轴---时间";
		String yReason = "Y轴---数量";
		String fileLocalPath = "G:\\test\\a.jpeg";
		getLineChart(dataset, title, xReason, yReason, fileLocalPath);
	}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值