问题:折线图中,时间单位是天时,同一天的两条数据,在时间轴上展现为两个点,而不是一个点?
解决方法:
TimeSeriesCollection datas = new TimeSeriesCollection();
Map map = new HashMap();
String temp = "";
while (rs.next()) {
String order_id = rs.getString("order_id");
if (!order_id.equals(temp)) {
temp = order_id;
String region_name = rs
.getString("region_name");
String first_result = rs
.getString("first_result");
String total_num = rs.getString("num");
List tempData = new ArrayList();
tempData.add(new String[] { region_name,
first_result, total_num });
map.put(order_id, tempData);
} else {
List other = (List) map.get(order_id);
other.add(new String[] {
rs.getString("region_name"),
rs.getString("first_result"),
rs.getString("num") });
}
Set set = map.entrySet();
List tempList = new ArrayList(set);
Collections.sort(tempList, new Comparator() {
public int compare(Object arg0, Object arg1) {
return (Integer.parseInt(((Map.Entry) arg0)
.getKey().toString()) - Integer
.parseInt(((Map.Entry) arg1).getKey()
.toString()));
}
});
for (int i = 0; i < tempList.size(); i++) {
String key = (String) ((Map.Entry) tempList.get(i))
.getKey();
TimeSeries aLine = null;
Iterator myData = ((List) ((Map.Entry) tempList
.get(i)).getValue()).iterator();
int index = 0;
while (myData.hasNext()) {
String[] values = (String[]) myData.next();
if (index == 0) {
aLine = new TimeSeries(new String(values[0]
.getBytes("iso8859-1"), "gb2312"));
}
index++;
java.util.Date date = new java.util.Date();
date = sdf.parse(values[1]);
RegularTimePeriod rp = new Day(date);
aLine.add(rp, Double.parseDouble(values[2]));
}
datas.addSeries(aLine);
}
}
if (datas.getSeries().size() > 0) {
JFreeChart chart = ChartFactory
.createTimeSeriesChart("告警数量趋势 ", " 日期 ", " 告警数 ",
datas, true, true, false);
chart.setBackgroundPaint(Color.white);//设置曲线图背景色
String tipTemplete = "{0}{1},{2}";//设置折线中当鼠标移动到点上,展现的消息
org.jfree.chart.plot.XYPlot xyplot = (org.jfree.chart.plot.XYPlot) chart
.getPlot();
xyplot.setBackgroundPaint(Color.white);
xyplot.setDomainGridlinePaint(Color.pink);
xyplot.setRangeGridlinePaint(Color.pink);
System.out.println(xyplot.getDatasetCount());
org.jfree.chart.renderer.xy.StandardXYItemRenderer renderer= (org.jfree.chart.renderer.xy.StandardXYItemRenderer) xyplot
.getRenderer();//获得渲染对象
renderer.setPlotShapes(true);
renderer .setToolTipGenerator(new StandardXYToolTipGenerator( tipTemplete, new SimpleDateFormat( "MM月 dd 日 "), new DecimalFormat( "##")));
DateAxis dateaxis = (DateAxis) xyplot.getDomainAxis(); //对 domain 轴上日期显示格式定义
dateaxis.setDateFormatOverride(new SimpleDateFormat(
"MM/dd"));
dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,1));//将时间轴上的点如果是同一天,是一个点,无论有几条数据
org.jfree.chart.entity.StandardEntityCollection sec = new org.jfree.chart.entity.StandardEntityCollection();
ChartRenderingInfo info = new ChartRenderingInfo(sec);
String filename = ServletUtilities.saveChartAsPNG(
chart, 740, 320, info, session);
PrintWriter picWrite = new PrintWriter(out);
ChartUtilities.writeImageMap(picWrite, "map0", info,
false);
graphURL = request.getContextPath()
+ "/imageOut?filename=" + filename;//自己指定访问路径
}
数据配置时的关键是:每条线需要一个名称,然后是时间,和改时间点上的值,在横轴和纵轴上形成一个点。