`
BradyZhu
  • 浏览: 247600 次
  • 性别: 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(图表报表实用教材)

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

    深入探究JFreeChart

    深入探究JFreeChart,详细介绍了JFreeChart中各类的使用方法以及需要注意的地方,初学起来很轻松

    jfreechart.pdf

    比较详细介绍了jreechart的使用方法。可供初学者进行学习,也可以供有一定基础的人深入了解jfreechart的特性。

    jfreechart调研文档

    我通过一个星期的对jfreechart的深入学习,总结了这个文档,期望能够对需要用到它的朋友们有所帮助!

    Jfreechart报表工具(直接用,2D3D各种图形)

    该报表工具下下来之后可以直接使用,不需要深入了解报表原理,只需导入js文件,填充报表数据即可,最适合、快速的报表开发。有各种报表图形,支持3DFlash。 用法:解压后,直接进入index主页查看报表类型,选择好...

    jfreechart史上最全资料(含源码及文档、教程).zip

    做过图表的朋友一定听过JfreeChart这个组件,功能非常强大,是做报表必不可少的,如果您还不会或者不够深入,那么推荐您一定要好好学习它,让您成为高手,做图表不求人。 资源内容包括Java项目源代码、jfreechart-...

    Java.Web整合开发王者归来4

    全面系统分析EJB容器组件,深入整合JSP+Servlet+...⑥工具详尽:详细介绍了SVN、Log4J、JFreeChart、iText等开发工具。 ⑦案例典型:用不同框架组合实现了论坛系统和分布式宠物商店系统。 阅读本书需要有一定JAVA基础。

    深入浅出Struts2(附源码)

    本书是广受赞誉的Struts 2优秀教程,它全面而深入地阐述了Struts 2的各个特性,并指导开发人员如何根据遇到的问题对症下药,选择使用最合适的特性。作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,...

    Java.Web整合开发王者归来3

    全面系统分析EJB容器组件,深入整合JSP+Servlet+...⑥工具详尽:详细介绍了SVN、Log4J、JFreeChart、iText等开发工具。 ⑦案例典型:用不同框架组合实现了论坛系统和分布式宠物商店系统。 阅读本书需要有一定JAVA基础。

    Java.Web整合开发王者归来01

    全面系统分析EJB容器组件,深入整合JSP+Servlet+...⑥工具详尽:详细介绍了SVN、Log4J、JFreeChart、iText等开发工具。 ⑦案例典型:用不同框架组合实现了论坛系统和分布式宠物商店系统。 阅读本书需要有一定JAVA基础。

    java web 整合开发 王者归来 随书代码

    全面、系统、深入介绍Java Web开发的核心技术与主流框架。 内容全面:涵盖了Java Web开发所涉及的所有核心技术与主流框架 针对性强:以SSH框架整合开发为核心,可以满足95%的项目需求 讲解到位:对每种技术都...

    Java Web整合开发王者归来:Java Web.part3

    《Java Web整合开发王者归来(JSP+Servlet+Struts+Hibernate+Spring)》全面介绍了Java Web开发中的各种相关技术及知识。全书分为9篇,内容层次清晰,难度循序渐进。第1篇为入门篇,内容包括Java Web开发概述等;第2篇...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    书中介绍了如何利用Struts 2 来解决Web 应用开发中的常见问题,同时还深入浅出地探讨了许多能帮助程序员编写Struts 2 应用程序的技巧,如管理页面导航活动、输入验证、国际化和本地化、对Ajax 的支持,等等。...

    Java.web整合开发王者归来整本书内容及光盘源码

    全面、系统、深入介绍Java Web开发的核心技术与主流框架。 内容全面:涵盖了Java Web开发所涉及的所有核心技术与主流框架 jsp、servlet、struts、spring、hibernate...... 针对性强:以SSH框架整合开发为核心,...

    Java.Web整合开发王者归来.part1

    《Java Web整合开发王者归来(JSP+Servlet+Struts+Hibernate+Spring)》全面介绍了Java Web开发中的各种相关技术及知识。全书分为9篇,内容层次清晰,难度循序渐进。 第1篇为入门篇,内容包括Java Web开发概述等; ...

    Java.Web整合开发王者归来2

    全面系统分析EJB容器组件,深入整合JSP+Servlet+...⑥工具详尽:详细介绍了SVN、Log4J、JFreeChart、iText等开发工具。 ⑦案例典型:用不同框架组合实现了论坛系统和分布式宠物商店系统。 阅读本书需要有一定JAVA基础。

    Java.Web整合开发王者归来6

    全面系统分析EJB容器组件,深入整合JSP+Servlet+...⑥工具详尽:详细介绍了SVN、Log4J、JFreeChart、iText等开发工具。 ⑦案例典型:用不同框架组合实现了论坛系统和分布式宠物商店系统。 阅读本书需要有一定JAVA基础。

Global site tag (gtag.js) - Google Analytics