本文共 4025 字,大约阅读时间需要 13 分钟。
JFreeChart是一个强大且灵活的Java图形库,广泛应用于数据可视化领域。其核心组件包括:
数据收集:
数据格式转换:
SimpleDateFormat统一日期格式,确保时间轴的一致性。OHLCSeries对象,包含K线图的四个数据点。异常值处理:
K线图绘制:
CandlestickRenderer作为K线图的绘制器,支持上影线和下影线的颜色设置。时间轴设置:
SegmentedTimeline规则,排除周六和周日,确保图形连续性。成交量显示:
图形布局:
CombinedDomainXYPlot实现K线图和成交量的联合显示。import org.jfree.data.time.Day;import org.jfree.data.time.ohlc.OHLCSeries;import org.jfree.data.time.ohlc.OHLCSeriesCollection;import org.jfree.chart.renderer.xy.CandlestickRenderer;import org.jfree.chart.axis.DateAxis;import org.jfree.chart.plot.XYPlot;import org.jfree.chart.axis.NumberAxis;import java.text.SimpleDateFormat;import java.awt.Color;public class KLineCombineChart { public static void main(String[] args) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); OHLCSeries series = new OHLCSeries("K线数据"); // 添加K线数据点 series.add(new Day(28, 9, 2007), 9.2, 9.58, 9.16, 9.34); // 其他数据点(见完整代码) // 添加成交量数据点 TimeSeries volumeSeries = new TimeSeries("成交量数据"); volumeSeries.add(new Day(28, 9, 2007), 260659400 / 100); // 其他数据点(见完整代码) // 创建数据集 OHLCSeriesCollection seriesCollection = new OHLCSeriesCollection(); seriesCollection.addSeries(series); TimeSeriesCollection volumeCollection = new TimeSeriesCollection(); volumeCollection.addSeries(volumeSeries); // 设置K线图的颜色 final CandlestickRenderer candlestickRender = new CandlestickRenderer(); candlestickRender.setUseOutlinePaint(true); candlestickRender.setAutoWidthMethod(CandlestickRenderer.WIDTHMETHOD_AVERAGE); candlestickRender.setDownPaint(Color.GREEN); candlestickRender.setUpPaint(Color.RED); // 设置时间轴 DateAxis x1Axis = new DateAxis(); x1Axis.setAutoRange(false); x1Axis.setRange(dateFormat.parse("2007-08-20"), dateFormat.parse("2007-09-29")); x1Axis.setTimeline(SegmentedTimeline.newMondayThroughFridayTimeline()); // 设置Y轴 NumberAxis y1Axis = new NumberAxis(); y1Axis.setAutoRange(false); y1Axis.setRange(minValue * 0.9, highValue * 1.1); y1Axis.setTickUnit(new NumberTickUnit((highValue * 1.1 - minValue * 0.9) / 10)); // 创建K线图 XYPlot plot1 = new XYPlot(seriesCollection, x1Axis, y1Axis, candlestickRender); // 创建成交量柱状图 XYBarRenderer volumeRenderer = new XYBarRenderer() { private static final long serialVersionUID = 1L; public Paint getItemPaint(int i, int j) { if (seriesCollection.getCloseValue(i, j) > seriesCollection.getOpenValue(i, j)) { return candlestickRender.getUpPaint(); } else { return candlestickRender.getDownPaint(); } } }; XYPlot plot2 = new XYPlot(volumeCollection, null, y2Axis, volumeRenderer); // 组合图表 CombinedDomainXYPlot combinedPlot = new CombinedDomainXYPlot(x1Axis); combinedPlot.add(plot1, 2); combinedPlot.add(plot2, 1); combinedPlot.setGap(10); // 创建图表 JFreeChart chart = new JFreeChart("中国联通股票", Chart.DEFAULT_TITLE_FONT, combinedPlot, false); ChartFrame frame = new ChartFrame("中国联通股票", chart); frame.pack(); frame.setVisible(true); }} K线边框处理:
CandlestickRenderer.java,确保上影线和下影线颜色与K线一致,提升图表美观度。图表维度管理:
成交量显示优化:
图表间距调整:
setGap方法,优化图表间距,确保图表美观且信息展示效果理想。通过以上实现,可以轻松绘制出符合中国股票市场特点的K线图和成交量图表。代码清晰,注释详尽,直接在Eclipse中运行即可,省去繁琐配置步骤。如需进一步优化或添加功能,欢迎在社区交流并共同改进!
转载地址:http://exmz.baihongyu.com/