首先是填写数据和生成图像的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>
分享到:
相关推荐
从小就想养猫的她,最终实现了自己的梦想,不仅救助了大量流浪猫,还为它们提供了一个温暖的家。她的这种无私奉献和爱心体现了对生命的尊重和关怀。 #### 蜘蛛女:与蜘蛛为伴 杰伊·瑞奇的故事展示了对蜘蛛这一...
一个网站存在死链接不是什么好事,首先一个网站如果存在大量的死链接,必将大大损伤网站的整体形象,再者搜索引擎蜘蛛是通过链接来爬行搜索,如果太多链接无法到达,不但收录页面数量会减少,而且你的网站在搜索引擎...
22T挖掘机回转减速器设计说明书.doc.doc
步进式推刚机设计说明书.doc
《单片机技术》课程设计说明书 8x8x8的光立方设计.docx
累加平均算法verilog
内容概要:本文详细介绍了支持向量机(SVM)、BP神经网络和LSTM网络在时间序列预测中的应用及其MATLAB实现。首先,针对SVM部分,文章讲解了如何将时间序列数据转化为特征矩阵并通过滑动窗口进行预测,强调了交叉验证的重要性。对于BP神经网络,则着重于数据归一化以及网络结构的选择,并指出BP网络容易陷入局部最优的问题。最后,在LSTM部分,文章展示了如何利用MATLAB的深度学习工具箱实现LSTM网络,解决了输入数据格式转换的问题,并实现了滚动预测。文中提供了具体的代码示例,确保读者能够轻松替换数据源并运行程序。 适用人群:适用于有一定MATLAB基础的时间序列预测初学者和技术爱好者。 使用场景及目标:帮助读者掌握三种不同类型的机器学习模型在时间序列预测任务中的具体应用,理解各自的特点和优缺点,从而选择合适的模型应用于实际项目中。 其他说明:文章不仅提供了详细的理论解释,还给出了完整的代码实现,使得读者可以直接上手实践。同时,作者提醒了一些常见的错误和注意事项,如数据格式、归一化等问题,有助于提高预测准确性。
内容概要:本文详细介绍了利用S7-200 PLC和组态王构建智能花式喷泉控制系统的设计思路和技术细节。首先阐述了喷泉系统的基本构成,包括硬件部分如PLC、喷嘴及其连接方式,以及软件部分如喷嘴控制逻辑、喷泉变换逻辑和控制画面设计。接着展示了具体的梯形图接线图和代码实现,解释了关键变量的作用和程序流程。最后讨论了系统测试与调试的方法,强调了硬件配置、IO分配、通信配置等方面的注意事项,并分享了一些实用技巧。 适合人群:对工业自动化感兴趣的工程技术人员,特别是从事PLC编程和组态软件应用的从业者。 使用场景及目标:适用于需要设计和实施智能喷泉控制系统的项目,旨在提高喷泉展示的效果和管理效率。通过学习本文,读者可以掌握如何使用PLC和组态王创建复杂的喷泉控制系统,实现多样化的喷水模式。 其他说明:文中提供了丰富的实践经验,包括常见问题的解决方案和优化建议,有助于读者更好地理解和应用相关技术。同时,附带的实际案例使理论更加生动具体,便于理解和模仿。
内容概要:本文详细介绍了基于西门子S7-200 PLC的饮料灌装机控制系统的设计与实现。首先阐述了硬件设计,包括瓶体输送、定位检测、液体灌装、计数统计等环节的具体配置,如CPU224搭配EM221数字量扩展模块及其I/O分配。接着深入解析了梯形图程序的核心代码,涵盖系统启停控制、灌装流程控制以及产量统计等功能模块。此外,还展示了如何利用WinCC Flexible进行组态画面设计,实现了动态液位显示、实时计数器和电磁阀状态指示灯等功能。最后分享了一些调试过程中遇到的实际问题及解决方案,如接近开关接线错误、电磁阀动作引起的输出抖动等问题,并提出了效率优化技巧。 适合人群:从事PLC编程、自动化控制系统的工程师和技术人员,尤其是对西门子S7-200系列PLC感兴趣的读者。 使用场景及目标:适用于饮料行业或其他类似行业的灌装生产线控制系统开发项目。目标是帮助读者掌握S7-200 PLC在实际生产环境中的应用方法,提高系统的稳定性、可靠性和效率。 其他说明:文中不仅提供了详细的理论讲解,还包括了许多实用的经验分享和注意事项,有助于读者更好地理解和应用于实际工作中。同时,对于初学者而言,可以作为学习PLC编程和控制系统设计的良好参考资料。
6156铝合金平板对接焊焊接工艺及夹具设计 设计说明书.doc
中兴U30高级web后台app
内容概要:本文详细介绍了一款基于LABVIEW开发的通用型PLC通讯与数据处理程序。该程序主要用于与西门子PLC进行通讯,完成数据采集、存储、回放、处理及报警显示等功能。文中具体介绍了各个功能模块的实现方法和技术要点,包括OPC协议通讯、内存和CSV文件存储、数据回放与处理、报警逻辑等。此外,作者还分享了一些开发过程中遇到的问题及其解决方案。 适合人群:从事工业自动化领域的工程师、技术人员,尤其是熟悉LABVIEW和PLC编程的专业人士。 使用场景及目标:适用于需要进行工业数据采集和处理的各种项目,旨在帮助开发者快速构建稳定可靠的数据采集系统,提高工作效率。 其他说明:文中提供了详细的代码示例和注意事项,有助于读者更好地理解和应用相关技术。同时,该程序具有良好的扩展性和灵活性,可以根据具体需求进行定制化开发。
老网卡驱动程序,给老电脑老系统(XP,WIN7等)留存备用啦
内容概要:本文详细介绍了最新的电动汽车设计方案,涉及电池管理系统(BMS)、电机控制以及PCB设计等方面。文中首先展示了高压平台的BMS控制板及其采用的Rust语言实现的主动均衡算法,该算法通过移动平均替代传统阈值判断,提高了均衡效率。接着讨论了电机控制部分,特别是FOC算法的实现细节,强调了硬件设计中的关键组件选择和布局技巧,如MOSFET驱动电路和DC-Link电容的放置。此外,文章还探讨了CAN总线通信协议的应用,确保各模块间稳定的数据传输。最后提到了一些实用的设计建议,如热管理和防呆设计等。 适合人群:从事新能源汽车研究与开发的专业人士,尤其是对电动汽车硬件设计和软件实现感兴趣的工程师。 使用场景及目标:帮助读者深入了解电动汽车的关键技术和设计理念,为实际项目提供理论支持和技术指导。同时,也为初学者提供了入门级别的理解和实践方法。 其他说明:文章不仅包含了详细的代码示例和技术解析,还附带了一些实用的小贴士,如硬件防护措施和设计注意事项。
(整理)平压印刷机运动方案和主要机构设计课程设计说明书.doc
蛋壳清洁机设计说明书.pdf
二氧化硫填料吸收塔设计_毕业设计说明书.doc
内容概要:本文详细探讨了三相和单相整流仿真中的关键技术,重点介绍了双闭环PI控制、空间矢量脉宽调制(SVPWM)以及锁相环(PLL)的应用。文章首先解释了三相整流中的电压外环和电流内环的作用机制,强调了电流内环PI参数调节的重要性,并提供了具体的MATLAB代码示例。接着讨论了PLL在电网电压跌落情况下的表现及其改进方法,如采用二阶广义积分器(SOGI)结构提高稳定性。对于SVPWM部分,则讲解了扇区判断逻辑和波形生成的具体步骤,指出调制比过高会导致波形畸变的问题并提出解决方案。此外,还涉及了单相整流中SPWM的实现方式,包括虚拟正交生成和电流环设计,以及如何应对二次谐波干扰。最后,文章总结了一些实用的经验和技术要点,如参数整定、仿真步长选择等。 适合人群:从事电力电子研究的技术人员、高校相关专业师生、对电力电子控制系统感兴趣的工程师。 使用场景及目标:适用于希望深入了解三相和单相整流仿真原理的研究者,旨在帮助他们掌握双闭环控制、SVPWM和PLL的实际应用技巧,从而更好地进行系统设计和故障排除。 其他说明:文中不仅包含了详细的理论分析,还附有大量的代码片段供读者参考实践,有助于加深理解和提高动手能力。同时提醒读者关注一些常见的陷阱和注意事项,确保仿真结果更加可靠。
该资源为joblib-0.12.2-py2.py3-none-any.whl,欢迎下载使用哦!