最近做了柱线一体图,大概是成型了,一些细节还没调通,例如右Y轴百分比的显示。还是得多研究研究,暂且这个程度保留一下。
方法中大部分参数是根据业务而定,实现思路大致如此啦!
import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.io.File;
import java.io.IOException;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.entity.StandardEntityCollection;
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.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DatasetUtilities;
import com.windtec.framework.util.FileHelper;
/**
* 柱线一体图
* @author zhaoqingyan
*
*/
public class DrawHistogram
{
int width;// 图象宽度
int height; // 图象高度
String chartTitle;// 图表标题
String subtitle;// 副标题
String xTitle;// X轴标题
String yTitle;// Y轴标题
String[] cutline;// 图例名称
String[] category; // 统计种类
double[][] data;// 绘图数据
String firstURL = "/admin/upload/common_downloadFile.do?localfilename=";// 映射路径
String secondURL = "&destfilename=";// 映射路径
public DrawHistogram() {
this.width = 450;
this.height = 325;
}
public DrawHistogram(int width, int height, String chartTitle,
String subtitle, String xTitle, String yTitle, String[] cutline,
String[] category, double[][] data) {
this.width = width;
this.height = height;
this.chartTitle = chartTitle;
this.subtitle = subtitle;
this.xTitle = xTitle;
this.yTitle = yTitle;
this.cutline = cutline;
this.category = category;
this.data = data;
}
/**
*
* @param lineName -- 折线名称
* @param Y1Name -- 右Y轴名称
* @param fileName -- 生成图片的名称
* @param data2 -- 附加区域数据集(这里指折线),此值可以给空,例如:在折线图的数据集是柱图中各项数据的总和时,可以解析柱图数据集算出总数。
* @param startY -- 左Y轴起点
* @param endY -- 左Y轴跨度
* @param startY1 -- 右Y轴起点
* @param endY1 -- 右Y轴跨度
* @param isY1 -- 是否显示右Y轴刻度
* @return
*/
public String draw(String lineName, String Y1Name,String fileName, double[][] data2,double startY, double endY,double startY1, double endY1,boolean isY1) {
// 创建绘图数据集
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(cutline,category,data);
// 创建图表对象
JFreeChart chart = ChartFactory.createBarChart3D(chartTitle, // 图表标题
xTitle, // X轴标题
yTitle, // Y轴标题
dataset, // 绘图数据集
PlotOrientation.VERTICAL, // 柱形图绘制方向
true, // 显示图例
true, // 采用标准生成器
false // 生成链接
);
// 添加副标题
chart.addSubtitle(new TextTitle(subtitle));
chart.setBorderVisible(true);
chart.setBorderPaint(new Color(0xFF,0x66,0x00));
chart.setBackgroundPaint(new Color(0xFF,0xF3,0xDE));
// 下面开始绘制附加轴(右侧轴)
// 首先获得绘图区对象
CategoryPlot plot = chart.getCategoryPlot();
//bar实例化
BarRenderer renderer = (BarRenderer) plot.getRenderer();
//设置条形图上bar是否显示背景阴影
//renderer.setDrawBarOutline(false);
//设置bar最大宽度百分比
//renderer.setMaximumBarWidth(0.10D);
//手动设置条形图上bar设置颜色
GradientPaint gp0 = new GradientPaint(0.0f, 0.0f, Color.ORANGE,
0.0f, 0.0f, new Color(0, 0, 64));
GradientPaint gp1 = new GradientPaint(0.0f, 0.0f, Color.BLUE,
0.0f, 0.0f, new Color(64, 0, 0));
GradientPaint gp2 = new GradientPaint(0.0f, 0.0f, Color.green,
0.0f, 0.0f, new Color(0, 64, 0));
renderer.setSeriesPaint(0, gp0);
renderer.setSeriesPaint(1, gp1);
renderer.setSeriesPaint(2, gp2);
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
//设置柱子上数值的字体
renderer.setItemLabelFont(new Font("宋体",Font.PLAIN,13));
renderer.setItemLabelsVisible(true);
//设置柱子上数据的颜色
renderer.setItemLabelPaint(Color.RED);
//设置bar的最小宽度,以保证能显示数值
renderer.setMinimumBarLength(0.02);
//最大宽度
//renderer.setMaximumBarWidth(0.07);
//使设置生效
renderer.setBaseItemLabelsVisible(true);
ValueAxis valueAxis = plot.getRangeAxis();
//设置Y轴起点
valueAxis.setLowerBound(startY);
valueAxis.setUpperBound(30);
NumberAxis numAxis = (NumberAxis)plot.getRangeAxis();
numAxis.setAutoTickUnitSelection(false);//数据轴的数据标签是否自动确定
//设置Y轴跨度
numAxis.setTickUnit(new NumberTickUnit(endY));
// 创建附加轴对象,并添加到绘图区
if(isY1)
{
ValueAxis axis1 = new NumberAxis(Y1Name);
axis1.setLowerBound(startY1);
axis1.setUpperBound(2);
NumberAxis numAxis1 = (NumberAxis)axis1;
numAxis1.setAutoTickUnitSelection(false);//数据轴的数据标签是否自动确定
//设置Y轴跨度
numAxis1.setTickUnit(new NumberTickUnit(endY1));
plot.setRangeAxis(1,axis1);
}else
{
ValueAxis axis1 = new NumberAxis(Y1Name);
axis1.setLowerBound(startY);
axis1.setUpperBound(30);
NumberAxis numAxis1 = (NumberAxis)axis1;;
numAxis1.setAutoTickUnitSelection(false);//数据轴的数据标签是否自动确定
//设置Y轴跨度
numAxis1.setTickUnit(new NumberTickUnit(endY));
plot.setRangeAxis(1,axis1);
}
// 创建与附加轴对应的数据集,并添加到绘图区
DefaultCategoryDataset dataset1 = new DefaultCategoryDataset();
if(data2 == null)
{
for (int m = 0; m < category.length; m++)
{
double sum = 0.0;
for (int n = 0; n < cutline.length; n++)
{
sum += data[n][m];
}
dataset1.addValue(sum, lineName, category[m]);
}
}else
{
for (int m = 0; m < category.length; m++)
{
dataset1.addValue(data2[0][m], lineName, category[m]);
}
}
plot.setDataset(1, dataset1);
// 将绘图数据集映射到附加轴上
plot.mapDatasetToRangeAxis(1, 1);
// 定义附加轴的绘图风格,这里为折线
CategoryItemRenderer renderer1 = new LineAndShapeRenderer();
renderer1.setSeriesPaint(0, Color.RED);
plot.setRenderer(1, renderer1);
plot.setNoDataMessage("无数据可供显示!");
// 绘制附加轴结束(右侧轴)
// 生成指定格式的图片,并返回图片名称
String pieName = "";
try {
pieName = FileHelper.getUploadDir() + fileName;
ChartUtilities.saveChartAsJPEG(
new File(pieName),
chart,
width,
height);
} catch (IOException e) {
System.out.println("------ 在绘制图片时抛出异常,内容如下:");
e.printStackTrace();
}
// 组织图片浏览路径
String graphURL = firstURL + fileName + secondURL + fileName;
// 返回图片浏览路径
return graphURL;
}
}
分享到:
相关推荐
"自绘柱状图线图Chart"项目提供了一种方法,使开发者能够根据自己的需求定制和绘制柱状图和线状图,以直观地展示复杂的数据。下面将详细阐述这个项目所涉及的知识点。 1. **自定义图表**:此项目的核心是允许用户...
JFreeChart是一款强大的Java库,用于生成各种类型的2D图表,包括柱状图、线图、饼图等。它在IT行业中广泛应用于数据分析和可视化,为开发者提供了丰富的接口和类来定制图表样式和内容。本例子将详细介绍如何利用...
模型的实际应用通过实例说明其简单实用,且在CAD线图处理中的推广值得期待。 5. 现有模型的局限性:在CAD线图数据处理中,传统模型如GM(1,1)模型和GM(1,n)模型存在一定的局限性。GM(1,1)模型虽然应用广泛,但在处理...
- **绘制图表**:可以绘制线图、3D柱图和饼图,通过设置各种参数(颜色、样式、标签等)自定义图表外观。 - **图表展示控制**:可以调整图表的大小、比例,添加图例,控制数据标签显示,甚至实现交互式操作,如...
在Java编程领域,JFreeChart是一个非常流行的图表库,它提供了丰富的图表类型,包括柱状图、饼图、线图等,便于开发者创建出专业且美观的数据可视化展示。本篇文章将详细探讨如何自定义JFreeChart的柱状图,使其适应...
综合以上内容,这段源码提供了自定义的MACD指标,通过识别DIFF和DEA的交叉以及价格的高低点变化,来生成交易信号。使用者可以通过理解这些代码逻辑,结合实际市场行情,判断买入和卖出的时机。然而,实际应用中,还...
以下是一些常用的MATLAB作图函数及其详细说明: 1. **plot函数**:这是MATLAB中最基本的绘图函数,可以绘制2D线图。例如,`plot(x,y)`将根据x和y向量生成一条线,其中x是自变量,y是因变量。 2. **scatter函数**:...
JFreeChart 的 API 文档是开发者理解和使用这个库的重要参考资料,它包含了详细的类、方法和接口说明,帮助我们创建出专业且美观的数据图表。 **1. 图表类型与创建** JFreeChart 提供了多种图表类型,如 ...
GMT的优势在于其为地球工作提供定制功能,能够处理各类地理学数据,如地震、断层和地形等,并支持生成等值线图和地形图,进行简单数字运算以及谱分析等。其与UNIX系统的兼容性高,有独立的文档说明,支持通过命令行...
在开发过程中,可以参考“软件说明.url”文档获取具体软件的使用指南,而“WWW.WEI2008.COM”可能是提供相关资源或教程的网站。为了创建超华丽超好看的统计图、饼图和柱状图,建议深入学习这些工具的文档,结合实际...
GraphPad Prism是一款广泛应用于生物医学领域的统计学分析与图形制作工具,其易用性、强大的数据处理能力以及直观的图表生成功能深受科研工作者的喜爱。本文将基于给定的部分内容,详细介绍GraphPad Prism的应用技巧...
TChart是 embarcadero Delphi 的标准组件之一,属于 Indy 或 TeeChart 库的一部分,它提供了丰富的图表类型,包括柱状图、线图、饼图等。 **使用TChart生成柱状图表的步骤:** 1. **添加TChart组件**:首先,从...
通过这个“绘制柱型图(源码)”项目,开发者可以学习到如何在C#环境中使用.NET提供的图表功能,从而实现数据的可视化呈现,这对于数据分析、报告生成以及用户界面设计都十分有用。同时,掌握这个技能也有助于理解和...
9. **注解和说明**:可能附带了说明文字,解释图表的关键信息和如何解读数据。 总的来说,这个模板是一个强大的工具,可以帮助销售团队或个人进行数据驱动的决策,通过清晰的图形展示,提升数据分析的效率和有效性...
以下是一些主要的MATLAB函数的详细说明: 1. **plot**:这是MATLAB中最基础的绘图函数,用于绘制二维线图。你可以通过它来表示函数的曲线或者数据点。 2. **title, xlabel, ylabel**:这些函数分别用于添加图形的...
以下是对如何从.matlab图(fig)文件中提取数据以及用于2D和3D绘图的详细说明: 1. **.fig文件结构**: .fig文件是MATLAB的工作空间中保存的图形对象的序列化表示,包括轴、线条、文本、图像等元素。每个图形对象都...
水晶报表(Crystal Reports)是一款强大的报表设计工具,广泛应用于企业级应用系统中,用于生成各类报表,包括柱状报表、线图、表格等。在C#编程环境下,开发者可以利用水晶报表的.NET Framework版本,方便地集成...
在Java中使用`JFreeChart`创建柱形图,首先需要准备数据集,然后创建`CategoryDataset`对象,接着创建`JFreeChart`实例并设置数据集,最后通过`ChartFactory.createBarChart()`方法生成柱形图。柱形图的每个柱子代表...