【JAVA图表】Jfreechart常用图表总结
分类:
文章
•
2023-11-30 21:14:34
柱状图:
- package chart;
-
- import java.awt.Color;
- import java.awt.Font;
- import java.util.Map;
- import java.util.Map.Entry;
- import java.util.Set;
-
- import org.jfree.chart.ChartFactory;
- import org.jfree.chart.ChartFrame;
- import org.jfree.chart.JFreeChart;
- import org.jfree.chart.axis.CategoryAxis;
- import org.jfree.chart.axis.CategoryLabelPositions;
- import org.jfree.chart.axis.NumberAxis;
- import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
- import org.jfree.chart.plot.CategoryPlot;
- import org.jfree.chart.plot.PlotOrientation;
- import org.jfree.chart.renderer.category.BarRenderer;
- import org.jfree.chart.title.TextTitle;
- import org.jfree.data.category.DefaultCategoryDataset;
-
- /**
- * @author shenchao
- * 柱状图
- */
- public class BarChart {
-
- public BarChart() {
- Map<String,Integer> map = initDataSet();
- showChart(map);
- }
-
- /**
- * 初始化数据集
- * 柱状图的数据集接受三个参数,第一个参数为柱子的高度,第二个为几个类别进行比较,第三个为共有几组数据
- *
- * @return
- */
- private Map<String, Integer> initDataSet() {
- return null;
- }
-
- /**
- * @param map
- */
- private void showChart(Map<String, Integer> map) {
- // 创建饼图数据对象
- DefaultCategoryDataset dataset = new DefaultCategoryDataset();
- Set<Entry<String, Integer>> set = map.entrySet();
- for (Entry<String, Integer> entry : set) {
- dataset.setValue(entry.getValue(), "评论数量",entry.getKey());
- }
-
- JFreeChart chart = ChartFactory.createBarChart3D("评论次数TOP10", "好友昵称",
- "评论数量", dataset, PlotOrientation.VERTICAL, false, true, true);
- ChartFrame frame = new ChartFrame("评论次数TOP10", chart, true);
- // 自定义设定背景色
- // chart.setBackgroundPaint(Color.getHSBColor(23,192,223));
- chart.setBackgroundPaint(Color.WHITE);
- // 获得 plot:3dBar为CategoryPlot
- CategoryPlot categoryPlot = chart.getCategoryPlot();
- // 设定图表数据显示部分背景色
- categoryPlot.setBackgroundPaint(Color.WHITE);
- // 横坐标网格线
- categoryPlot.setDomainGridlinePaint(Color.GRAY);
- // 设置网格线可见
- categoryPlot.setDomainGridlinesVisible(true);
- // 纵坐标网格线
- categoryPlot.setRangeGridlinePaint(Color.GRAY);
- // 重要的类,负责生成各种效果
- // BarRenderer3D renderer=(BarRenderer3D) categoryPlot.getRenderer();
- // 获取纵坐标
- NumberAxis numberaxis = (NumberAxis) categoryPlot.getRangeAxis();
-
- // 设置纵坐标的标题字体和大小
- numberaxis.setLabelFont(new Font("黑体", Font.CENTER_BASELINE, 16));
- // 设置丛坐标的坐标值的字体颜色
- numberaxis.setLabelPaint(Color.BLACK);
- // 设置丛坐标的坐标轴标尺颜色
- numberaxis.setTickLabelPaint(Color.BLACK);
- // 坐标轴标尺颜色
- numberaxis.setTickMarkPaint(Color.BLUE);
- // 丛坐标的默认间距值
- // numberaxis.setAutoTickUnitSelection(true);
- // 设置丛坐标间距值
- numberaxis.setAutoTickUnitSelection(true);
- // numberaxis.setTickUnit(new NumberTickUnit(150));
-
- //在柱体的上面显示数据
- BarRenderer custombarrenderer3d = new BarRenderer();
- custombarrenderer3d.setBaseItemLabelPaint(Color.BLACK);//数据字体的颜色
- custombarrenderer3d.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
- custombarrenderer3d.setBaseItemLabelsVisible(true);
- categoryPlot.setRenderer(custombarrenderer3d);
-
-
- // 获取横坐标
- CategoryAxis domainAxis = categoryPlot.getDomainAxis();
- // 设置横坐标的标题字体和大小
- domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 16));
- // 设置横坐标的坐标值的字体颜色
- domainAxis.setTickLabelPaint(Color.GRAY);
- // 设置横坐标的坐标值的字体
- domainAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 16));
- // 设置横坐标的显示
- domainAxis.setCategoryLabelPositions(CategoryLabelPositions
- .createUpRotationLabelPositions(0.4));
- // 这句代码解决了底部汉字乱码的问题
- // chart.getLegend().setItemFont(new Font("黑体", 0, 16));
- // 设置图例标题
- Font font = new java.awt.Font("黑体", java.awt.Font.CENTER_BASELINE, 20);
- TextTitle title = new TextTitle("谁是评论你最多的人?");
- title.getBackgroundPaint();
- title.setFont(font);
- // 设置标题的字体颜色
- chart.setTitle(title);
- frame.pack();
- frame.setVisible(true);
- }
-
- }

折线图:
- package chart;
-
- import java.awt.BasicStroke;
- import java.awt.Color;
- import java.awt.Font;
- import java.util.Map;
- import java.util.Map.Entry;
- import java.util.Set;
- import org.jfree.chart.ChartFactory;
- import org.jfree.chart.ChartFrame;
- import org.jfree.chart.JFreeChart;
- import org.jfree.chart.axis.CategoryAxis;
- import org.jfree.chart.axis.NumberAxis;
- import org.jfree.chart.axis.ValueAxis;
- import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
- import org.jfree.chart.plot.CategoryPlot;
- import org.jfree.chart.plot.PlotOrientation;
- import org.jfree.chart.renderer.category.LineAndShapeRenderer;
- import org.jfree.data.category.DefaultCategoryDataset;
-
- public class LineChart {
-
- public LineChart() {
- Map<Integer, Integer> map = initDataSet();
- showChart(map);
- }
-
- /**
- * 初始化数据集
- * 柱状图的数据集接受三个参数,第一个参数为柱子的高度,第二个为几个类别进行比较,第三个为共有几组数据
- *
- * @return
- */
- private Map<Integer, Integer> initDataSet() {
- return null;
- }
-
- private void showChart(Map<Integer, Integer> map) {
- // 创建饼图数据对象
- DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
- Set<Entry<Integer, Integer>> set = map.entrySet();
- for (Entry<Integer, Integer> entry : set) {
- dataSet.setValue(entry.getValue(), "数量", entry.getKey());
- }
-
- // 如果把createLineChart改为createLineChart3D就变为了3D效果的折线图
- JFreeChart chart = ChartFactory.createLineChart("每年说说的发布量", "年份", "数目",
- dataSet, PlotOrientation.VERTICAL, // 绘制方向
- false, // 显示图例
- true, // 采用标准生成器
- false // 是否生成超链接
- );
- ChartFrame frame = new ChartFrame("图表标题", chart, true);
- chart.setBackgroundPaint(Color.WHITE);// 设置背景色
- // 获取绘图区对象
- CategoryPlot plot = chart.getCategoryPlot();
- plot.setBackgroundPaint(Color.WHITE); // 设置绘图区背景色
- plot.setRangeGridlinePaint(Color.GRAY); // 设置水平方向背景线颜色
- plot.setRangeGridlinesVisible(true);// 设置是否显示水平方向背景线,默认值为true
- plot.setDomainGridlinePaint(Color.GRAY); // 设置垂直方向背景线颜色
- plot.setDomainGridlinesVisible(true); // 设置是否显示垂直方向背景线,默认值为false
-
- CategoryAxis domainAxis = plot.getDomainAxis();
- domainAxis.setLowerMargin(0.01);// 左边距 边框距离
- domainAxis.setUpperMargin(0.06);// 右边距 边框距离,防止最后边的一个数据靠近了坐标轴。
- domainAxis.setMaximumCategoryLabelLines(2);
- domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 16));
-
- ValueAxis rangeAxis = plot.getRangeAxis();
- rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());// Y轴显示整数
- rangeAxis.setAutoRangeMinimumSize(1); // 最小跨度
- rangeAxis.setUpperMargin(0.18);// 上边距,防止最大的一个数据靠近了坐标轴。
- rangeAxis.setLowerBound(0); // 最小值显示0
- rangeAxis.setAutoRange(false); // 不自动分配Y轴数据
- rangeAxis.setTickMarkStroke(new BasicStroke(1.6f)); // 设置坐标标记大小
- rangeAxis.setTickMarkPaint(Color.BLACK); // 设置坐标标记颜色
- rangeAxis.setLabelFont(new Font("宋体", Font.PLAIN, 16));
-
- // 获得renderer 注意这里是下嗍造型到lineandshaperenderer!!
- LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) plot
- .getRenderer();
- lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见
-
- lineandshaperenderer.setBaseLinesVisible(true);
- // 显示折点数据
- lineandshaperenderer
- .setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
- lineandshaperenderer.setBaseItemLabelsVisible(true);
-
- frame.pack();
- frame.setVisible(true);
- }
- }

饼图:
- package chart;
-
- import java.awt.BasicStroke;
- import java.awt.Color;
- import java.awt.Font;
- import java.util.Map;
- import java.util.Map.Entry;
- import java.util.Set;
- import org.jfree.chart.ChartFactory;
- import org.jfree.chart.ChartFrame;
- import org.jfree.chart.JFreeChart;
- import org.jfree.chart.labels.StandardPieToolTipGenerator;
- import org.jfree.chart.plot.PiePlot3D;
- import org.jfree.chart.title.TextTitle;
- import org.jfree.data.general.DefaultPieDataset;
-
- /**
- * @author shenchao
- * 饼图
- */
- public class PieChart {
-
- public PieChart() {
- Map<String,Integer> map = initDataSet();
- showChart(map);
- }
-
-
- /**
- * 饼图接受的数据集要求是键值对<br>
- *
- * 可以在这里初始化数据集
- * @return map
- */
- private Map<String,Integer> initDataSet() {
- return null;
- }
-
- /**
- * 显示图表
- * @param map
- */
- private void showChart(Map<String, Integer> map) {
-
- // 创建饼图数据对象
- DefaultPieDataset dfp = new DefaultPieDataset();
- Set<Entry<String, Integer>> set = map.entrySet();
- for (Entry<String, Integer> entry : set) {
- dfp.setValue(entry.getKey(), entry.getValue());
- }
- // createpieChart3D创建3D饼图
- JFreeChart chart = ChartFactory.createPieChart3D("窗口标题",
- dfp, true, true, true);
- // 图片背景色
- chart.setBackgroundPaint(Color.white);
- // 设置标题文字
- ChartFrame frame = new ChartFrame("窗口标题", chart, true);
- // 取得3D饼图对象
- PiePlot3D plot = (PiePlot3D) chart.getPlot();
- // 图形边框颜色
- plot.setBaseSectionOutlinePaint(Color.WHITE);
- // 图形边框粗细
- plot.setBaseSectionOutlineStroke(new BasicStroke(1.0f));
- // 指定图片的透明度(0.0-1.0)
- plot.setForegroundAlpha(0.45f);
- // 指定显示的饼图上圆形(false)还椭圆形(true)
- plot.setCircular(true);
- // 设置第一个 饼块section 的开始位置,默认是12点钟方向
- plot.setStartAngle(360);
- // 设置鼠标悬停提示
- plot.setToolTipGenerator(new StandardPieToolTipGenerator());
- // 设置饼图各部分标签字体
- plot.setLabelFont(new Font("微软雅黑", Font.ITALIC, 16));
- // 设置分饼颜色
- plot.setSectionPaint(0, new Color(244, 194, 144));
- // 定义字体格式
- Font font = new java.awt.Font("黑体", java.awt.Font.CENTER_BASELINE,20);
- TextTitle title = new TextTitle("图表标题");
- title.setFont(font);
- // 设置字体,非常关键不然会出现乱码的,下方的字体
- chart.setTitle(title);
- frame.pack();
- frame.setVisible(true);
- }
-
- }

散点图:
- package chart;
-
- import java.awt.BasicStroke;
- import java.awt.Color;
- import java.util.List;
- import java.util.Map;
- import java.util.Map.Entry;
-
- import org.jfree.chart.ChartFactory;
- import org.jfree.chart.ChartFrame;
- import org.jfree.chart.JFreeChart;
- import org.jfree.chart.axis.NumberAxis;
- 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.DefaultXYDataset;
-
- /**
- * @author shenchao 散点图
- */
- public class ScatterPlotChart {
-
- public ScatterPlotChart() {
- Map<Integer,List<Data>> map = initDataSet();
- showChart(map);
- }
-
- /**
- * 这里的Data类是数据的封装,可以安装实际需求实现,map集合的键为类别
- */
- private Map<Integer, List<Data>> initDataSet() {
- return null;
- }
-
- public void showChart(Map<Integer,List<Data>> map) {
-
- DefaultXYDataset xydataset = new DefaultXYDataset();
-
- //根据类别建立数据集
- for (Entry<Integer, List<Data>> entry : map.entrySet()) {
- List<Data> l = entry.getValue();
-
- int size = l.size();
- //散点图要求数据集为二维数组
- double[][] datas = new double[2][size];
- for (int i = 0; i < size; i++) {
- Data data = l.get(i);
- datas[0][i] = data.getDistance();
- datas[1][i] = data.getIcecream();
- }
- xydataset.addSeries(entry.getKey(), datas);
- }
-
- JFreeChart chart = ChartFactory.createScatterPlot("散点图", "每年获取的飞行常客里程数", "每周所消费的冰淇淋公升数", xydataset, PlotOrientation.VERTICAL, true, false, false);
- ChartFrame frame = new ChartFrame("散点图", chart, true);
- chart.setBackgroundPaint(Color.white);
- chart.setBorderPaint(Color.GREEN);
- chart.setBorderStroke(new BasicStroke(1.5f));
- XYPlot xyplot = (XYPlot) chart.getPlot();
-
- xyplot.setBackgroundPaint(new Color(255, 253, 246));
- ValueAxis vaaxis = xyplot.getDomainAxis();
- vaaxis.setAxisLineStroke(new BasicStroke(1.5f));
-
- ValueAxis va = xyplot.getDomainAxis(0);
- va.setAxisLineStroke(new BasicStroke(1.5f));
-
- va.setAxisLineStroke(new BasicStroke(1.5f)); // 坐标轴粗细
- va.setAxisLinePaint(new Color(215, 215, 215)); // 坐标轴颜色
- xyplot.setOutlineStroke(new BasicStroke(1.5f)); // 边框粗细
- va.setLabelPaint(new Color(10, 10, 10)); // 坐标轴标题颜色
- va.setTickLabelPaint(new Color(102, 102, 102)); // 坐标轴标尺值颜色
- ValueAxis axis = xyplot.getRangeAxis();
- axis.setAxisLineStroke(new BasicStroke(1.5f));
-
- XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) xyplot
- .getRenderer();
- xylineandshaperenderer.setSeriesOutlinePaint(0, Color.WHITE);
- xylineandshaperenderer.setUseOutlinePaint(true);
- NumberAxis numberaxis = (NumberAxis) xyplot.getDomainAxis();
- numberaxis.setAutoRangeIncludesZero(false);
- numberaxis.setTickMarkInsideLength(2.0F);
- numberaxis.setTickMarkOutsideLength(0.0F);
- numberaxis.setAxisLineStroke(new BasicStroke(1.5f));
-
- frame.pack();
- frame.setVisible(true);
- }
-
- }
