`
BradyZhu
  • 浏览: 261219 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JFreeChart深入介绍

 
阅读更多

由于业务数据方面以及表图显示视觉方面考虑,Jfreechart中需要2个或者更多的坐标,在添加坐标后会出现几个问题
1、两个坐标的数据会以前后方式显示,当两个坐标的数据均以柱状图显示时会遮挡,而且可能两个坐标的数据量不一致导致柱状大小不一。
解决方案:分别扩充两坐标的数据集,添加空数据,使得两坐标的数据相同,而空的数据无法遮挡其他数据。

2、当采用1的方案后会出现图例多出好几个的问题
解决方案:重载plot,重新定义getLegendItems。自定义图例。

3、当采用2的方案后,图例只能显示在一个地方,当需求需要把图例分别显示的时候
解决方案:添加多一个plot,重新定义plot跟plot1的getLegendItems。

4、当采用3的方案后,图例的颜色会重复,系统默认均为品红、蓝、绿、blablabla的顺序赋予颜色
解决方案:在getLegendItems中定义图例同时改变其颜色。

以下是参考代码:
public static String cateoryCdataset(int width, int height,String sqlexeproc1,String sqlexeproc2,String categoryname1,String categoryname2,String categoryvalue1,String categoryvalue2,String title,String leftword,String rightword,String buttonword) throws InstantiationException, Exception, Throwable
{
String filename = null;
CategoryDataset dataset1=getcategoryDataSet(sqlexeproc1,categoryname1,categoryname2,categoryvalue1);
CategoryDataset dataset2=getcategoryDataSet(sqlexeproc2,categoryname1,categoryname2,categoryvalue2);
/*int dsc1 = dataset1.getRowCount();
int dsc2 = dataset2.getRowCount();*/
//JFreeChart chart = ChartFactory.createBarChart3D("hello", leftword, buttonword,dataset, PlotOrientation.VERTICAL, true, true, false);
//JFreeChart chart = ChartFactory.createBarChart("hello", buttonword, leftword,dataset1, PlotOrientation.VERTICAL, true, true, false);
//CategoryPlot plot = (CategoryPlot) chart.getPlot();
CategoryAxis domainAxis = new CategoryAxis(buttonword);
NumberAxis rangeAxis = new NumberAxis(leftword);
BarRenderer renderer1 = new BarRenderer();
CategoryPlot plot1 = new CategoryPlot(dataset1,domainAxis,rangeAxis,renderer1){
public LegendItemCollection getLegendItems() {
/*CategoryDataset data = getDataset();
if (data != null) {
CategoryItemRenderer r = getRenderer();
if (r != null) {
for(int x1=0;x1<data.getRowCount();x1++)
if(data.getValue(x1,0)!=null)
{
LegendItem item = r.getLegendItem(0, x1);

}
}
}*/
LegendItemCollection result = new LegendItemCollection();
CategoryDataset data1 = getDataset(1);
if (data1 != null) {
CategoryItemRenderer r2 = getRenderer(1);
if (r2 != null) {
for(int x1=0;x1<data1.getRowCount();x1++)
if(data1.getValue(x1,0)!=null)
{
LegendItem item = r2.getLegendItem(1, x1);
result.add(item);
}
}
}
return result;
}
};

CategoryPlot plot = new CategoryPlot(dataset1, domainAxis, rangeAxis, renderer1) {

public LegendItemCollection getLegendItems() {

LegendItemCollection result = new LegendItemCollection();

CategoryDataset data = getDataset();
if (data != null) {
CategoryItemRenderer r = getRenderer();
if (r != null) {
for(int x1=0;x1<data.getRowCount();x1++)
if(data.getValue(x1,0)!=null)
{
r.setSeriesPaint(x1,new Color(20*x1, 50*x1, 130*x1%255));
LegendItem item = r.getLegendItem(0, x1);
result.add(item);

}
}
}

// the JDK 1.2.2 compiler complained about the name of this
// variable
/*
CategoryDataset data1 = getDataset(1);
if (data1 != null) {
CategoryItemRenderer r2 = getRenderer(1);
if (r2 != null) {
for(int x1=0;x1<data1.getRowCount();x1++)
if(data1.getValue(x1,0)!=null)
{

LegendItem item = r2.getLegendItem(1, x1);

}
}
}*/

return result;

}

};

JFreeChart chart = new JFreeChart(title, plot);

chart.getLegend(0).visible=false;
Font font=new Font("宋体", Font.PLAIN, 12);
chart.setTitle(new TextTitle(title, new Font("宋体", Font.BOLD + Font.ITALIC, 20)));
CategoryAxis categoryAxis = plot.getDomainAxis();
categoryAxis.setLabelFont(font);
categoryAxis.setTickLabelFont(font);
NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis();
numberaxis.setLabelFont(font);
numberaxis.setUpperMargin(0.2);
numberaxis.setTickLabelFont(font);
ValueAxis axis2 = new NumberAxis(rightword);
axis2.setUpperMargin(0.2);
plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_LEFT);
plot.setDataset(1, dataset2);
plot.mapDatasetToRangeAxis(1, new Integer(1));
plot.setRangeAxis(1, axis2);
plot.setRangeAxisLocation(1, AxisLocation.BOTTOM_OR_RIGHT);
plot1.setDataset(1, dataset2);
plot1.mapDatasetToRangeAxis(1, new Integer(1));
BarRenderer renderer2 = new BarRenderer();
plot.setRenderer(1, renderer2);
plot1.setRenderer(1, renderer2);
LegendTitle l2 = new LegendTitle(plot1);
LegendTitle l1 = new LegendTitle(chart.getPlot());
BlockContainer blockcontainer1 = l1.getItemContainer();
BlockContainer blockcontainer2 = l2.getItemContainer();
blockcontainer1.setPadding(2D, 10D, 5D, 2D);
blockcontainer2.setPadding(2D, 10D, 5D, 2D);
BlockContainer blockcontainer = new BlockContainer(new BorderArrangement());
BlockContainer blockcontainer3 = new BlockContainer(new BorderArrangement());
//blockcontainer.add(blockcontainer1,RectangleEdge.LEFT);
blockcontainer.add(blockcontainer1);
blockcontainer3.add(blockcontainer2);
//l1.setWrapper(blockcontainer);
l1.setPosition(RectangleEdge.LEFT);
l2.setPosition(RectangleEdge.RIGHT);
//l1.setHorizontalAlignment(HorizontalAlignment.LEFT);
//legendtitle.setWrapper(blockcontainer);
//blockcontainer.add(new EmptyBlock(20D, 0.0D));
chart.addSubtitle(l1);
chart.addSubtitle(l2);
CategoryDataset dataset3=setcategoryFDataSet(dataset1,dataset2);
plot.setDataset(0,dataset3);
plot1.setDataset(0,dataset3);
CategoryDataset dataset4=setcategoryBDataSet(dataset1,dataset2);
int s1 = dataset1.getRowCount();
int s2 = plot.getDatasetCount();
//setitemlablevisible(plot,2,4);
//设置图上显示数字
setitemlablevisible(plot,s2,s1);
plot.setDataset(1,dataset4);
plot1.setDataset(1,dataset4);
//chart.getLegend().setItemFont(font);
//chart.getLegend().getItemContainer().clear();

//chart.getLegend().
plot.setNoDataMessage("无返回数据ʾ");
//将Jfreechart转换为String
filename=getChartfilename(chart,width,height);
return filename;
}

同时注意当图例内字太长的时候,如果把图例放下方两边会出现遮挡现象,故将其放在图的左右两边。

当柱状图跟折线图混合时,如果需要折线图不在同一x坐标上显示(即折线起始跟结束的x坐标要区分)时,普通的LineChart不能满足要求,网上资料对这方面提得很有限,翻查1天后才终于在demo的源文件里查出需要用到StatisticalLineAndShapeRenderer

参考代码:

public static String cateoryBdataset(int width,int height,String sqlexeproc1,String sqlexeproc2,String categoryname1,String categoryname2,String categoryvalue1,String categoryname3,String categoryname4,String categoryvalue2,String title,String leftword,String rightword,String buttonword)throws InstantiationException, Exception, Throwable
{

String filename=null;
CategoryDataset dataset1=getcategoryDataSet(sqlexeproc1,categoryname1,categoryname2,categoryvalue1);
CategoryDataset dataset2=getcategoryDataSet(sqlexeproc2,categoryname3,categoryname4,categoryvalue2);
JFreeChart chart = ChartFactory.createBarChart(title, leftword, buttonword, dataset1, PlotOrientation.VERTICAL, false, true, false);
chart.setBackgroundPaint(Color.white);
CategoryPlot plot = (CategoryPlot)chart.getPlot();
Font font=new Font("宋体", Font.PLAIN, 12);
chart.setTitle(new TextTitle(title, new Font("宋体", Font.BOLD + Font.ITALIC, 20)));
//chart.getLegend().setItemFont(font);
CategoryAxis categoryAxis = plot.getDomainAxis();
//x轴的说明字
categoryAxis.setLabelFont(font);

//x轴上的字
categoryAxis.setTickLabelFont(font);
//设置纵坐标字体
NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis();
//y轴的说明字
numberaxis.setLabelFont(font);
numberaxis.setUpperMargin(0.2);
//y轴上的字
numberaxis.setTickLabelFont(font);
plot.setBackgroundPaint(new Color(238, 238, 255));
plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
plot.setDataset(0, dataset2);
plot.setDataset(1,dataset1);
plot.mapDatasetToRangeAxis(1, 1);

CategoryAxis categoryaxis = plot.getDomainAxis();
categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45);
NumberAxis numberaxis1 = new NumberAxis(rightword);
numberaxis1.setUpperMargin(0.2);
plot.setRangeAxis(1, numberaxis1);
//2D效果

CategoryItemRenderer renderer2 = new LineAndShapeRenderer();
CategoryItemRenderer renderer = new BarRenderer();

plot.setRenderer(0, renderer2);
plot.setRenderer(1,renderer);

StatisticalLineAndShapeRenderer localStatisticalLineAndShapeRenderer = new StatisticalLineAndShapeRenderer();
localStatisticalLineAndShapeRenderer.setUseSeriesOffset(true);
plot.setRenderer(localStatisticalLineAndShapeRenderer);

LegendTitle legendtitle = new LegendTitle(plot.getRenderer());
legendtitle.setMargin(new RectangleInsets(2D, 2D, 2D, 2D));
legendtitle.setBorder(1,1, 1, 1);

LegendTitle legendtitle1 = new LegendTitle(plot.getRenderer(1));
legendtitle1.setMargin(new RectangleInsets(2D, 2D, 2D, 2D));
legendtitle1.setBorder(1, 1, 1, 1);
BlockContainer blockcontainer = new BlockContainer(new BorderArrangement());

blockcontainer.add(legendtitle, RectangleEdge.LEFT);
blockcontainer.add(legendtitle1, RectangleEdge.RIGHT);
blockcontainer.add(new EmptyBlock(2000D, 0.0D));
CompositeTitle compositetitle = new CompositeTitle(blockcontainer);
compositetitle.setPosition(RectangleEdge.BOTTOM);
chart.addSubtitle(compositetitle);

//3D效果
//CategoryItemRenderer renderer2 = new LineRenderer3D();
//renderer2.setToolTipGenerator(new StandardCategoryToolTipGenerator());

/*plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
LegendTitle legendtitle = new LegendTitle(plot.getRenderer(0));
legendtitle.setMargin(new RectangleInsets(2D, 2D, 2D, 2D));*/
int s1 = dataset1.getRowCount();

int s2 = plot.getDatasetCount();
//setitemlablevisible(plot,2,4);
setitemlablevisible(plot,s2,s1);
filename=getChartfilename(chart,width,height);
return filename;
}

分享到:
评论

相关推荐

    JFreeChart 深入探究 实用文档

    这份“JFreeChart深入探究实用文档”是学习和掌握JFreeChart的宝贵资源,下面我们将详细探讨其主要知识点。 1. **JFreeChart基础** - **安装与引入**:首先,了解如何将JFreeChart库添加到项目中,无论是通过Maven...

    jfreechart,jfreechart-1.0.13,jfreechart-1.0.13,jfreechart

    这个压缩包“jfreechart-1.0.13”包含了JFreeChart的完整版本,让我们一起深入探讨其核心功能和使用方法。 JFreeChart是Java中最优秀的绘图工具之一,它支持多种图表类型,包括折线图、柱状图、饼图、散点图、甘特...

    JFreeChart 官方例子 JFReeChart Dome

    通过深入研究JFreeChart的官方示例,开发者能够熟练掌握如何创建、配置和控制各种图表,从而提升项目中的数据可视化能力。无论是为了教学、分析还是展示,JFreeChart都是Java环境中一个非常有价值的工具。

    jfreechart demo

    这篇内容将深入探讨 JFreeChart 的基本使用方法和在 `jfreechart demo` 中的示例程序。 首先,让我们了解 JFreeChart 的核心概念。JFreeChart 提供了 ChartFactory 类,用于创建不同类型的图表。例如,你可以通过 `...

    jfreechart

    标签 "源码" 暗示 JFreeChart 是一个可以查看和修改源代码的项目,这对于开发者来说是一个重要的特性,因为它允许他们深入理解其内部工作原理,根据需求进行定制,或者修复可能存在的问题。"工具" 标签则表明 ...

    深入探究JFreeChart(图表报表实用教材)

    JFreeChart 是一个强大的 Java 图形库,专用于创建各种商业图表,如饼图、柱状图、线图、甘特图、股票图等。它是一个开源项目,可以在 SourceForge.net 上获取其源码和 API。JFreeChart 提供了丰富的功能,包括支持...

    JFreeChart混合图表演示

    JFreeChart是一款强大的Java库,用于创建各种类型的图表,包括柱状图、饼图、线图、散点图等。在“JFreeChart混合图表演示”中,...通过深入学习和实践,你将能够熟练地利用JFreeChart创建出专业且富有表现力的图表。

    jfreechart中文学习文档

    本指南旨在帮助开发者深入了解 JFreeChart 的内部机制及其高级功能。 **4.2 指南内容** - **4.2.1 许可证** - JFreeChart 使用 GNU Lesser General Public License (LGPL) 许可证发布。 - **4.2.2 示例代码** - ...

    jfreechart-1.0.19

    1. **jfreechart-1.0.19-install.pdf**:这可能是安装或使用指南,详细介绍了如何将JFreeChart库集成到你的Java项目中,包括依赖管理和配置步骤,可能还包括示例代码和最佳实践。 2. **jfreechart-1.0.19-fx-...

    JFreeChart

    对于开发者来说,源代码可以用于深入理解其工作原理,或者进行二次开发。 在实际应用中,JFreeChart还可以与其他Java库结合使用,比如Apache POI用于生成Excel报告,或者Servlets和JSP来在Web应用中动态展示图表。...

    代替jfreechart的FusionCharts

    本文将深入探讨FusionCharts的核心特性、优势以及如何在不同平台上应用。 一、FusionCharts简介 FusionCharts是一款基于JavaScript的图表库,它支持多种浏览器和操作系统,包括Windows、Mac、Linux等。通过使用XML...

    JfreeChart-雷达图与导出

    本篇将深入探讨如何利用JFreeChart生成雷达图以及相关的数据导出功能。 **雷达图的使用** 雷达图是一种多维数据可视化工具,特别适合于比较多个变量在同一标准下的表现。在JFreeChart中,创建雷达图主要分为以下几...

    jfreechart教程

    总之,JFreeChart是一个强大的Java图表库,通过深入学习和实践,开发者能够创建出满足各种需求的精美图表。教程中的JFreeChart Jar包、源码示例和中文文档为学习过程提供了全方位的支持。无论是初学者还是经验丰富的...

    jfreechart的jar包

    **JFreeChart 概述** JFreeChart 是一个开源的 Java 图形库,它为 Java 应用程序提供了丰富的图表功能...通过深入理解和实践,你可以利用 JFreeChart 创造出富有洞察力和吸引力的图表,提升数据分析和决策制定的效率。

    jfreechart的一个小总结

    在本文中,我们将深入探讨 JFreeChart 的核心类和它们在创建图表过程中的作用。 1. **JFreeChart 类**: 这是所有图表的基础,它代表了图表对象。你可以通过 JFreeChart 工厂类创建各种类型的图表,例如饼图、柱状...

    JFreeChart+Eclipse

    本文将深入探讨如何在Eclipse环境下配置并使用JFreeChart,以实现高效的数据可视化。 #### JFreeChart简介 JFreeChart是由SourceForge.net托管的开源项目,专注于为Java开发者提供图形解决方案,适用于各种应用...

    jfreechart+cewolf的架包

    Cewolf提供了简单易用的API,使得开发者无需深入理解复杂的Web图形技术,就能在网页上展示JFreeChart图表。 **Cewolf的主要功能** 1. **Servlet渲染**:Cewolf作为一个Servlet运行,接收请求并动态生成JFreeChart...

    JFreeChart范例源码集

    **正文** JFreeChart是一款强大的Java图形库,它允许开发者创建高质量的图表,包括线图、柱状图、...通过研究这些示例,你可以深入理解如何利用JFreeChart库来创建专业且功能丰富的图形,从而提升你的项目视觉表现力。

    JFreeChart示例

    在"JFreeChart示例"中,我们将会深入探讨如何利用 JFreeChart 创建这些图表,并以Web方式展示它们。 首先,JFreeChart 的核心在于它的灵活性和易用性。开发者可以通过简单的 API 调用来构建复杂的图表,调整颜色、...

Global site tag (gtag.js) - Google Analytics