package cn.qiuzhping.jfreecharts;
import java.awt.Color;
import java.awt.Font;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.ui.TextAnchor;
import org.jfree.util.Rotation;
import www.huarui.biz.hibernate.Eventlevel;
import www.huarui.biz.hibernate.Eventrange;
import www.huarui.biz.hibernate.Eventtype;
import www.huarui.biz.hibernate.HibernateUtil;
public class Charts {
private StandardChartTheme standardChartTheme = null;// 标准的主题样式
private static Session session = null;
private int typeId[];
public int[] getTypeId() {
return typeId;
}
public void setTypeId(int[] typeId) {
this.typeId = typeId;
}
public Charts() {
System.out.println("--------正常启动Charts服务------" + new Date());
this.standardChartTheme = new StandardChartTheme("CN");
}
@SuppressWarnings("unchecked")
public List getList(String hql) {
session = HibernateUtil.getSession();
if (hql != null && session != null) {
session.beginTransaction();
List list = session.createQuery(hql).list();
session.close();
return list;
}
return null;
}
public String[] getRowKeys(String filter) {
int[] typeId = getTypeId();
if (filter != null && !filter.trim().equals("") && typeId != null) {
String[] keys = new String[typeId.length];
if (filter.equals("eventtype")) {
for (int i = 0; i < typeId.length; i++) {
Eventtype type = (Eventtype) HibernateUtil.get(
Eventtype.class, typeId[i]);
if (type != null)
keys[i] = type.getName();
}
} else if (filter.equals("eventlevel")) {
for (int i = 0; i < typeId.length; i++) {
Eventlevel type = (Eventlevel) HibernateUtil.get(
Eventlevel.class, typeId[i]);
if (type != null)
keys[i] = type.getName();
}
} else if (filter.equals("eventrange")) {
for (int i = 0; i < typeId.length; i++) {
Eventrange type = (Eventrange) HibernateUtil.get(
Eventrange.class, typeId[i]);
if (type != null)
keys[i] = type.getName();
}
}
return keys;
}
return new String[] {};
}
@SuppressWarnings("unchecked")
public double[][] getData(List list) {
if (list != null && list.size() > 0) {
int size = list.size();
double[][] data = new double[size][1];
int typeId[] = new int[size];
double[] count = new double[size];
double[] buff;
int index = 0;
for (Iterator iterator = list.iterator(); iterator.hasNext(); index++) {
Object[] obj = (Object[]) iterator.next();
try {
typeId[index] = Integer.parseInt(obj[0].toString());// 显示列id
count[index] = Double.parseDouble(obj[1].toString());// 显示列统计值
} catch (Exception e) {
System.out.println("类型转换异常");
typeId[index] = 0;
count[index] = 0;
}
}
setTypeId(typeId);
for (int i = 0; i < count.length; i++) {// 给data赋值,只给行赋值
buff = new double[] { count[i] };
data[i] = buff;
}
return data;
}
return new double[][] {};
}
public String handerHql(Date start, Date end, String filter) {
if (filter != null && !filter.trim().equals("")) {
StringBuffer hql = null;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
if (filter.equals("eventtype")) {
hql = new StringBuffer("SELECT ca.typeid");
hql.append(",COUNT(ca) from Case ca");
if (start != null && end != null) {
hql.append(" WHERE ca.time BETWEEN");
hql.append(" " + format.format(start));
hql.append(" AND " + format.format(end));
}
hql.append(" GROUP BY ca.typeid");
} else if (filter.equals("eventlevel")) {
hql = new StringBuffer("SELECT ca.levelid");
hql.append(",COUNT(ca) from Case ca");
if (start != null && end != null) {
hql.append(" WHERE ca.time BETWEEN");
hql.append(" " + format.format(start));
hql.append(" AND " + format.format(end));
}
hql.append(" GROUP BY ca.levelid");
} else if (filter.equals("eventrange")) {
hql = new StringBuffer("SELECT ca.rangeid");
hql.append(",COUNT(ca) from Case ca");
if (start != null && end != null) {
hql.append(" WHERE ca.time BETWEEN");
hql.append(" " + format.format(start));
hql.append(" AND " + format.format(end));
}
hql.append(" GROUP BY ca.rangeid");
}
return hql.toString();
}
return null;
}
public String getPieKeysName(String filter, int id) {
if (filter != null && !filter.trim().equals("")) {
if (filter.equals("eventtype")) {
Eventtype type = (Eventtype) HibernateUtil.get(Eventtype.class,
id);
if (type != null)
return type.getName();
} else if (filter.equals("eventlevel")) {
Eventlevel type = (Eventlevel) HibernateUtil.get(
Eventlevel.class, id);
if (type != null)
return type.getName();
} else if (filter.equals("eventrange")) {
Eventrange type = (Eventrange) HibernateUtil.get(
Eventrange.class, id);
if (type != null)
return type.getName();
}
}
return null;
}
@SuppressWarnings("unchecked")
public DefaultPieDataset getPieData(List list, String filter) {
if (list != null && filter != null && list.size() > 0) {
int id;
double count = 0;
String name = null;
DefaultPieDataset dataset = new DefaultPieDataset();
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Object[] obj = (Object[]) iterator.next();
try {
id = Integer.parseInt(obj[0].toString());// 显示列id
name = getPieKeysName(filter, id);
count = Double.parseDouble(obj[1].toString());// 显示列统计值
dataset.setValue(name, count);
} catch (Exception e) {
System.out.println("类型转换异常");
id = 0;
count = 0;
}
}
return dataset;
}
return new DefaultPieDataset();
}
@SuppressWarnings("unchecked")//开始时间,结束时间,类型 饼图
public JFreeChart getPieChart(Date start, Date end, String filter) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String scope = "";
if (start != null && end != null) {
String startTime = format.format(start);
String endTime = format.format(end);
scope = startTime + " 至 " + endTime;
}
String hql = handerHql(start, end, filter);
String title = null;
if (filter != null && !filter.trim().equals("")) {
if (filter.equals("eventtype"))
title = "事件类型分布统计图";
else if (filter.equals("eventlevel"))
title = "事件紧急程度分布统计图";
else if (filter.equals("eventrange"))
title = "事件涉及范围分布统计图";
}
List list = getList(hql);
DefaultPieDataset dataset = getPieData(list, filter);// 设置饼图数据集
standardChartTheme.setExtraLargeFont(new Font("微软雅黑", Font.BOLD, 18));
// 设置图例的字体
standardChartTheme.setRegularFont(new Font("微软雅黑", Font.PLAIN, 14));
// 设置轴向的字体
standardChartTheme.setLargeFont(new Font("微软雅黑", Font.PLAIN, 16));
// 应用主题样式
ChartFactory.setChartTheme(standardChartTheme);
// 通过工厂类生成JFreeChart对象
JFreeChart chart = ChartFactory.createPieChart3D(title, dataset, true,
true, false);
chart.addSubtitle(new TextTitle(scope));
PiePlot pieplot = (PiePlot) chart.getPlot();
pieplot.setLabelFont(new Font("宋体", 0, 14));
StandardPieSectionLabelGenerator standarPieIG = new StandardPieSectionLabelGenerator(
"{0}({1},{2})", NumberFormat.getNumberInstance(), NumberFormat
.getPercentInstance());
pieplot.setBackgroundPaint(Color.white);//设置背景
pieplot.setLabelGenerator(standarPieIG);
// 没有数据的时候显示的内容
pieplot.setNoDataMessage("无数据显示");
pieplot.setLabelGap(0.02D);
PiePlot3D pieplot3d = (PiePlot3D) chart.getPlot();
// 设置开始角度
pieplot3d.setStartAngle(120D);
// 设置方向为”顺时针方向“
pieplot3d.setDirection(Rotation.CLOCKWISE);
// 设置透明度,0.5F为半透明,1为不透明,0为全透明
pieplot3d.setForegroundAlpha(0.7F);
return chart;
}
@SuppressWarnings( { "unchecked", "deprecation" })//开始时间,结束时间,类型 柱形图
public JFreeChart getColumnChart(Date start, Date end, String filter) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String scope = "";
if (start != null && end != null) {
String startTime = format.format(start);
String endTime = format.format(end);
scope = startTime + " 至 " + endTime;
}
String hql = handerHql(start, end, filter);
String title = null;
if (filter != null && !filter.trim().equals("")) {
if (filter.equals("eventtype"))
title = "事件类型分布统计图";
else if (filter.equals("eventlevel"))
title = "事件紧急程度分布统计图";
else if (filter.equals("eventrange"))
title = "事件涉及范围分布统计图";
}
List list = getList(hql);
double[][] data = getData(list);// 数据是二维数组(我只需要将行初始化便可)
String[] rowKeys = getRowKeys(filter);
String[] columnKeys = {};
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(
rowKeys, columnKeys, data);
standardChartTheme.setExtraLargeFont(new Font("微软雅黑", Font.BOLD, 18));
// 设置图例的字体
standardChartTheme.setRegularFont(new Font("微软雅黑", Font.PLAIN, 14));
// 设置轴向的字体
standardChartTheme.setLargeFont(new Font("微软雅黑", Font.PLAIN, 16));
// 应用主题样式
ChartFactory.setChartTheme(standardChartTheme);
JFreeChart chart = ChartFactory.createBarChart3D(title, "", "数量",
dataset, PlotOrientation.VERTICAL, true, true, false);
chart.addSubtitle(new TextTitle(scope));// 设置标题
CategoryPlot plot = chart.getCategoryPlot();
// 设置网格背景颜色
plot.setBackgroundPaint(Color.white);
// 设置网格竖线颜色
plot.setDomainGridlinePaint(Color.pink);
// 设置网格横线颜色
plot.setRangeGridlinePaint(Color.pink);
plot.setNoDataMessage("暂无数据显示!");// 没有数据显示的时候显示这个提示
// 显示每个柱的数值,并修改该数值的字体属性
BarRenderer3D renderer = new BarRenderer3D();
renderer
.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(true);
// 默认的数字显示在柱子中,通过如下两句可调整数字的显示
// 注意:此句很关键,若无此句,那数字的显示会被覆盖,给人数字没有显示出来的问题
renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(
ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
renderer.setItemLabelFont(new Font("黑体", Font.PLAIN, 18));// 设置数字的字体大小
renderer.setItemLabelAnchorOffset(10D);
// 设置每个地区所包含的平行柱的之间距离
renderer.setItemMargin(0.3);
plot.setRenderer(renderer);
return chart;
}
}
分享到:
相关推荐
在使用iText进行报表制作时,柱形图、饼图和折线图是数据可视化的三种基本类型,它们各有特点: 1. **柱形图(Bar Chart)**: - 柱形图用于比较不同类别之间的数值,通过长条的高度表示数据量的大小。在iText中,...
在C#编程中,生成各种图表(如比例图、柱形图、饼图和折线图)以及PDF文档是常见的需求,特别是在数据可视化和报告生成的场景中。这些功能可以帮助开发者将复杂的数据以直观的方式呈现出来,使得数据分析和决策制定...
《danielgindi/Charts折线图柱形图饼图用法Demo》 在iOS开发中,图表是一种非常常见的数据可视化工具,它可以帮助用户更好地理解复杂的数据信息。danielgindi/Charts是GitHub上一个非常知名的开源库,专门用于创建...
本资源包含了一系列使用HTML5和JavaScript技术实现的图表,包括饼图、柱状图和折线图,为数据可视化提供了直观且美观的解决方案。 饼图是一种常用于显示部分与整体之间关系的数据表示方式,通过扇形区域的大小来...
High-speed Charting Control--MFC 绘制图表折线图、饼图、柱形图控件 本篇文章主要介绍了一个高性能的图表控件,名为 High-speed Charting Control,可以用来绘制折线图、饼图、柱形图等多种类型的图表。该控件...
/// 绘制折线图 例如DrawData.DrawPolyonLine(pictureBox1.Width,pictureBox1.Height ,"2000-3000年比例","6,8,10,12,14,16,18,20,22","个","1,2,3,4,5,6,7,8,9,10,11,12","年","12,6,8,10,12,14,16,18,20,2,11,11...
JFreeChart是一个强大的Java库,它可以用来创建多种类型的图表,包括柱形图、饼图和折线图。本篇文章将详细介绍如何使用JFreeChart来实现这些统计图形。 首先,为了使用JFreeChart库,我们需要导入以下三个依赖库:...
本资源包含多款基于Flash的统计图动画,包括柱形图、圆饼图和折线图,这些都是数据分析和展示中常见的图表类型。以下是这些图表的相关知识点: 1. Flash统计图:Flash是一种交互式矢量图形和多媒体平台,它允许开发...
在数据分析和可视化领域,折线图、饼图和柱形图是三种常用的数据表示方法,它们各有特点,适用于不同类型的数据显示。接下来,我们将详细探讨这些图表类型及其应用场景。 首先,折线图是一种通过连接一系列数据点来...
在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 框架来实现折线图、柱形图和饼图。MFC是微软为Windows应用程序开发提供的一套C++类库,它极大地简化了图形用户界面的构建。 首先,我们需要理解...
JFreeChart是一个强大的图表库,它提供了丰富的图表类型,包括柱形图、饼图和折线图,使得开发者能够方便地创建高质量的数据图形。下面将详细讨论如何使用JFreeChart来实现这些统计图表。 首先,柱形图(Bar Chart...
柱形图、饼图、线形图和区域图都是最常见的图表类型,它们各自适用于不同的数据展示场景。本篇将详细介绍这些图表以及如何利用JavaScript库Highcharts来创建它们。 1. **柱形图(Bar Chart)**: 柱形图是一种用...
这个"C# winform使用zedgraph制作饼图条形图和折线图的demo"正是为了帮助开发者更好地理解和应用ZedGraph库。 ZedGraph是一个开源的.NET图形库,它可以方便地集成到WinForm应用中,用以绘制2D图形。下面我们将详细...
VC++课程设计:用生成的随机数画统计图(折线,柱形,条形,饼图),内含详细的设计过程及实验报告,经测试能运行,建议还是自己动手做做,不要说没有时间,其实只要你自己动手做出一个,你就会发现它并不难,不懂得记得baidu
在VS2015环境下64位、32位编译通过。High-speed Charting Control--MFC绘制图表(折线图、柱形图)控件。中文翻译文档可参照https://blog.csdn.net/xuanyuanlei1020/article/details/53487107
在Java编程语言中,生成各种数据统计图,如柱形图、饼图和折线图,通常会使用第三方库,例如jFreeChart。jFreeChart是一个功能强大的图表库,能够帮助开发者创建高质量的2D图表,广泛应用于数据分析、报告生成以及...
可以通过此代码实现对数据进行图表展示,有柱形图,饼图,折线图,代码完整
JFreeChart 是一个开源的Java库,用于生成高质量的、多样的图表,包括折线图、柱形图、饼图、散点图等。在这个特定的案例中,我们关注的是如何利用JFreeChart来创建折线图和柱形图的混合图表,这种图表在数据可视化...
这里提到的"AChartEngine"是一个开源的Android图表库,它为开发者提供了创建各种图表的能力,包括曲线图、折线图、双曲线图、柱形图和饼图。这些图表类型在数据展示和分析中都有广泛的应用。 1. **曲线图**:曲线图...
Java 中可以使用 JFreeChart 库来实现各种数据统计图,如柱形图、饼图、折线图等。下面将详细介绍如何使用 JFreeChart 库实现数据统计图。 首先,需要添加三个第三方包到 Java 项目中,分别是 jfreechart-1.0.13....