`
VincentZheng
  • 浏览: 52168 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

一个另类而简单的蜘蛛图

阅读更多
首先是填写数据和生成图像的Java类(可以根据实际情况用在action里):
import java.awt.Color;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpSession;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
import org.jfree.chart.plot.SpiderWebPlot;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.util.Rotation;

public class CreateChart {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private static CategoryDataset createDataset() {
		String s = "First";
		String s3 = "Category 1";
		String s4 = "Category 2";
		String s5 = "Category 3";
		String s6 = "Category 4";
		String s7 = "Category 5";
		DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();
		
		defaultcategorydataset.addValue(80D, s, s3);
		defaultcategorydataset.addValue(40D, s, s4);
		defaultcategorydataset.addValue(30D, s, s5);
		defaultcategorydataset.addValue(50D, s, s6);
		defaultcategorydataset.addValue(90D, s, s7);
		return defaultcategorydataset;
	}

	private static JFreeChart createChart(CategoryDataset categorydataset) {
		SpiderWebPlot spiderwebplot = new SkillScorePlot(categorydataset);
		spiderwebplot.setStartAngle(45D);
		categorydataset.getValue(0, 1);
		
		spiderwebplot.setBackgroundPaint(Color.LIGHT_GRAY);
		spiderwebplot.setMaxValue(100D);
		spiderwebplot.setDirection(Rotation.ANTICLOCKWISE);
		spiderwebplot.setAxisLinePaint(Color.blue);
		spiderwebplot.setInteriorGap(0.3D);
		spiderwebplot.setToolTipGenerator(new StandardCategoryToolTipGenerator());
		JFreeChart jfreechart = new JFreeChart("Competency Overall",TextTitle.DEFAULT_FONT, spiderwebplot, false);
		jfreechart.setBackgroundPaint(Color.cyan);
		return jfreechart;
	}

		
	
	public String getSpiderChart(HttpSession session, PrintWriter printWriter){
		
		JFreeChart jfreeChart = createChart(createDataset());
		ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
		String fileName = null;
		try {
			fileName = ServletUtilities.saveChartAsPNG(jfreeChart, 500, 300, info,
					session);// 生成图片
			// Write the image map to the PrintWriter
			ChartUtilities.writeImageMap(printWriter, fileName, info, false);
		} catch (IOException e) {
			e.printStackTrace();
		}
		printWriter.flush();
		return fileName;// 返回生成图片的文件名
	}

}

因为要用到显示数据的标签,必须重写SpiderWebPlot类的drawLabel方法:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.font.LineMetrics;
import java.awt.font.TextAttribute;
import java.awt.geom.Arc2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.HashMap;
import org.jfree.chart.plot.SpiderWebPlot;
import org.jfree.data.category.CategoryDataset;

/**
 * 
 * @author Vincent.zheng this class is for draw the label.
 * 
 */
public class SkillScorePlot extends SpiderWebPlot {

	private static final long serialVersionUID = 1L;

	/**
	 * @param LABELANDAXISGAP : the gap between the label and the axis.
	 * @param LABELANDCENTERGAP : the gap between the label and the center point.
	 */
	private static final double LABELANDAXISGAP = 10;
	private static final double LABELANDCENTERGAP = 1;

	public SkillScorePlot(CategoryDataset categorydataset) {
		super(categorydataset);
	}

	/**
	 * @param extent : the angle gap between two near axis.
	 */
	@Override
	protected void drawLabel(Graphics2D graphics2D, Rectangle2D rectangle2D,
			double value, int cat, double startAngle, double extent) {

		super
				.drawLabel(graphics2D, rectangle2D, value, cat, startAngle,
						extent);

		/**
		 * @param sumAxisNum : the sum number of the axis.
		 * @param centerX : the center X coordinate of the panel.
		 * @param centerY : the center Y coordinate of the panel.
		 */
		int sumAxisNum = this.getDataset().getColumnCount();
		double centerX = rectangle2D.getCenterX();
		double centerY = rectangle2D.getCenterY();
		Arc2D arc2D;
		FontRenderContext fontRenderContext = graphics2D.getFontRenderContext();

		for (int currentAxisNum = 0; currentAxisNum < sumAxisNum; currentAxisNum++) {

			/**
			 * @param currentValue : the value of the current axis.
			 * @param label : the value on the label.
			 * @param scale : the scale of the point value to the max value on
			 *            current axis.
			 */
			double currentValue = this.getDataset().getValue(0, currentAxisNum).doubleValue();
			String label = String.valueOf((int) currentValue);
			double scale = (currentValue / this.getMaxValue());
			/**
			 * the coordinate of the label
			 */

			if (startAngle == this.getStartAngle()) {
				double labelX;
				double labelY;
				/**
				 * @param currentAngle : the angle of the current axis where the label place.
				 */
				double currentAngle = extent * currentAxisNum + startAngle;
				arc2D = new Arc2D.Double(rectangle2D, currentAngle, 0, Arc2D.OPEN);
				Point2D point2D = arc2D.getEndPoint();
				double axisX = Math.abs(point2D.getX() - centerX)* scale;
				double axisY = Math.abs(point2D.getY() - centerY)* scale;

				if (currentAngle >= 0 && currentAngle < 90) {
					labelX = centerX + axisX;
					labelY = centerY - axisY;
				} else if (currentAngle < 180) {
					labelX = centerX - axisX;
					labelY = centerY - axisY;
				} else if (currentAngle < 270) {
					labelX = centerX - axisX;
					labelY = centerY + axisY;
				} else {
					labelX = centerX + axisX;
					labelY = centerY + axisY;
				}
				
				LineMetrics lm = getLabelFont().getLineMetrics(label,
						fontRenderContext);
				double ascent = lm.getAscent();

				/**
				 * set the gap between the label and axis, or between the label
				 * and the center point.
				 */
				if (Math.abs(labelX - rectangle2D.getCenterX()) < LABELANDCENTERGAP) {
					labelX += LABELANDAXISGAP;
					labelY += ascent / (float) 2;
				} else if (Math.abs(labelY - rectangle2D.getCenterY()) < LABELANDCENTERGAP) {
					labelY += LABELANDAXISGAP;
				} else if (labelX >= rectangle2D.getCenterX()) {
					if (labelY < rectangle2D.getCenterY()) {
						labelX += LABELANDAXISGAP;
						labelY += LABELANDAXISGAP;
					} else {
						labelX -= LABELANDAXISGAP;
						labelY += LABELANDAXISGAP;
					}
				} else {
					if (labelY > rectangle2D.getCenterY()) {
						labelX -= LABELANDAXISGAP;
						labelY -= LABELANDAXISGAP;
					} else {
						labelX += LABELANDAXISGAP;
						labelY -= LABELANDAXISGAP;
					}
				}
				//set label font
				HashMap<TextAttribute, Comparable<?>> hm = new HashMap<TextAttribute, Comparable<?>>();
				hm.put(TextAttribute.SIZE, 14); 
				hm.put(TextAttribute.FAMILY,"Impact");//
				Font font = new Font(hm);

				graphics2D.setPaint(Color.blue);
				graphics2D.setFont(font);
				graphics2D.drawString(label, (float) labelX, (float) labelY);
			}
		}
	}
}

以上java代码就完成了,页面也很简单:
<%@ page contentType="text/html;charset=gb2312" pageEncoding="GB2312"%>
<%@ page import="com.bleum.test.ok.*"%>
<%@ page import="java.io.PrintWriter"%>
<%
	CreateChart createChart = new CreateChart();
	String fileName = createChart.getSpiderChart(session,
			new PrintWriter(out));
	String graphURL = request.getContextPath()
			+ "/servlet/DisplayChart?filename=" + fileName;
%>
<html>
<head>
<title>JFreeChart使用例子</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<img src="<%=graphURL%>" width=500 height=300 border=0
	usemap="<%=fileName%>">
</body>
</html>

不过要注意这里的servlet是JFreeChart已经封装好的一个类:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>test222</display-name>
  <welcome-file-list>
    <welcome-file>mychart.jsp</welcome-file>
  </welcome-file-list>
  <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>/servlet/DisplayChart</url-pattern>
  </servlet-mapping>
</web-app>
分享到:
评论

相关推荐

    易语言另类思路显示大图片

    例如,可以创建一个自定义的控件,通过滚动条控制图片的显示部分,这样只需要在屏幕可见区域加载图片的部分,而不是一次性加载整个大图片,从而节省系统资源。 其次,源码是学习和理解这一另类思路的关键。在提供的...

    图片轮播效果另类展示

    根据描述,作者希望将当前轮播效果的图片显示位置从右侧调整到下方,这是一个常见的布局变换需求。 首先,我们来了解图片轮播的基本结构。通常,图片轮播由以下几部分组成: 1. 图片容器:这是展示图片的区域,...

    商业编程-源码-一个另类图像库介绍及其Demo.zip

    本资源“商业编程-源码-一个另类图像库介绍及其Demo.zip”提供了一个独特的图像库及其演示示例,这对于开发者来说是一个宝贵的参考资料。下面我们将详细探讨这个另类图像库的特点、功能及可能的应用场景。 首先,...

    蜘蛛精调查表

    【标签】中的"另类其它"可能意味着这是一个非主流或不常见的应用,可能包含了独特的实现方式或者针对特殊场景的解决方案。"控件"可能指的是程序中用于用户交互的组件,比如按钮、文本框等,这些在ASP(Active Server...

    另类思路显示大图片易语言源码

    在IT行业中,编程语言是构建各种软件应用的基础,而易语言作为一款中文编程语言,以其简单易学的特点受到许多初学者的欢迎。本资源提供的是一段关于“另类思路显示大图片”的易语言源码,这通常是解决在有限的计算机...

    另类看图,图片放大,拖拉移动

    一个优秀的UI不仅需要美观,更应注重用户体验(UX)。"另类看图"可能采用了非传统或创新的布局和交互方式,以区别于常见的看图工具,如Windows自带的图片查看器。这种设计可能包括独特的导航元素、控件位置、色彩...

    比较另类的菜单

    在软件或应用程序中,一个优秀的酷炫菜单可以增加用户对产品的喜爱度,提高用户的停留时间和互动率。 结合标签"另类其它 控件 源码 资源",我们可以推断出这个压缩包可能包含了一些特殊的菜单控件的源代码资源。...

    易语言另类思路显示大图片源码.rar

    综合以上信息,这个压缩包提供了一个易语言处理大图片的实例,其中涉及的关键技术可能包括: 1. 图片分块加载:将大图片分割成多个小块,逐个加载到内存中,减少一次性加载的内存需求。 2. 延迟渲染:只在图片进入...

    另类仙剑

    9. **发布与打包**:最后,将所有组件打包成一个可执行文件,如"另类仙剑.exe",通常会涉及到编译、链接和资源打包等步骤,确保用户可以简单地下载和运行游戏。 综上所述,《另类仙剑》这款游戏很可能是一个包含了...

    干声另类效果

    另类效果

    易语言源码易语言另类思路显示大图片源码.rar

    "易语言源码易语言另类思路显示大图片源码.rar" 是一个压缩包文件,其中包含了使用易语言编写的程序源代码,专门用于展示如何以非传统方式在易语言程序中加载和显示大型图像。 在这个源码中,开发者可能采用了一种...

    另类云计算,另类物联网

    一方面,云计算为物联网提供了一个强大的数据处理平台,使得物联网中的海量数据能够被有效地存储和分析;另一方面,物联网产生的大量数据也为云计算的发展提供了丰富的应用场景。例如,在智慧城市项目中,通过部署...

    黑色另类的个人博客模板_黑色 另类 个人 博客 个性.rar

    "黑色另类的个人博客模板"正是这样一个专为寻求独特风格的博主设计的主题。它以其深沉的黑色背景和别具一格的设计元素,展现出一种不同于常规博客的风格,为用户提供了展现自我个性的平台。下面将详细探讨这个模板的...

    另类提取Word中图片的方法.docx

    这种方法虽然涉及到了文件格式的转换和解压缩,但它避免了传统方法中可能出现的图像质量损失和选择图片的麻烦,降低了出错的可能性,对于需要批量处理Word文档中图片的用户来说,无疑是一个实用且高效的解决方案。...

    算法设计 另类单堆拈游戏

    算法设计与分析基础 _ 上机P148-9另类单堆拈游戏 ...拿到最后一个的为输家 1、如果甲乙都知道窍门儿,那先拿的人输! 2、如果只有一人知道窍门,那他不管是先拿还是后拿赢的几率都非常大(约等于必赢)。

    javascript经典特效---另类导航菜单.rar

    【描述】:“另类导航菜单.rar”是一系列重复的文件名,这可能意味着这是一个压缩包中的重复文件或者目录结构,通常这样的情况可能是为了备份或确保文件完整。在这个案例中,我们可以理解为这个压缩包包含了一个HTML...

    非主流图片

    每种格式都有其特点,例如JPEG适合连续色调的图片,PNG支持透明度,而SVG是矢量图,可以无限放大不失真。 2. 图片编辑软件:Photoshop、GIMP、Illustrator等图像编辑工具,是创建和修改非主流图片的常用工具。用户...

    易语言另类思路显示大图片源码.zip易语言项目例子源码下载

    易语言另类思路显示大图片源码.zip易语言项目例子源码下载易语言另类思路显示大图片源码.zip易语言项目例子源码下载 1.合个人学习技术做项目参考 2.适合学生做毕业设计参考 3.适合小团队开发项目参考

Global site tag (gtag.js) - Google Analytics