生成股票走势图jfreechart

这个博客介绍如何利用JFreeChart库创建股票日内走势图。通过导入必要的jar包,定义并设置图表、时间轴、数值轴、颜色等属性,实现对股票数据的可视化展示。同时,代码中包含了对时间轴的过滤,以排除非交易时段,并在图上标记昨日收盘价。
摘要由CSDN通过智能技术生成

 

1.所需要的jar包  jfreechar-1.0.10.jar

2.生成图的class 方法:

 

package data.pub.jfree;

import java.awt.Color;
import java.awt.RenderingHints;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.SegmentedTimeline;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.Marker;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.ValueMarker;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Minute;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.LengthAdjustmentType;
import org.jfree.ui.RectangleAnchor;
import org.jfree.ui.TextAnchor;

import common.dataAccess.util.As;
import common.dataAccess.util.FileUtils;
import common.dataAccess.util.Property;
import common.dataAccess.util.ResourceUtils;

import data.pub.index.IndexTodayMin;
import data.pub.util.DateUtils;

/**
 * 指数日内走势图
 * @author yyao
 */
public class IndexRtChart{

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private static int stye = 0;
    private static double min;
    private static double max;
    private static double close;

    public static JFreeChart getChart(List<Map<String, String>> data) {
        return createChart(getPreClose(data), createDatasetBackgroud(data));
    }

    private static JFreeChart createChart(double preClose,XYDataset datasetBack) {
        JFreeChart chart = ChartFactory.createXYAreaChart(
                "",
                "", "",
                datasetBack,
                PlotOrientation.VERTICAL,
                true, // legend
                true, // tool tips
                false // URLs
                );
        chart.setBackgroundPaint(ChartColors.TABLE_BACKGROUND_outside);
        chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);

        XYPlot plot = (XYPlot) chart.getPlot();
        plot.setBackgroundPaint(ChartColors.BARCHART_BACKGROUND);
        plot.setOutlinePaint(ChartColors.PLOT_GRIDDING);
        plot.setDomainGridlinesVisible(true);
        plot.setForegroundAlpha(0.5f);
        ChartCommons.setPlotLineColor(plot);
       
//        plot.setRangeAxisLocation(0, AxisLocation.BOTTOM_OR_RIGHT);// 左边轴移到右边显示

        ValueAxis domainAxis = new DateAxis("");
        domainAxis.setLowerMargin(0.00001);
        domainAxis.setUpperMargin(0.001);
        plot.setDomainAxis(domainAxis);
       
        ValueAxis range = new NumberAxis();
        range.setLowerBound(getMin());
        range.setUpperBound(getMax());
        plot.setRangeAxis(range);

        XYItemRenderer renderer = plot.getRenderer();
        renderer.setSeriesPaint(0, ChartColors.Market_FILL); //阴影色

        ChartCommons.setXAxis(plot);
        ChartCommons.setYAxis(plot);

        //处理时间轴 过滤非交易时段 x 轴  1801 *倍数控制横向显示
        SegmentedTimeline timeline = new SegmentedTimeline(SegmentedTimeline.FIFTEEN_MINUTE_SEGMENT_SIZE, 36, 60);
        timeline.setBaseTimeline(SegmentedTimeline.newMondayThroughFridayTimeline());
        timeline.addException(12600000, 17600000);
        ((DateAxis) domainAxis).setTimeline(timeline);
        ((DateAxis) domainAxis).setTickUnit(
                new DateTickUnit(
                DateTickUnit.SECOND, 2701, new SimpleDateFormat("HH:mm")));
       
        ((DateAxis) domainAxis).setMaximumDate(DateUtils.parseDate("197001011500", "yyyyMMddhhmm"));
        ((DateAxis) domainAxis).setMinimumDate(DateUtils.parseDate("197001010930", "yyyyMMddhhmm"));

        //Line renderer
        XYLineAndShapeRenderer renderer1 = new XYLineAndShapeRenderer();
        renderer1.setSeriesPaint(0, ChartColors.Market_LINE_1);
        renderer1.setSeriesLinesVisible(0, true);
        renderer1.setSeriesShapesVisible(0, false);
        renderer1.setBaseShapesVisible(true);
        renderer1.setBaseShapesFilled(true);
        plot.setRenderer(1, renderer1);
        plot.setDataset(1, (TimeSeriesCollection)datasetBack);

        //标记昨日收盘价
        Marker target = new ValueMarker(preClose);
        target.setLabelOffsetType(LengthAdjustmentType.EXPAND);
        target.setPaint(Color.BLACK);
        target.setLabelAnchor(RectangleAnchor.TOP_RIGHT);
        target.setLabelTextAnchor(TextAnchor.BOTTOM_RIGHT);
        plot.addRangeMarker(target);



        chart.removeLegend();
        //Legend
//        LegendTitle legend = chart.getLegend();
//        legend.setMargin(new RectangleInsets(2, 2, 2, 2));
//        legend.setFrame(new BlockBorder());
//        legend.setBorder(0, 0, 0, 0);
//        legend.setItemPaint(new Color(0x666666));
//        legend.setItemFont(new Font("SimSun", Font.PLAIN, 12));
//        BlockContainer container = new BlockContainer(new BorderArrangement());
//        container.add(legend, RectangleEdge.LEFT);
//        container.add(new EmptyBlock(270, 0));//值越小
//        CompositeTitle legends = new CompositeTitle(container);
//        legends.setPosition(RectangleEdge.TOP);
//        chart.addSubtitle(legends);
//        chart.removeSubtitle(chart.getSubtitle(0));

        return chart;
    }

    //主线&&阴影
    private static XYDataset createDatasetBackgroud(List<Map<String, String>> data) {
        String name = "昨日收盘价";
        TimeSeries series1 = new TimeSeries(name);
        SimpleDateFormat format = new SimpleDateFormat("hhmm");

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值