`
VincentZheng
  • 浏览: 52649 次
  • 性别: 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>
分享到:
评论

相关推荐

    奇特的生活方式(全文).docx

    从小就想养猫的她,最终实现了自己的梦想,不仅救助了大量流浪猫,还为它们提供了一个温暖的家。她的这种无私奉献和爱心体现了对生命的尊重和关怀。 #### 蜘蛛女:与蜘蛛为伴 杰伊·瑞奇的故事展示了对蜘蛛这一...

    站长工具 v2.2完整无错版

    一个网站存在死链接不是什么好事,首先一个网站如果存在大量的死链接,必将大大损伤网站的整体形象,再者搜索引擎蜘蛛是通过链接来爬行搜索,如果太多链接无法到达,不但收录页面数量会减少,而且你的网站在搜索引擎...

    SSO单点登录概要设计说明书.doc

    SSO单点登录概要设计说明书.doc

    奥塔北煤矿6.0 Mta新井设计说明书.docx

    奥塔北煤矿6.0 Mta新井设计说明书.docx

    基于S7-200 PLC和组态王的喷泉控制系统设计与实现

    内容概要:本文详细介绍了基于S7-200 PLC和组态王软件构建喷泉控制系统的全过程。首先明确了系统的IO分配,包括启动按钮、停止按钮以及喷泉水泵的连接方式。接着展示了梯形图程序的设计,涵盖了基本的启停控制逻辑、定时循环和模式切换机制。随后提供了详细的接线图原理图,解释了输入输出部分的具体接线方法。最后讲述了组态王的画面设计,包括创建工程、定义变量和绘制监控界面等步骤。此外还分享了一些调试过程中遇到的问题及解决方案。 适合人群:对自动化控制感兴趣的初学者和技术人员,尤其是那些希望深入了解PLC编程和人机界面设计的人群。 使用场景及目标:适用于小型喷泉项目的实际控制系统开发,旨在帮助读者掌握PLC编程技巧、熟悉组态软件的应用,并能够独立完成类似的自动化控制系统设计。 其他说明:文中不仅包含了理论知识讲解,还附带了许多实践经验分享,如硬件配置建议、常见错误规避措施等,有助于提高实际操作能力。

    计算机二级PPT精选二十套(标红).jpg

    计算机二级PPT精选二十套(标红)

    保险公司IT变更管理流程设计说明书.doc.doc

    保险公司IT变更管理流程设计说明书.doc.doc

    毕业设计说明书A江坝后式厂房双曲拱坝设计.pdf

    毕业设计说明书A江坝后式厂房双曲拱坝设计.pdf

    《计算机二级MS精选300道选择题.docx》

    内容概要:文档《计算机二级MS精选300道选择题.docx》涵盖了计算机二级考试中Microsoft Office软件(Word、Excel、PowerPoint)及计算机基础知识的选择题。题目涉及软件操作技巧、功能应用、常见问题解决等方面,旨在帮助考生熟悉并掌握相关知识点,提高应试能力。文档内容详尽,涵盖面广,从基础操作到高级应用均有涉及,适合考生全面复习备考。 适用人群:准备参加计算机二级考试的学生及相关从业人员,特别是需要强化Office软件操作技能和计算机基础知识的人员。 使用场景及目标:①考生可以在复习过程中使用这些选择题进行自我检测,巩固所学知识;②教师可以将其作为教学辅助材料,帮助学生更好地理解和掌握课程内容;③培训机构可以用这些题目作为测试题库,评估学员的学习效果。 其他说明:文档不仅提供了大量的选择题,还详细解析了每道题目的答案,有助于考生深入理解知识点。此外,题目内容紧跟最新考试大纲,确保考生能够获得最有效的备考资料。

    基于多目标黏菌优化算法(MOSMA)的SVM参数优化及其在回归预测中的应用

    内容概要:本文介绍了一种创新的方法,利用多目标黏菌优化算法(MOSMA)来优化支持向量机(SVM)的参数C和gamma,从而提高回归预测的效果。首先详细解释了MOSMA的工作原理,包括黏菌权重更新、快速非支配排序以及自适应参数调整等关键技术点。接着展示了具体的Python代码实现,涵盖数据预处理、适应度函数定义、参数更新规则等方面。实验结果显示,在风电功率预测等多个应用场景中,相较于传统的网格搜索方法,MOSMA能够更快更有效地找到最优参数组合,显著提升了预测性能。 适合人群:从事机器学习研究或应用开发的技术人员,尤其是关注SVM参数优化及回归预测领域的从业者。 使用场景及目标:适用于需要进行高效参数寻优的回归预测任务,如风电功率预测、设备负载预测等。主要目标是通过改进SVM参数配置,获得更高的预测精度和更好的泛化能力。 其他说明:文中提供了完整的代码示例和详细的实施步骤指导,帮助读者快速理解和应用这一先进的优化技术。此外,还讨论了一些常见的注意事项和技术细节,如数据标准化、参数范围设定、并行化改造等。

    毕业设计 某油库设计说明书.pdf

    毕业设计 某油库设计说明书.pdf

    Q235钢板焊接工艺设计说明书.docx

    Q235钢板焊接工艺设计说明书.docx

    75t循环流化床锅炉设计说明书.doc

    75t循环流化床锅炉设计说明书.doc

    (最新修订版)直列四缸柴油机配气机构设计毕业论文设计说明书.doc

    (最新修订版)直列四缸柴油机配气机构设计毕业论文设计说明书.doc

    DeepSeek大模型生态报告:中国AI技术突破及其全球影响分析

    内容概要:《deepseek大模型生态报告 2025年2月》详细介绍了DeepSeek大模型的背景、应用现状、技术特点及其产业生态。DeepSeek由杭州深度求索公司创立,通过一系列技术创新,如多层注意力架构(MLA)、FP8混合精度训练框架、DualPipe跨节点通信等,显著降低了训练成本和提高了模型性能。DeepSeek在国内和国际市场迅速崛起,登顶苹果应用商店免费APP下载排行榜,并被多家企业和机构接入,包括华为、三大运营商、微软、英伟达等。其开源策略和低成本优势对全球科技供应链和资本市场产生了深远影响,尤其是在AI领域。 适合人群:对人工智能、大模型技术感兴趣的科技爱好者、研究人员、企业家及政策制定者。 使用场景及目标:①了解DeepSeek大模型的技术创新和应用现状;②探讨DeepSeek对全球AI产业生态的影响;③分析DeepSeek在不同行业(如金融、医疗、教育、制造等)的具体应用案例。 其他说明:报告还涵盖了各国政府及相关机构对DeepSeek的态度和政策回应,以及DeepSeek对未来AI技术发展和国际竞争格局的启示。此外,报告深入剖析了DeepSeek在技术架构、数据策略和工程实践方面的突破,揭示了其成功背后的组织文化和创新机制。

    基于粒子群算法的电动汽车区域综合能源系统三方定价优化研究

    内容概要:本文详细介绍了利用粒子群算法解决电动汽车区域综合能源系统中光伏电站、充电桩运营商和电网公司在定价上的三方博弈问题。通过MATLAB代码实现了粒子群算法的具体应用,包括参数设置、适应度函数设计、粒子更新策略以及结果可视化。文中展示了如何将三方定价变量编码成多维粒子,并通过目标函数计算和约束处理确保粒子在合理的解空间内搜索最优解。最终得到的电价曲线反映了不同时间段内的供需变化,验证了算法的有效性和实用性。 适合人群:从事能源系统优化、智能算法应用的研究人员和技术开发者。 使用场景及目标:适用于需要进行能源系统优化调度的场景,特别是涉及多方利益协调的问题。目标是找到光伏电价、充电桩电价和电网电价的最佳组合,使得三方利益达到最优平衡。 其他说明:建议在调试过程中关注特定时段的电价突变,适当调整参数如社会认知系数和社会学习因子,以获得更好的收敛效果。此外,初始粒子的位置选择对收敛速度有很大影响,推荐采用高斯扰动等方法进行初始化。

    WY02锥齿轮的加工工艺规程及工时定额计算 课程设计说明书.docx

    WY02锥齿轮的加工工艺规程及工时定额计算 课程设计说明书.docx

    项目管理制度范文.docx

    项目管理制度范文.docx

    风电工程技术:DFIG双馈风力发电机仿真模型解析与应用

    内容概要:本文深入探讨了双馈风力发电机(DFIG)的仿真建模及其关键技术模块。首先介绍了最大功率跟踪(MPPT)模块的工作原理,利用爬山算法优化风能利用率。接着详细讲解了转子侧变流器的矢量控制,包括坐标变换、PI调节器参数设定以及抗饱和处理。文中还讨论了网侧变流器的直流电压控制方法,强调了双闭环结构的重要性,并分享了低电压穿越仿真的实践经验。此外,文章详细解释了功率解耦控制和变速恒频实现的技术细节,提供了丰富的故障案例和调试技巧。 适合人群:从事风电工程研究和技术开发的专业人士,尤其是对DFIG仿真建模感兴趣的工程师和研究人员。 使用场景及目标:适用于希望深入了解DFIG内部机制的研究人员,帮助他们掌握从基本原理到复杂控制策略的设计与实现。同时,也为实际工程项目提供宝贵的调试经验和故障排除指南。 其他说明:文章不仅涵盖了理论分析,还包括大量实用的代码片段和具体的参数配置建议,确保读者能够顺利构建并运行仿真模型。

Global site tag (gtag.js) - Google Analytics