我想在K线图部分在加上链条折线图,请问高手该怎么实现,请帮帮忙!!package com.applet;import java.awt.Color;//颜色系统
import java.text.SimpleDateFormat;//时间格式
import java.awt.Paint;//画笔系统
import org.jfree.data.time.*;
import org.jfree.data.time.ohlc.OHLCSeries;
import org.jfree.data.time.ohlc.OHLCSeriesCollection;
import org.jfree.chart.renderer.xy.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.plot.*;
import org.jfree.chart.*;
public class Bar1 { public static void main(String[] args) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");// 设置日期格式
double highValue = Double.MIN_VALUE;// 设置K线数据当中的最大值
double minValue = Double.MAX_VALUE;// 设置K线数据当中的最小值
double high2Value = Double.MIN_VALUE;// 设置成交量的最大值
double min2Value = Double.MAX_VALUE;
OHLCSeries series = new OHLCSeries("");
series.add(new Day(28, 9, 2007), 9.2, 9.58, 9.16, 9.34);
series.add(new Day(27, 9, 2007), 8.9, 9.06, 8.83, 8.96);
series.add(new Day(26, 9, 2007), 9.0, 9.1, 8.82, 9.04);
series.add(new Day(25, 9, 2007), 9.25, 9.33, 8.88, 9.00);
series.add(new Day(24, 9, 2007), 9.05, 9.50, 8.91, 9.25);
series.add(new Day(21, 9, 2007), 8.68, 9.05, 8.40, 9.00);
series.add(new Day(20, 9, 2007), 8.68, 8.95, 8.50, 8.69);
series.add(new Day(19, 9, 2007), 8.80, 8.94, 8.50, 8.66);
series.add(new Day(18, 9, 2007), 8.88, 9.17, 8.69, 8.80);
series.add(new Day(17, 9, 2007), 8.26, 8.98, 8.15, 8.89);
series.add(new Day(14, 9, 2007), 8.44, 8.45, 8.13, 8.33);
series.add(new Day(13, 9, 2007), 8.13, 8.46, 7.97, 8.42);
series.add(new Day(12, 9, 2007), 8.2, 8.4, 7.81, 8.13);
series.add(new Day(11, 9, 2007), 9.0, 9.0, 8.1, 8.24);
series.add(new Day(10, 9, 2007), 8.6, 9.03, 8.40, 8.95);
series.add(new Day(7, 9, 2007), 8.89, 9.04, 8.70, 8.73);
series.add(new Day(6, 9, 2007), 8.4, 9.08, 8.33, 8.88);
series.add(new Day(5, 9, 2007), 8.2, 8.74, 8.17, 8.36);
series.add(new Day(4, 9, 2007), 7.7, 8.46, 7.67, 8.27);
series.add(new Day(3, 9, 2007), 7.5, 7.8, 7.48, 7.69);
series.add(new Day(31, 8, 2007), 7.4, 7.6, 7.28, 7.43);
series.add(new Day(30, 8, 2007), 7.42, 7.56, 7.31, 7.40);
series.add(new Day(29, 8, 2007), 7.42, 7.66, 7.22, 7.33);
series.add(new Day(28, 8, 2007), 7.31, 7.70, 7.15, 7.56);
series.add(new Day(27, 8, 2007), 7.05, 7.46, 7.02, 7.41);
series.add(new Day(24, 8, 2007), 7.05, 7.09, 6.90, 6.99);
series.add(new Day(23, 8, 2007), 7.12, 7.16, 7.00, 7.03);
series.add(new Day(22, 8, 2007), 6.96, 7.15, 6.93, 7.11);
series.add(new Day(21, 8, 2007), 7.10, 7.15, 7.02, 7.07);
series.add(new Day(20, 8, 2007), 7.02, 7.19, 6.94, 7.14);
final OHLCSeriesCollection seriesCollection = new OHLCSeriesCollection();
seriesCollection.addSeries(series);
TimeSeries series2 = new TimeSeries("");// 对应时间成交量数据
series2.add(new Day(28, 9, 2007), 260659400 / 100);
series2.add(new Day(27, 9, 2007), 119701900 / 100);
series2.add(new Day(26, 9, 2007), 109719000 / 100);
series2.add(new Day(25, 9, 2007), 178492400 / 100);
series2.add(new Day(24, 9, 2007), 269978500 / 100);
series2.add(new Day(21, 9, 2007), 361042300 / 100);
series2.add(new Day(20, 9, 2007), 173912600 / 100);
series2.add(new Day(19, 9, 2007), 154622600 / 100);
series2.add(new Day(18, 9, 2007), 200661600 / 100);
series2.add(new Day(17, 9, 2007), 312799600 / 100);
series2.add(new Day(14, 9, 2007), 141652900 / 100);
series2.add(new Day(13, 9, 2007), 221260400 / 100);
series2.add(new Day(12, 9, 2007), 274795400 / 100);
series2.add(new Day(11, 9, 2007), 289287300 / 100);
series2.add(new Day(10, 9, 2007), 289063600 / 100);
series2.add(new Day(7, 9, 2007), 351575300 / 100);
series2.add(new Day(6, 9, 2007), 451357300 / 100);
series2.add(new Day(5, 9, 2007), 442421200 / 100);
series2.add(new Day(4, 9, 2007), 671942600 / 100);
series2.add(new Day(3, 9, 2007), 349647800 / 100);
series2.add(new Day(31, 8, 2007), 225339300 / 100);
series2.add(new Day(30, 8, 2007), 160048200 / 100);
series2.add(new Day(29, 8, 2007), 247341700 / 100);
series2.add(new Day(28, 8, 2007), 394975400 / 100);
series2.add(new Day(27, 8, 2007), 475797500 / 100);
series2.add(new Day(24, 8, 2007), 297679500 / 100);
series2.add(new Day(23, 8, 2007), 191760600 / 100);
series2.add(new Day(22, 8, 2007), 232570200 / 100);
series2.add(new Day(21, 8, 2007), 215693200 / 100);
series2.add(new Day(20, 8, 2007), 200287500 / 100);
TimeSeriesCollection timeSeriesCollection = new TimeSeriesCollection();
timeSeriesCollection.addSeries(series2);
// 获取K线数据的最高值和最低值
int seriesCount = seriesCollection.getSeriesCount();
for (int i = 0; i < seriesCount; i++) {
int itemCount = seriesCollection.getItemCount(i);// 每一个序列有多少个数据项
for (int j = 0; j < itemCount; j++) {
// 取第i个序列中的第j个数据项的最大值
if (highValue < seriesCollection.getHighValue(i, j)) { highValue = seriesCollection.getHighValue(i, j);
}
// 取第i个序列中的第j个数据项的最小值
if (minValue > seriesCollection.getLowValue(i, j)) { minValue = seriesCollection.getLowValue(i, j);
}
}
}
// 获取最高值和最低值
int seriesCount2 = timeSeriesCollection.getSeriesCount();
for (int i = 0; i < seriesCount2; i++) {
int itemCount = timeSeriesCollection.getItemCount(i);
for (int j = 0; j < itemCount; j++) {
//取第i个序列中的第j个数据项的值
if (high2Value < timeSeriesCollection.getYValue(i, j)) { high2Value = timeSeriesCollection.getYValue(i, j);
}
//取第i个序列中的第j个数据项的值
if (min2Value > timeSeriesCollection.getYValue(i, j)) { min2Value = timeSeriesCollection.getYValue(i, j);
}
}
}
final CandlestickRenderer candlestickRender = new CandlestickRenderer();
// 设置是否使用自定义的边框线,程序自带的边框线的颜色不符合中国股票市场的习惯
candlestickRender.setUseOutlinePaint(true);
// 设置如何对K线图的宽度进行设定
candlestickRender.setAutoWidthMethod(CandlestickRenderer.WIDTHMETHOD_AVERAGE);
candlestickRender.setAutoWidthGap(0.001);// 设置各个K线图之间的间隔
candlestickRender.setUpPaint(Color.red);// 设置股票上涨的K线图颜色
candlestickRender.setDownPaint(Color.green);// 设置股票下跌的K线图颜色
DateAxis x1Axis = new DateAxis();// 设置x轴,也就是时间轴
x1Axis.setAutoRange(false);// 设置不采用自动设置时间范围
try {
//设置时间范围,注意时间的最大值要比已有的时间最大值要多一天
x1Axis.setRange(dateFormat.parse("2007-08-20"), dateFormat.parse("2007-09-29"));
} catch (Exception e) {
e.printStackTrace();
}
x1Axis.setTimeline(SegmentedTimeline.newMondayThroughFridayTimeline());
x1Axis.setAutoTickUnitSelection(false);// 设置不采用自动选择刻度值
x1Axis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);// 设置标记的位置
x1Axis.setStandardTickUnits(DateAxis.createStandardDateTickUnits());//设置标准的时间刻度单位
x1Axis.setDateFormatOverride(new SimpleDateFormat("dd"));// 设置显示时间的格式
NumberAxis y1Axis = new NumberAxis();// 设定y轴,就是数字轴
y1Axis.setAutoRange(false);// 不不使用自动设定范围
//设定y轴值的范围,比最低值要低一些,比最大值要大一些,这样图形看起来会美观些
y1Axis.setRange(minValue * 0.9, highValue * 1.1);
//设置刻度显示的密度
y1Axis.setTickUnit(new NumberTickUnit((highValue * 1.1 - minValue * 0.9) / 10)); // 设置画图区域对象
XYPlot plot1 = new XYPlot(seriesCollection, x1Axis, y1Axis,candlestickRender);
XYLineAndShapeRenderer xyBarRender = new XYLineAndShapeRenderer() {
private static final long serialVersionUID = 1L;// 为了避免出现警告消息,特设定此值
//匿名内部类用来处理当日的成交量柱形图的颜色与K线图的颜色保持一致
public Paint getItemPaint(int i, int j) {
// 收盘价高于开盘价,股票上涨,选用股票上涨的颜色
if (seriesCollection.getCloseValue(i, j) > seriesCollection.getOpenValue(i, j)) { return candlestickRender.getUpPaint();
} else {
return candlestickRender.getDownPaint();
}
}
}; NumberAxis y2Axis = new NumberAxis();// 设置Y轴,为数值,后面的设置,参考上面的y轴设置
y2Axis.setAutoRange(false);
y2Axis.setRange(min2Value * 0.9, high2Value * 1.1);
y2Axis.setTickUnit(new NumberTickUnit((high2Value * 1.1 - min2Value * 0.9) / 4));
// 建立第二个画图区域对象,主要此时的x轴设为了null值,因为要与第一个画图区域对象共享x轴
XYPlot plot2 = new XYPlot(timeSeriesCollection, null, y2Axis,xyBarRender);
// 建立一个恰当的联合图形区域对象,以x轴为共享轴
CombinedDomainXYPlot combineddomainxyplot = new CombinedDomainXYPlot(x1Axis);
//添加图形区域对象,后面的数字是计算这个区域对象应该占据多大的区域2/3
combineddomainxyplot.add(plot1, 2);
//添加图形区域对象,后面的数字是计算这个区域对象应该占据多大的区域1/3
combineddomainxyplot.add(plot2, 1);
combineddomainxyplot.setGap(10);// 设置两个图形区域对象之间的间隔空间*/
JFreeChart chart = new JFreeChart("中国联通",
JFreeChart.DEFAULT_TITLE_FONT, combineddomainxyplot, false);
ChartFrame frame = new ChartFrame("中国联通股票", chart);
frame.pack();
frame.setVisible(true);
}
}
import java.text.SimpleDateFormat;//时间格式
import java.awt.Paint;//画笔系统
import org.jfree.data.time.*;
import org.jfree.data.time.ohlc.OHLCSeries;
import org.jfree.data.time.ohlc.OHLCSeriesCollection;
import org.jfree.chart.renderer.xy.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.plot.*;
import org.jfree.chart.*;
public class Bar1 { public static void main(String[] args) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");// 设置日期格式
double highValue = Double.MIN_VALUE;// 设置K线数据当中的最大值
double minValue = Double.MAX_VALUE;// 设置K线数据当中的最小值
double high2Value = Double.MIN_VALUE;// 设置成交量的最大值
double min2Value = Double.MAX_VALUE;
OHLCSeries series = new OHLCSeries("");
series.add(new Day(28, 9, 2007), 9.2, 9.58, 9.16, 9.34);
series.add(new Day(27, 9, 2007), 8.9, 9.06, 8.83, 8.96);
series.add(new Day(26, 9, 2007), 9.0, 9.1, 8.82, 9.04);
series.add(new Day(25, 9, 2007), 9.25, 9.33, 8.88, 9.00);
series.add(new Day(24, 9, 2007), 9.05, 9.50, 8.91, 9.25);
series.add(new Day(21, 9, 2007), 8.68, 9.05, 8.40, 9.00);
series.add(new Day(20, 9, 2007), 8.68, 8.95, 8.50, 8.69);
series.add(new Day(19, 9, 2007), 8.80, 8.94, 8.50, 8.66);
series.add(new Day(18, 9, 2007), 8.88, 9.17, 8.69, 8.80);
series.add(new Day(17, 9, 2007), 8.26, 8.98, 8.15, 8.89);
series.add(new Day(14, 9, 2007), 8.44, 8.45, 8.13, 8.33);
series.add(new Day(13, 9, 2007), 8.13, 8.46, 7.97, 8.42);
series.add(new Day(12, 9, 2007), 8.2, 8.4, 7.81, 8.13);
series.add(new Day(11, 9, 2007), 9.0, 9.0, 8.1, 8.24);
series.add(new Day(10, 9, 2007), 8.6, 9.03, 8.40, 8.95);
series.add(new Day(7, 9, 2007), 8.89, 9.04, 8.70, 8.73);
series.add(new Day(6, 9, 2007), 8.4, 9.08, 8.33, 8.88);
series.add(new Day(5, 9, 2007), 8.2, 8.74, 8.17, 8.36);
series.add(new Day(4, 9, 2007), 7.7, 8.46, 7.67, 8.27);
series.add(new Day(3, 9, 2007), 7.5, 7.8, 7.48, 7.69);
series.add(new Day(31, 8, 2007), 7.4, 7.6, 7.28, 7.43);
series.add(new Day(30, 8, 2007), 7.42, 7.56, 7.31, 7.40);
series.add(new Day(29, 8, 2007), 7.42, 7.66, 7.22, 7.33);
series.add(new Day(28, 8, 2007), 7.31, 7.70, 7.15, 7.56);
series.add(new Day(27, 8, 2007), 7.05, 7.46, 7.02, 7.41);
series.add(new Day(24, 8, 2007), 7.05, 7.09, 6.90, 6.99);
series.add(new Day(23, 8, 2007), 7.12, 7.16, 7.00, 7.03);
series.add(new Day(22, 8, 2007), 6.96, 7.15, 6.93, 7.11);
series.add(new Day(21, 8, 2007), 7.10, 7.15, 7.02, 7.07);
series.add(new Day(20, 8, 2007), 7.02, 7.19, 6.94, 7.14);
final OHLCSeriesCollection seriesCollection = new OHLCSeriesCollection();
seriesCollection.addSeries(series);
TimeSeries series2 = new TimeSeries("");// 对应时间成交量数据
series2.add(new Day(28, 9, 2007), 260659400 / 100);
series2.add(new Day(27, 9, 2007), 119701900 / 100);
series2.add(new Day(26, 9, 2007), 109719000 / 100);
series2.add(new Day(25, 9, 2007), 178492400 / 100);
series2.add(new Day(24, 9, 2007), 269978500 / 100);
series2.add(new Day(21, 9, 2007), 361042300 / 100);
series2.add(new Day(20, 9, 2007), 173912600 / 100);
series2.add(new Day(19, 9, 2007), 154622600 / 100);
series2.add(new Day(18, 9, 2007), 200661600 / 100);
series2.add(new Day(17, 9, 2007), 312799600 / 100);
series2.add(new Day(14, 9, 2007), 141652900 / 100);
series2.add(new Day(13, 9, 2007), 221260400 / 100);
series2.add(new Day(12, 9, 2007), 274795400 / 100);
series2.add(new Day(11, 9, 2007), 289287300 / 100);
series2.add(new Day(10, 9, 2007), 289063600 / 100);
series2.add(new Day(7, 9, 2007), 351575300 / 100);
series2.add(new Day(6, 9, 2007), 451357300 / 100);
series2.add(new Day(5, 9, 2007), 442421200 / 100);
series2.add(new Day(4, 9, 2007), 671942600 / 100);
series2.add(new Day(3, 9, 2007), 349647800 / 100);
series2.add(new Day(31, 8, 2007), 225339300 / 100);
series2.add(new Day(30, 8, 2007), 160048200 / 100);
series2.add(new Day(29, 8, 2007), 247341700 / 100);
series2.add(new Day(28, 8, 2007), 394975400 / 100);
series2.add(new Day(27, 8, 2007), 475797500 / 100);
series2.add(new Day(24, 8, 2007), 297679500 / 100);
series2.add(new Day(23, 8, 2007), 191760600 / 100);
series2.add(new Day(22, 8, 2007), 232570200 / 100);
series2.add(new Day(21, 8, 2007), 215693200 / 100);
series2.add(new Day(20, 8, 2007), 200287500 / 100);
TimeSeriesCollection timeSeriesCollection = new TimeSeriesCollection();
timeSeriesCollection.addSeries(series2);
// 获取K线数据的最高值和最低值
int seriesCount = seriesCollection.getSeriesCount();
for (int i = 0; i < seriesCount; i++) {
int itemCount = seriesCollection.getItemCount(i);// 每一个序列有多少个数据项
for (int j = 0; j < itemCount; j++) {
// 取第i个序列中的第j个数据项的最大值
if (highValue < seriesCollection.getHighValue(i, j)) { highValue = seriesCollection.getHighValue(i, j);
}
// 取第i个序列中的第j个数据项的最小值
if (minValue > seriesCollection.getLowValue(i, j)) { minValue = seriesCollection.getLowValue(i, j);
}
}
}
// 获取最高值和最低值
int seriesCount2 = timeSeriesCollection.getSeriesCount();
for (int i = 0; i < seriesCount2; i++) {
int itemCount = timeSeriesCollection.getItemCount(i);
for (int j = 0; j < itemCount; j++) {
//取第i个序列中的第j个数据项的值
if (high2Value < timeSeriesCollection.getYValue(i, j)) { high2Value = timeSeriesCollection.getYValue(i, j);
}
//取第i个序列中的第j个数据项的值
if (min2Value > timeSeriesCollection.getYValue(i, j)) { min2Value = timeSeriesCollection.getYValue(i, j);
}
}
}
final CandlestickRenderer candlestickRender = new CandlestickRenderer();
// 设置是否使用自定义的边框线,程序自带的边框线的颜色不符合中国股票市场的习惯
candlestickRender.setUseOutlinePaint(true);
// 设置如何对K线图的宽度进行设定
candlestickRender.setAutoWidthMethod(CandlestickRenderer.WIDTHMETHOD_AVERAGE);
candlestickRender.setAutoWidthGap(0.001);// 设置各个K线图之间的间隔
candlestickRender.setUpPaint(Color.red);// 设置股票上涨的K线图颜色
candlestickRender.setDownPaint(Color.green);// 设置股票下跌的K线图颜色
DateAxis x1Axis = new DateAxis();// 设置x轴,也就是时间轴
x1Axis.setAutoRange(false);// 设置不采用自动设置时间范围
try {
//设置时间范围,注意时间的最大值要比已有的时间最大值要多一天
x1Axis.setRange(dateFormat.parse("2007-08-20"), dateFormat.parse("2007-09-29"));
} catch (Exception e) {
e.printStackTrace();
}
x1Axis.setTimeline(SegmentedTimeline.newMondayThroughFridayTimeline());
x1Axis.setAutoTickUnitSelection(false);// 设置不采用自动选择刻度值
x1Axis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);// 设置标记的位置
x1Axis.setStandardTickUnits(DateAxis.createStandardDateTickUnits());//设置标准的时间刻度单位
x1Axis.setDateFormatOverride(new SimpleDateFormat("dd"));// 设置显示时间的格式
NumberAxis y1Axis = new NumberAxis();// 设定y轴,就是数字轴
y1Axis.setAutoRange(false);// 不不使用自动设定范围
//设定y轴值的范围,比最低值要低一些,比最大值要大一些,这样图形看起来会美观些
y1Axis.setRange(minValue * 0.9, highValue * 1.1);
//设置刻度显示的密度
y1Axis.setTickUnit(new NumberTickUnit((highValue * 1.1 - minValue * 0.9) / 10)); // 设置画图区域对象
XYPlot plot1 = new XYPlot(seriesCollection, x1Axis, y1Axis,candlestickRender);
XYLineAndShapeRenderer xyBarRender = new XYLineAndShapeRenderer() {
private static final long serialVersionUID = 1L;// 为了避免出现警告消息,特设定此值
//匿名内部类用来处理当日的成交量柱形图的颜色与K线图的颜色保持一致
public Paint getItemPaint(int i, int j) {
// 收盘价高于开盘价,股票上涨,选用股票上涨的颜色
if (seriesCollection.getCloseValue(i, j) > seriesCollection.getOpenValue(i, j)) { return candlestickRender.getUpPaint();
} else {
return candlestickRender.getDownPaint();
}
}
}; NumberAxis y2Axis = new NumberAxis();// 设置Y轴,为数值,后面的设置,参考上面的y轴设置
y2Axis.setAutoRange(false);
y2Axis.setRange(min2Value * 0.9, high2Value * 1.1);
y2Axis.setTickUnit(new NumberTickUnit((high2Value * 1.1 - min2Value * 0.9) / 4));
// 建立第二个画图区域对象,主要此时的x轴设为了null值,因为要与第一个画图区域对象共享x轴
XYPlot plot2 = new XYPlot(timeSeriesCollection, null, y2Axis,xyBarRender);
// 建立一个恰当的联合图形区域对象,以x轴为共享轴
CombinedDomainXYPlot combineddomainxyplot = new CombinedDomainXYPlot(x1Axis);
//添加图形区域对象,后面的数字是计算这个区域对象应该占据多大的区域2/3
combineddomainxyplot.add(plot1, 2);
//添加图形区域对象,后面的数字是计算这个区域对象应该占据多大的区域1/3
combineddomainxyplot.add(plot2, 1);
combineddomainxyplot.setGap(10);// 设置两个图形区域对象之间的间隔空间*/
JFreeChart chart = new JFreeChart("中国联通",
JFreeChart.DEFAULT_TITLE_FONT, combineddomainxyplot, false);
ChartFrame frame = new ChartFrame("中国联通股票", chart);
frame.pack();
frame.setVisible(true);
}
}
解决方案 »
- 求助,tomcat在eclipse里启动正常,但打不开主页
- struts 错误 No configuration found for the specified action
- Netbeans整合ssh的问题
- 请问JAVA程序员。对象里的这个THIS是什么意思
- struts html标签
- 我作一个博客的项目,SSH,spring面向切面怎么用上?请高手指教
- 请问大家如何用表格现实数据呢,有现成的组件吗?我在struts+hibernate+myeclipse+mysql+tomcat5.5下开发的
- 谁集成过jetty?麻烦进来下,有事找你
- 处学者,一些简单的问题,请教大家
- 取出XML格式中的数据
- 事务控制的代码应该写在manager中,还是dao中
- spring mvc 采用jsr-303标注方式对表单提交数据做数据验证
浮点类型的变量在运算时是会有偏移量的 例子: 1.0/3=3.333334845487995....
但是看上去好像我们的取值都在小数点后3到5位就很精确了
可惜如果这样想的话就错了 因为米有做处理.反之
我们将得到的结果在*3 得到的就不是1了 这样反复就会差很多
如果你的偏移量没有用round方法四舍五入的话,就会出现个现象...
就是越到后边的变差就越大,.(如果是连续计算的话)试试吧.
seriesCollection.setXPosition(TimePeriodAnchor.START); //使K线图跟折线点对齐