在Servlet中的代码:
package com.lyb.pic;
import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
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.category.DefaultCategoryDataset;
public class Bar extends HttpServlet {
public void doGet(HttpServletRequestrequest,HttpServletResponse response) throws IOException {
doPost(request,response);
}
public void doPost(HttpServletRequestrequest,HttpServletResponse response) throws IOException {
//设置返回类型为图片
response.setContentType("image/png");
//设置返回字体
response.setCharacterEncoding("utf-8");
//获取数据集对象
CategoryDataset cd =getData();
JFreeChart jfc =ChartFactory.createBarChart3D("2010购书组成", "季度", "组成", cd,PlotOrientation.VERTICAL, true, true, false);
//设置标题的字体,以防止中文乱码
TextTitle tt = newTextTitle("2010购书组成");
tt.setFont(new Font("宋体",Font.BOLD, 12));
jfc.setTitle(tt);
//获取图表区域对象
CategoryPlot cp =(CategoryPlot)jfc.getCategoryPlot();
//设置网格线可见
cp.setDomainCrosshairVisible(true);
//获取x轴对象
CategoryAxis ca =cp.getDomainAxis();
//设置x轴显示的分类名称的显示位置,如果不设置则水平显示
//设置后,可以斜像显示,但分类角度,图表空间有限时,建议采用
ca.setCategoryLabelPositions(CategoryLabelPositions
.createUpRotationLabelPositions(0.39269908169872414D));
ca.setCategoryMargin(0.0D);
//设置距离图片左端距离此时为10%
ca.setLowerMargin(0.1);
//设置距离图片右端距离此时为10%
ca.setUpperMargin(0.1);
//图表横轴与标签的距离(15像素)
ca.setCategoryLabelPositionOffset(15);
//横轴标签之间的距离20%
ca.setCategoryMargin(0.2);
//设置目录轴的显示标签字体,防止中文乱码
ca.setLabelFont(new Font("宋体",Font.BOLD, 12));
//设置横轴每个分段的字体显示,防止中文乱码
ca.setTickLabelFont(newFont("宋体", Font.BOLD, 12));
//设置图例的字体,为了防止中文乱码
jfc.getLegend().setItemFont(newFont("宋体", Font.BOLD, 12));
//获取y轴对象,即竖轴对象
NumberAxis na =(NumberAxis)cp.getRangeAxis();
//设置y轴的字体显示,防止中文乱码
na.setLabelFont(new Font("宋体",Font.BOLD, 12));
//获取柱子对象
ValueAxis valueAxis =cp.getRangeAxis();
//设置最高的柱子与图片顶端的距离,现在为10%
valueAxis.setUpperMargin(0.1);
//获取图形对象
BarRenderer3D br =(BarRenderer3D) cp.getRenderer();
//设置不显示边框线
br.setDrawBarOutline(false);
// 将图表已数据流的方式返回给客户端
ChartUtilities.writeChartAsPNG(response.getOutputStream(),jfc,500, 270);
}
private static CategoryDataset getData() {
//时间维度,用于在x轴显示
String [] c1 ={"第一季度","第二季度","第三季度","第四季度"};
//分类的维度,由数量表示,在y轴显示
String [] c2 ={"java","c","c++","动画"};
//创建数据对象
DefaultCategoryDataset dcd =new DefaultCategoryDataset();
//通过双重for循环取出值,然后添加进dpd中
for(int i = 0;i< c1.length;i++) {
String c3 =c1[i];
for(int j =0;j < c2.length;j++) {
Stringc4 = c2[j];
dcd.setValue(DataUtils.getNumber(),c4, c3);
}
}
return dcd;
}
}
产生的假数据代码:
package com.lyb.pic;
import java.util.Random;
public class DataUtils {
private static Random random = newRandom();
private static final int NUMBER = 100;
public static int getNumber() {
returnrandom.nextInt(NUMBER);
}
}
在xml中的代码:
<servlet>
<servlet-name>bar</servlet-name>
<servlet-class>com.lyb.pic.Bar</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>bar</servlet-name>
<url-pattern>/bar</url-pattern>
</servlet-mapping>
JFreeChart中的柱状图代码
猜你喜欢
转载自357029540.iteye.com/blog/2203520
今日推荐
周排行