JFreeChart绘图 - 简单的饼图

本文介绍了如何使用JFreeChart在JAVA中绘制饼图,包括创建饼图数据、生成图表、解决中文乱码问题、自定义显示内容、设置背景图片及透明度,以及调整图例样式等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications、applets、servlet以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、时序图(time series)、柱状图(bar charts)等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。JFreeChart的缺陷就是只适合生成图片,而且文字、图片都不是特别清晰,还需要进行一些调整,比较麻烦。

2.下面介绍使用JFreeChart来绘制饼图的操作步骤吧:

1>先创建饼图数据的集合对象:

//使用DefaultPieDataset的构造器创建一个DefaultPieDataset对象
DefaultPieDataset dataset = new DefaultPieDataset() ;
//使用该对象的setValue方法来添加数据
dataset.setValue("chengxi" , 300) ;
dataset.setValue("huangning" , 200) ;
dataset.setValue("wangzibin" , 100) ;
//最后将该对象赋值给真正的饼图对象,PieDataset对象
PieDataset pie = dataset ;

2>创建JFreeChart对象,ChartFactory类是创建Chart的工厂类,能创建所有的Chart,创建饼图Chart使用该类的静态方法:createPieChart(String title,PieDataset pie,boolean legend,boolean tools,boolean urls) :

//该方法的五个参数分别表示:饼图的标题,所用的PieDataset对象,是否显示图例,是否生成工具栏,是否生成url连接
JFreeChart chart = ChartFactory.createPieChart("chart title" , pie , true , true , false) ;

3.>最终创建的图片并不会保存在项目的文件夹下,想要查看输出该图片,需要使用JFreeChart组件提供的一个Servlet文件,该文件用户获取生成的图表,因此我们需要将该Servlet配置到web.xml文件中:

<servlet>
    <servlet-name>DisplayChart</servlet-name>
    <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>DisplayChart</servlet-name>
    <url-pattern>/DisplayChart</url-pattern>
</servlet-mapping>

4>最终的JFreeChart对象是一个chart,想要输出这个饼图还需要将该chart保存为jpeg或者png格式的图片,通常使用ServletUtilities.saveChartAsJPEG(JFreeChart,width,height,HttpSession)来保存为jpeg格式的图片,该方法返回值为保存的图片的图片名,通常该方法在JSP页面中使用,用来直接传递其filename文件名:

<%
    Stirng filename = servletUtilities.saveChartAsJPEG(chart , 300 , 300 , session) ;
    String imgpath = request.getContextPath() + "/DisplayChart?filename=" + filename ;
%>
<center><img alt="" img="<%=imgpath%>" /></center>

这样,饼图就创建完毕了

3.饼图的相关操作:

1>解决中文乱码问题:
上面的示例传递的图例和图表标题都是使用的英文字母,如果就是这样使用中文字符的话,就会发现结果的图表并没有显示出来这些中文字符,这代表中文字符已经乱码了。出现这种情况是因为JFreeChart组件默认为图表标题、图标本身还有图例已经设置好了默认的字体了,如果我们想要传递中文的话,就需要为这三个地方重新设置字体样式:

1.设置图表本身的字体样式
  //先获取PiePlot对象:
  PiePlot plot = chart.getPlot() ;
  //然后使用对应的方法修改图表本身的字体样式
  plot.setLabelFont(Font font) ;
  //比如:plot.setLabelFont(new Font("宋体",Font.PLAIN,14)) ;
2.设置图表标题的字体样式
  //先获取TextTitle对象:
  TextTitle tt = chart.getTitle() ;
  //然后使用setFont(Font font)方法修改图表标题的字体样式
  tt.setFont(new Font("宋体",Font.BOLD,20)) ;
3.设置图例的字体样式
  //先获取LegendTitle对象
  LegendTitle legend = chart.getLegend() ;
  //然后使用setItemFont(Font font)方法修改图例的字体样式
  legend.setItemFont(new Font("宋体",Font.PLAIN,14)) ;

这样一来,他们就都可以使用中文字符了

2>设置图表的值的显示样式:
默认情况下,JFreeChart只会在图表中显示类别的名称而不会显示数值,也就是显示刚开始的setValue方法添加数据时的第一个数据,如果想要改变显示的内容,可以使用StandardPieSectionLabelGenerator(String labelFormat)方法来重新生成图表标签:

//因为改变的是图表本身显示的值,因此需要先获取PiePlot图表本身对象
PiePlot plot = chart.getPlot() ;
//然后使用其setLabelGenerator()方法来改变显示的值
plot.setLabelGenerator(new StandardPieSectionGenerator("{1}")) ;
其中StandardPieSectionGenerator构造方法的labelFormat参数有如下几个属性值:
    {0}:默认值,表示图表中显示类别的名称
    {1}:表示图表中显示类别的具体数值
    {2}:表示图表中显示当前类别在总数中的百分比
    {3}:表示图表中所有类别相加的总和

3>设置图表的背景图片

//获取图表对象PiePlot
PiePlot plot = chart.getPlot() ;
//设置背景图片使用plot.setBackgroundImage(Image image) ;示例:
Image image = ImageIO.read(new FileInputStream("bg.jpg")) ;
plot.setBackgroundImage(image) ;

4>设置背景图片的透明度

//先获取图表对象PiePlot
PiePlot plot = chart.getPlot() ;
//设置背景图片的透明度使用setBackgroundImageAlpha(float alpha);
plot.setBackgroundImageAlpha(0.4) ;

5>隐藏图表的边框

//先获取图表对象PiePlot
PiePlot plot = chart.getPlot() ;
//设置图表的边框是否显示
plot.setOutlineVisible(true/false) ;

3.图例的相关操作

1>设置图例的背景颜色(图例就是对图表其说明作用的那一行)

//先获取图例对象LegendTitle
LegendTitle legend = chart.getLegend() ;
//设置背景颜色
legend.setBackgroundPaint(Color.read) ;

2>设置图例的border:

//先获取图例对象LegendTitle
LegendTitle legend = chart.getLegend() ;
//设置边框,分别设置上,左,下,右四个方向的边框的宽度
legend.setBorder(float top,left,bottom,right) ;

3>设置图例的margin:

//先获取图例对象LegendTitle
LegendTitle legend = chart.getLegend() ;
//设置margin,分别设置上左下右四个方向的margin的值
legend.setMargin(top,left,bottom,right) ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值