java JFreeChart绘制股票分时图问题
[code=java][public class Ceshi {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws IOException {
String imageDir = "E:/images";
File images = new File(imageDir);
if (!images.exists()) {
images.mkdir();
}
String imageFile = imageDir + "/jstockchart-timeseries.png";
double lastPrice = 23.50;
//创建一个包含TimeseriesItem的List实例。
//注意:所有的数据,都必须在"同一天"内。
List data = makeTimeseriesItem();
//创建SegmentedTimeline实例,表示时间区间"09:30-11:30,13:00-15:00"。
SegmentedTimeline timeline = new SegmentedTimeline(
SegmentedTimeline.MINUTE_SEGMENT_SIZE, 1351, 89);
timeline.setStartTime(SegmentedTimeline.firstMondayAfter1900() + 780
* SegmentedTimeline.MINUTE_SEGMENT_SIZE);
//创建TimeseriesDataset实例,时间间隔为1分钟。
TimeseriesDataset dataset = new TimeseriesDataset(Minute.class, 1,
timeline, false);
//向dataset中加入TimeseriesItem的List
dataset.addDataItems(data);
//创建逻辑价格坐标轴。指定中间价为lastPrice,显示9个坐标值,坐标值的格式为".00"。
CentralValueAxis logicPriceAxis = new CentralValueAxis(
new Double(lastPrice), new Range(
dataset.getMinPrice().doubleValue(), dataset
.getMaxPrice().doubleValue()), 9,
new DecimalFormat(".00"));
//创建价格区域
PriceArea priceArea = new PriceArea(logicPriceAxis);
//设定显示中线
priceArea.setMarkCentralValue(true);
//设定中线颜色
priceArea.setCentralPriceColor(new Color(0x0000FF));
//不显示均价线
priceArea.setAverageVisible(false);
//设定价格区背景色
priceArea.setBackgroudColor(new Color(0xFFFFCC));
//设定价格线的颜色
priceArea.setPriceColor(new Color(0x330033));
//创建逻辑量坐标轴。显示5个坐标值,坐标值的格式为"0"。
LogicNumberAxis logicVolumeAxis = new LogicNumberAxis(new Range(dataset
.getMinVolume().doubleValue(), dataset.getMaxVolume()
.doubleValue()), 5, new DecimalFormat("0"));
// 创建量区域
VolumeArea volumeArea = new VolumeArea(logicVolumeAxis);
//背景色
volumeArea.setBackgroudColor(new Color(0xFFFFCC));
//设定量图的颜色
volumeArea.setVolumeColor(new Color(0x3366FF));
//创建时序图区域
TimeseriesArea timeseriesArea = new TimeseriesArea(priceArea,
volumeArea, createlogicDateAxis(DateUtils.createDate(2008, 1, 1)));
//设定价格区占的权重
timeseriesArea.setPriceWeight(3);
//通过JStockChartFactory的工厂方法生成JFreeChart实例。
//指定了该图的标题为"Timeseries Chart Demo",并且不生成图例(legend)。
JFreeChart jfreechart = JStockChartFactory.createTimeseriesChart(
"实时走势图", dataset, timeline, timeseriesArea, false);
XYPlot plot = (XYPlot)jfreechart.getPlot();
plot.setBackgroundAlpha(0.618f);
//创建图像文件。图像格式为PNG,长为545,宽为300。
ChartUtilities.saveChartAsPNG(new File(imageFile), jfreechart, 545, 300);
}
//读取文件数据
private static List<TimeseriesItem> makeTimeseriesItem(){
List<TimeseriesItem> list = new ArrayList<TimeseriesItem>();
File dataFile=new File("E:\\测试文件夹","测试.txt");
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
BufferedReader br = null;
try{
br = new BufferedReader(new FileReader(dataFile));
while(true){
String line = br.readLine();
if(line == null){
break;
}
line = line.trim();
if(line.startsWith("cn_") || line.startsWith("#")){
continue;
}
String[] ctx = line.split(";");
Date d = df.parse("2009" + ctx[0] + "00");
double price = Double.parseDouble(ctx[1]);
int v = Integer.parseInt(ctx[2]);
TimeseriesItem ti = new TimeseriesItem(d,price,v);
list.add(ti);
}
}catch(Exception e){
e.printStackTrace();
}finally{
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return list;
}
//指定时期坐标轴中的逻辑坐标。
private static LogicDateAxis createlogicDateAxis(Date baseDate) {
LogicDateAxis logicDateAxis = new LogicDateAxis(baseDate,
new SimpleDateFormat("HH:mm"));
logicDateAxis.addDateTick("09:30", TickAlignment.START);
logicDateAxis.addDateTick("10:00");
logicDateAxis.addDateTick("10:30");
logicDateAxis.addDateTick("11:00");
logicDateAxis.addDateTick("11:30", TickAlignment.END);
logicDateAxis.addDateTick("13:00", TickAlignment.START);
logicDateAxis.addDateTick("13:30");
logicDateAxis.addDateTick("14:00");
logicDateAxis.addDateTick("14:30");
logicDateAxis.addDateTick("15:00", TickAlignment.END);
return logicDateAxis;
}
}]
程序数据从文本文档中读取,数据格式为
07040930;6.6;2658
07040931;6.7;5867
07040932;6.8;3567
07040933;6.9;5789
07040934;5.6;6987
07040935;6.6;2658
07040936;6.7;5867
07040937;6.8;3567
07040938;6.9;5789
07040939;506;6987
07040940;6.6;2658
07040941;6.7;5867
07040942;6.8;3567
07040943;6.9;5789
调试过程中,总是提示
You are attempting to add an observation for the time period Sat Jul 04 10:00:00 CST 2009 but the series already contains an observation for that time period. Duplicates are not permitted. Try using the addOrUpdate() method.
请问哪里有问题,有什么解决方法?