求JFreechart绘制折线图!!高手请进!!急!急!急!

    技术2022-05-18  18

    package com;

    import java.awt.Color;//颜色系统import java.text.DateFormat;import java.text.SimpleDateFormat;//时间格式import java.util.Calendar;import java.awt.Paint;//画笔系统import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.io.InputStream;

    import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;

    import org.jfree.data.category.DefaultCategoryDataset;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 KLineCombineChart {

    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 high1Value = Double.MIN_VALUE;//设置收盘价当中的最大值     double min1Value = Double.MAX_VALUE;//设置收盘价当中的最小值     double high2Value = Double.MIN_VALUE;//设置成交量的最大值     double min2Value = Double.MAX_VALUE;//设置成交量的最低值     OHLCSeries series = new OHLCSeries("");//高开低收数据序列,股票K线图的四个数据,依次是开,高,低,收     TimeSeries series2=new TimeSeries("");//对应时间成交量 的数据     TimeSeries series1=new TimeSeries("");//对应时间收盘价的数据     try {      String value;      BufferedReader br = new BufferedReader(new FileReader("c://SZ000001.TXT"));   while((value=br.readLine())!=null){    String[] a = value.split(" ");            int year = Integer.parseInt(a[0]);    int month = Integer.parseInt(a[1]);    int day = Integer.parseInt(a[2]);    float open = Float.parseFloat(a[3]);    float high = Float.parseFloat(a[4]);    float low = Float.parseFloat(a[5]);    float close = Float.parseFloat(a[6]);    int volume = Integer.parseInt(a[7]);    series.add(new Day(day, month, year), open,high,low,close );    series2.add(new Day(day, month,year ), volume);    series1.add(new Day(day, month,year ), close);    DefaultCategoryDataset dataset=new DefaultCategoryDataset();    dataset.addValue(close,"MA5","yy-mm-dd");            }   } catch (FileNotFoundException e1) {  // TODO Auto-generated catch block  e1.printStackTrace(); } catch (IOException e) {  // TODO Auto-generated catch block  e.printStackTrace(); }         final OHLCSeriesCollection seriesCollection = new OHLCSeriesCollection();//保留K线数据的数据集,必须申明为final,后面要在匿名内部类里面用到     seriesCollection.addSeries(series);      TimeSeriesCollection timeSeriesCollection1=new TimeSeriesCollection();//保留收盘价的集合     timeSeriesCollection1.addSeries(series1);          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++) {       if (highValue < seriesCollection.getHighValue(i, j)) {//取第i个序列中的第j个数据项的最大值        highValue = seriesCollection.getHighValue(i, j);       }       if (minValue > seriesCollection.getLowValue(i, j)) {//取第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++) {       if (high2Value < timeSeriesCollection.getYValue(i,j)) {//取第i个序列中的第j个数据项的值        high2Value = timeSeriesCollection.getYValue(i,j);       }       if (min2Value > timeSeriesCollection.getYValue(i, j)) {//取第i个序列中的第j个数据项的值        min2Value = timeSeriesCollection.getYValue(i, j);       }      }

         }     //获取收盘价     int seriesCount1 = timeSeriesCollection.getSeriesCount();//一共有多少个序列,目前为一个     for (int i = 0; i < seriesCount1; i++) {         int itemCount = timeSeriesCollection.getItemCount(i);//每一个序列有多少个数据项         double close=timeSeriesCollection.getYValue(i,4);     }

         final CandlestickRenderer candlestickRender=new CandlestickRenderer();//设置K线图的画图器,必须申明为final,后面要在匿名内部类里面用到     candlestickRender.setUseOutlinePaint(true); //设置是否使用自定义的边框线,程序自带的边框线的颜色不符合中国股票市场的习惯     candlestickRender.setAutoWidthMethod(CandlestickRenderer.WIDTHMETHOD_AVERAGE);//设置如何对K线图的宽度进行设定     candlestickRender.setAutoWidthGap(0.001);//设置各个K线图之间的间隔     candlestickRender.setUpPaint(Color.RED.brighter());//设置股票上涨的K线图颜色     candlestickRender.setDownPaint(Color.green.brighter());//设置股票下跌的K线图颜色 /* 宝塔线*/  // candlestickRender.setUpPaint(Color.RED.brighter());//设置股票上涨的K线图颜色 /* 宝塔线*/    // candlestickRender.setDownPaint(Color.green.brighter());//设置股票下跌的K线图颜色   DateAxis x1Axis=new DateAxis();//设置x轴,也就是时间轴     x1Axis.setAutoRange(true);//设置不采用自动设置时间范围     x1Axis.setTimeline(SegmentedTimeline.newMondayThroughFridayTimeline());

         x1Axis.setAutoTickUnitSelection(false);//设置不采用自动选择刻度值 (false为以下的主要前提条件)     x1Axis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);//设置标记的位置     x1Axis.setStandardTickUnits(DateAxis.createStandardDateTickUnits());//设置标准的时间刻度单位     x1Axis.setTickUnit(new DateTickUnit(DateTickUnitType.DAY,7));//设置时间刻度的间隔,一般以周为单位     x1Axis.setDateFormatOverride(new SimpleDateFormat("yyyy-MM-dd"));//设置显示时间的格式    x1Axis.setLowerMargin(0.02D);//下跌范围   x1Axis.setUpperMargin(0.02D);//上涨范围          NumberAxis y1Axis=new NumberAxis();//设定y轴,就是数字轴     y1Axis.setAutoRange(false);//不不使用自动设定范围     y1Axis.setRange(minValue*0.9, highValue*1.1);//设定y轴值的范围,比最低值要低一些,比最大值要大一些,这样图形看起来会美观些     y1Axis.setTickUnit(new NumberTickUnit((highValue*1.1-minValue*0.9)/10));//设置刻度显示的密度        XYPlot plot1=new XYPlot(seriesCollection,x1Axis,y1Axis,candlestickRender);//设置画图区域对象     XYBarRenderer xyBarRender=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();       }     }};        xyBarRender.setMargin(0.1);//设置柱形图之间的间隔     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)/5));     XYPlot plot2=new XYPlot(timeSeriesCollection,null,y2Axis,xyBarRender);//建立第二个画图区域对象,主要此时的x轴设为了null值,因为要与第一个画图区域对象共享x轴     CombinedDomainXYPlot combineddomainxyplot = new CombinedDomainXYPlot(x1Axis);//建立一个恰当的联合图形区域对象,以x轴为共享轴     combineddomainxyplot.add(plot1, 3);//添加图形区域对象,后面的数字是计算这个区域对象应该占据多大的区域2/3        combineddomainxyplot.add(plot2, 1);//添加图形区域对象,后面的数字是计算这个区域对象应该占据多大的区域1/3        combineddomainxyplot.setGap(5);//设置两个图形区域对象之间的间隔空间        JFreeChart chart = new JFreeChart("SZ000001   深发展A", JFreeChart.DEFAULT_TITLE_FONT, combineddomainxyplot, false);     //        JFreeChart chart1=ChartFactory.createLineChart("SZ000001   深发展A",x1Axis,y1Axis,dataset,PlotOrientation.VERTICAL,true,false,false);      ChartFrame frame = new ChartFrame("股票行情分析图", chart);  frame.setJMenuBar(mnb);      frame.pack();     frame.setVisible(true);          }

    }

    编译出的结果  没有折线图 求高手帮忙写个折线图的代码

    00001.TXT的文件的数据是:

    2009 11 05 25.38 25.46 24.85 25.05 28931192 727022400.0002009 11 06 25.39 25.69 24.81 25.10 30297501 762726336.0002009 11 09 24.91 25.20 24.28 24.86 32796651 810528320.000

     

     

    求均线的绘制。。。5日、10日等的均线  求宝塔线的绘制


    最新回复(0)