JFreeChart图表制作实例

JFreeChart图表制作之折线图/柱形图


以共享单车为例
··折线图反映了平均每10分钟骑行的单车数量,以某两个学校在某具体时间段的数据为样本,从一天的0点到一天的24点
··柱状图反映了平均骑行单车的时间,同样以某两个学校在某时间段的数据为样本,一个柱子表示一次骑行的时间,大于100分钟算100分钟。

折线图

package 课设;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.chart.title.Title;
import org.jfree.chart.util.DefaultShadowGenerator;
import org.jfree.chart.util.ShadowGenerator;
import org.jfree.data.general.SeriesException;
import org.jfree.data.time.Second;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

public class TimlyUsedModel extends ApplicationFrame {
	private static ReadCsv ZJUTcsv = new ReadCsv("zjutSharedbike-sample.csv");
	private static ReadCsv ZJUcsv = new ReadCsv("zjuSharedbike-sample.csv");
	private static List<int[]> ZjutTimlyUsedList = ZJUTcsv.CreateTimlyUsedList2();
	private static List<int[]> ZjuTimlyUsedList = ZJUcsv.CreateTimlyUsedList2();

	public TimlyUsedModel(final String title) throws ParseException {
		super(title);
		final XYDataset dataset = createDataset();
		final JFreeChart chart = createChart(dataset);
		final ChartPanel chartPanel = new ChartPanel(chart);
		chartPanel.setPreferredSize(new java.awt.Dimension(1200, 500));
		chartPanel.setMouseZoomable(true, false);
		setContentPane(chartPanel);
	}

	private XYDataset createDataset() throws ParseException {
		final TimeSeries seriesZJUT = new TimeSeries("ZJUT");
		final TimeSeries seriesZJU = new TimeSeries("ZJU");
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		double value = 100.0;
		int Errornum1 = 0;
		int Errornum2 = 0;
		for (int i = 0; i < ZjutTimlyUsedList.size(); i++) {
			try {
				String timeStr = "2018-1-1 " + ZjutTimlyUsedList.get(i)[0] + ":" + ZjutTimlyUsedList.get(i)[1] + ":0";
				Date time = df.parse(timeStr);
				Second current = new Second(time);
				value = ZjutTimlyUsedList.get(i)[2] / 79.0;
				seriesZJUT.add(current, value);
			} catch (SeriesException e) {
				System.err.println("Error adding to series1 "+ ++Errornum1);
			}
		}

		for (int i = 0; i < ZjuTimlyUsedList.size(); i++) {
			try {
				String timeStr = "2018-1-1 " + ZjuTimlyUsedList.get(i)[0] + ":" + ZjuTimlyUsedList.get(i)[1] + ":0";
				Date time = df.parse(timeStr);
				Second current = new Second(time);
				value = ZjuTimlyUsedList.get(i)[2] / 12.0;
				seriesZJU.add(current, value);
			} catch (SeriesException e) {
				System.err.println("Error adding to series2 "+ ++Errornum2);
			}
		}
		TimeSeriesCollection collection = new TimeSeriesCollection();
		collection.addSeries(seriesZJUT);
		collection.addSeries(seriesZJU);
		return (XYDataset) collection;
	}

	private JFreeChart createChart(final XYDataset dataset) {
		JFreeChart jFreeChart = ChartFactory.createTimeSeriesChart(
				"Statistics of bike-sharing trips in a day between The ZJUT and ZJU (10 minutes)", "Time", "Times/10Minutes",
				dataset, true, true, false);
		jFreeChart.addSubtitle((Title) new TextTitle("Java Course Design"));
		XYPlot xYPlot = (XYPlot) jFreeChart.getPlot();
		xYPlot.setShadowGenerator((ShadowGenerator) new DefaultShadowGenerator());
		DateAxis dateAxis = (DateAxis) xYPlot.getDomainAxis();
		dateAxis.setLowerMargin(0); // 下方Date这个小标题
		dateAxis.setTickLabelFont(new Font("宋体", Font.BOLD, 15));
		xYPlot.setDomainCrosshairVisible(true);// 设置纵向的定位线
		xYPlot.setRangeCrosshairVisible(true);// 设置横向的定位线
		XYItemRenderer xYItemRenderer = xYPlot.getRenderer();// 折线实例
		if (xYItemRenderer instanceof XYLineAndShapeRenderer) {
			XYLineAndShapeRenderer xYLineAndShapeRenderer = (XYLineAndShapeRenderer) xYItemRenderer;
			xYLineAndShapeRenderer.setBaseStroke(new BasicStroke(3.0F));
			xYLineAndShapeRenderer.setSeriesPaint(0, new Color(1742401));// 重新设置曲线颜色为深绿
		}
		return jFreeChart;
	}

	public static void main(final String[] args) throws ParseException {
		final String title = "Time Series Management";
		final TimlyUsedModel demo = new TimlyUsedModel(title);
		demo.pack();
		RefineryUtilities.positionFrameRandomly(demo);
		demo.setVisible(true);
	}
}

在这里插入图片描述

柱形图

package 课设;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.RenderingHints;
import java.awt.Window;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Map;
import java.util.Map.Entry;

import javax.swing.JPanel;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.LegendItemSource;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.block.BlockFrame;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardXYItemLabelGenerator;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.labels.XYItemLabelGenerator;
import org.jfree.chart.labels.XYToolTipGenerator;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StackedXYBarRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.chart.title.Title;
import org.jfree.data.xy.DefaultTableXYDataset;
import org.jfree.data.xy.TableXYDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.RefineryUtilities;
import org.jfree.ui.TextAnchor;

public class UsingTimeCompareStackBar extends ApplicationFrame {
	private static ReadCsv ZJUTcsv = new ReadCsv("zjutSharedbike-sample.csv");
	private static ReadCsv ZJUcsv = new ReadCsv("zjuSharedbike-sample.csv");
	private static ReadCsv Socialcsv = new ReadCsv("SocaiSharedBike-sample.csv");
	private static Map<Integer, Integer> ZjutUsingTimeMap = ZJUTcsv.createUsingTimeMap();
	private static Map<Integer, Integer> ZjuUsingTimeMap = ZJUcsv.createUsingTimeMap();
	private static Map<Integer, Integer> SocialUsingTimeMap = Socialcsv.createUsingTimeMap();
	public UsingTimeCompareStackBar(String paramString) {
		super(paramString);
		JPanel jPanel = createDemoPanel();
		jPanel.setPreferredSize(new Dimension(1300, 500));
		setContentPane(jPanel);
	}

	private static TableXYDataset createDataset() {
		DefaultTableXYDataset Dataset = new DefaultTableXYDataset();
		XYSeries xYZJUT = new XYSeries("ZJUT", true, false);
		XYSeries xYZJU = new XYSeries("ZJU", true, false);
		XYSeries xYSocial= new XYSeries("Social", true, false);
		for (Entry<Integer, Integer> entry : ZjutUsingTimeMap.entrySet()) {
			xYZJUT.add(entry.getKey(), entry.getValue());
		}
		for (Entry<Integer, Integer> entry : ZjuUsingTimeMap.entrySet()) {
			xYZJU.add(entry.getKey(), entry.getValue());
		}
		for (Entry<Integer, Integer> entry : SocialUsingTimeMap.entrySet()) {
			xYSocial.add(entry.getKey(), entry.getValue());
		}
		Dataset.addSeries(xYZJUT);
		Dataset.addSeries(xYZJU);
//		Dataset.addSeries(xYSocial);
		return (TableXYDataset) Dataset;
	}

	private static JFreeChart createChart(TableXYDataset paramTableXYDataset) {
		NumberAxis dateAxis = new NumberAxis("Traveling Using Time");
		dateAxis.setLowerMargin(0.01D);
		dateAxis.setUpperMargin(0.01D);
		NumberAxis numberAxis = new NumberAxis("Count");
		numberAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
//		numberAxis.setUpperMargin(0.1D);
		StackedXYBarRenderer stackedXYBarRenderer = new StackedXYBarRenderer(0.15D);
		stackedXYBarRenderer.setDrawBarOutline(false);
		stackedXYBarRenderer.setBaseItemLabelsVisible(false);
		stackedXYBarRenderer.setBaseItemLabelGenerator((XYItemLabelGenerator) new StandardXYItemLabelGenerator());
		stackedXYBarRenderer.setBasePositiveItemLabelPosition(
				new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BOTTOM_CENTER));
		stackedXYBarRenderer
				.setBaseToolTipGenerator((XYToolTipGenerator) new StandardXYToolTipGenerator("{0} : {1} = {2}",
						new SimpleDateFormat("yyyy"), new DecimalFormat("0")));
		XYPlot xYPlot = new XYPlot((XYDataset) paramTableXYDataset, (ValueAxis) dateAxis, (ValueAxis) numberAxis,
				(XYItemRenderer) stackedXYBarRenderer);
		JFreeChart jFreeChart = new JFreeChart("Comparison of average time of using shared bikes between ZJUT and ZJU",
				(Plot) xYPlot);
		jFreeChart.removeLegend();
//    jFreeChart.addSubtitle((Title)new TextTitle("PGA Tour, 1983 to 2003"));
		TextTitle textTitle = new TextTitle("JAVA COURSE DESIGN", new Font("Dialog", 0, 8));
		jFreeChart.addSubtitle((Title) textTitle);
		jFreeChart.setTextAntiAlias(RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
		LegendTitle legendTitle = new LegendTitle((LegendItemSource) xYPlot);
		legendTitle.setBackgroundPaint(Color.white);
		legendTitle.setFrame((BlockFrame) new BlockBorder());
		legendTitle.setPosition(RectangleEdge.BOTTOM);
		jFreeChart.addSubtitle((Title) legendTitle);
		ChartUtilities.applyCurrentTheme(jFreeChart);
		return jFreeChart;
	}

	public static JPanel createDemoPanel() {
		JFreeChart jFreeChart = createChart(createDataset());
		return (JPanel) new ChartPanel(jFreeChart);
	}

	public static void main(String[] paramArrayOfString) {
		UsingTimeCompareStackBar stackedXYBarChartDemo2 = new UsingTimeCompareStackBar(
				"Comparison of average time of using shared bikes between ZJUT and ZJU");
		stackedXYBarChartDemo2.pack();
		RefineryUtilities.centerFrameOnScreen((Window) stackedXYBarChartDemo2);
		stackedXYBarChartDemo2.setVisible(true);
	}
}

在这里插入图片描述

有需要具体解释的或者知识点详解可以评论私我,我可以补充一些地方

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值