精华内容
下载资源
问答
  • C#绘制实时的数据曲线图

    热门讨论 2011-04-07 13:34:53
     为了操作和应付变化,所以将绘制曲线图的功能单独封装成一个类,里面的数据完全是模拟的,在横向坐标上每个像素间隔用一个点来控制(实际中可能会加大这个距离),横向是个随机生成的数(实际开发中这应该来自我们...
  • 详细介绍使用MFC读取txt数据曲线图方法,并列举例程代码供参考.关于MFC读取txt数据,并且画曲线图记事本中保存的...现在想把数据读出来,并且画曲线图到已经创建好的对话框上,希望画出坐标轴和数据点曲线,要这么
  • ”在举国上下万众一心、...1、爬取新闻保存为json文件,并将绘图所需数据保存至数据库数据库表结构:代码部分:import pymysqlimport reimport sys,urllib,jsonfrom urllib import requestfrom datetime impo...

    ”在举国上下万众一心、众志成城做好新冠肺炎疫情防控工作的特殊时刻,我们不能亲临主战场,但我们能坚持在大战中坚定信心、不负韶华。"

    1、爬取新闻保存为json文件,并将绘图所需数据保存至数据库

    数据库表结构:

    2020040914450031.jpg

    代码部分:

    import pymysql

    import re

    import sys,urllib,json

    from urllib import request

    from datetime import datetime

    import pandas as pd

    Today=datetime.now().strftime(r"%Y-%m-%d")

    #Today='2020-02-14'

    def pachong():

    url='http://api.tianapi.com/txapi/ncov/index?key=xxx&date={}'.format(Today)

    req = request.Request(url)

    resp = request.urlopen(req)

    content = resp.read().decode()

    data=json.loads(content)

    with open('/Users/zhangyuchen/Desktop/latestTrends.json','w') as fp:#将所得的数据存储为json文件

    json.dump(data,fp = fp,ensure_ascii = False,indent = 4,sort_keys=True)

    #dump函数有很多参数,第一个是目标object,第二个是要写入的文件对象

    print("成功保存为json文件!")

    return(re.findall(r'"confirmedCount":(.+?),"',content),re.findall(r'"currentConfirmedCount":(.+?),"',content),re.findall(r'"curedCount":(.+?),"',content))

    def connectMysql(cc):

    #/usr/local/mysql/bin/mysql -u root -p

    db = pymysql.connect("localhost", "root", "密码", "dbname",charset='utf8' )

    cursor = db.cursor()

    sql="""insert into {0} (DATE,SICK,SICK_NOW,RECOVER)values('{1}','{2}','{3}','{4}')"""

    cursor.execute(sql.format('db1',Today,int(cc[0][0]),int(cc[1][0]),int(cc[2][0])))

    cursor.execute(sql.format('db2',Today,int(cc[0][1]),int(cc[1][1]),int(cc[2][1])))

    db.commit()

    print(("成功将{}数据存入数据库!").format(Today))

    db.close()

    cc=pachong()

    connectMysql(cc)

    json文件:

    2020040914450032.jpg

    2、利用matplotlib库函数绘制图表

    import numpy as np

    import matplotlib.pyplot as plt

    import matplotlib

    import pymysql

    import re

    import sys, urllib,json

    from urllib import request

    #/usr/local/mysql/bin/mysql -u root -p

    date=[]

    cSick=[]

    aSick=[]

    cNowSick=[]

    aNowSick=[]

    cRecover=[]

    aRecover=[]

    db = pymysql.connect("localhost", "root", "密码", "trends")

    sql="select * from db1 ORDER BY DATE"

    cursor = db.cursor()

    cursor.execute(sql)

    results = cursor.fetchall()

    while results:

    for row in results:

    date.append(row[0].strftime("%d"))

    cSick.append(row[1])

    cNowSick.append(row[2])

    cRecover.append(row[3])

    results=cursor.fetchone()

    #查询Abroad Table

    sql="select * from db2"

    cursor.execute(sql)

    results = cursor.fetchall()

    while results:

    for row in results:

    aSick.append(row[1])

    aNowSick.append(row[2])

    aRecover.append(row[3])

    results=cursor.fetchone()

    cursor.close()

    db.close()

    def DrawLineChart(ySick,yNowSick):

    plt.plot(x,ySick,color='y',label="Cumulative number of cases",linewidth=3,linestyle="--")

    plt.plot(x,yNowSick,color='r',label="Current number of cases",linewidth=3,linestyle="-")

    def DrawBarChart(yRecover):

    width=0.45#柱子宽度

    p2 = plt.bar(x,yRecover,width,label="Cured Count",color="#87CEFA")

    Days=len(aSick)

    plt.figure(figsize=(16,12), dpi=80)#设置分辨率为80像素/每英寸

    x=np.arange(Days)

    #创建两个子图

    plt.subplot(322)

    plt.title("Trends of March")

    DrawLineChart(cSick,cNowSick)

    DrawBarChart(cRecover)

    plt.figlegend()

    plt.xticks(x,date)

    plt.ylabel('Number')

    plt.subplot(324)

    #plt.title("Trends of March")

    DrawLineChart(aSick,aNowSick)

    DrawBarChart(aRecover)

    plt.xticks(x,date,rotation=0)

    plt.xlabel('Date')

    plt.ylabel('Number')

    plt.show()

    到此这篇关于利用python绘制数据曲线图的实现的文章就介绍到这了,更多相关python 数据曲线图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    展开全文
  • Android图表控件MPAndroidChart的简单介绍(MPAndroidChart3.0)Android图表控件MPAndroidChart——曲线图LineChart的使用(条曲线)Android图表控件MPAndroidChart——曲线图LineChart(条曲线)动态添加数据A....

    发现最新的MPAndroidChart和以前版本的使用有一些差距,就写下了现在新版的使用方法

    相关文章:

    Android图表控件MPAndroidChart的简单介绍(MPAndroidChart3.0)

    Android图表控件MPAndroidChart——曲线图LineChart的使用(多条曲线)

    Android图表控件MPAndroidChart——曲线图LineChart(多条曲线)动态添加数据

    Android图表控件MPAndroidChart——柱状图BarChart的使用(多条柱状图)

    Android图表控件MPAndroidChart——曲线图+柱状图 CombinedChart的使用 

    Android图表控件MPAndroidChart——源码修改实现曲线图X轴直尺刻度样式

    本文相关代码

    MPAndroidChart在github地址https://github.com/PhilJay/MPAndroidChart

    一.效果图

    一条曲线动态添加数据(X轴为当前时间)

    多条曲线线动态添加数据(X轴为当前时间)


    二.实现效果

    1.X轴为当前时间,只需要Y轴数据即可

    2.X轴的值为字符串,而Entry的构造方法参数全为float    public Entry(float x, float y)  所以需要另外定义X轴的值

    简要代码

    动态添加值Entry

    Entry entry = new Entry(lineDataSet.getEntryCount(), number);
    lineData.addEntry(entry, 0);
    //通知数据已经改变
    lineData.notifyDataChanged();
    lineChart.notifyDataSetChanged();
    //设置在曲线图中显示的最大数量
    lineChart.setVisibleXRangeMaximum(10);
    //移到某个位置
    lineChart.moveViewToX(lineData.getEntryCount() - 5);

    X轴值的设定

    我并没有找到直接设置X轴为当前时间的方法,

    而是新建一个字符串集合,选择在每次添加Entry的时候将当前时间添加进集合,然后设置X轴的值

    private SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");//设置日期格式  
    private List<String> timeList = new ArrayList<>(); //存储x轴的时间

    xAxis.setValueFormatter(new IAxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            return timeList.get((int) value % timeList.size());
        }
    });

    三.详细代码(一个管理类)

    public class DynamicLineChartManager {
    
        private LineChart lineChart;
        private YAxis leftAxis;
        private YAxis rightAxis;
        private XAxis xAxis;
        private LineData lineData;
        private LineDataSet lineDataSet;
        private List<ILineDataSet> lineDataSets = new ArrayList<>();
        private SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");//设置日期格式  
        private List<String> timeList = new ArrayList<>(); //存储x轴的时间
    
        //一条曲线
        public DynamicLineChartManager(LineChart mLineChart, String name, int color) {
            this.lineChart = mLineChart;
            leftAxis = lineChart.getAxisLeft();
            rightAxis = lineChart.getAxisRight();
            xAxis = lineChart.getXAxis();
            initLineChart();
            initLineDataSet(name, color);
        }
    
        //多条曲线
        public DynamicLineChartManager(LineChart mLineChart, List<String> names, List<Integer> colors) {
            this.lineChart = mLineChart;
            leftAxis = lineChart.getAxisLeft();
            rightAxis = lineChart.getAxisRight();
            xAxis = lineChart.getXAxis();
            initLineChart();
            initLineDataSet(names, colors);
        }
    
        /**
         * 初始化LineChar
         */
        private void initLineChart() {
    
            lineChart.setDrawGridBackground(false);
            //显示边界
            lineChart.setDrawBorders(true);
            //折线图例 标签 设置
            Legend legend = lineChart.getLegend();
            legend.setForm(Legend.LegendForm.LINE);
            legend.setTextSize(11f);
            //显示位置
            legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
            legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
            legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
            legend.setDrawInside(false);
    
            //X轴设置显示位置在底部
            xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
            xAxis.setGranularity(1f);
            xAxis.setLabelCount(10);
    
            xAxis.setValueFormatter(new IAxisValueFormatter() {
                @Override
                public String getFormattedValue(float value, AxisBase axis) {
                    return timeList.get((int) value % timeList.size());
                }
            });
    
            //保证Y轴从0开始,不然会上移一点
            leftAxis.setAxisMinimum(0f);
            rightAxis.setAxisMinimum(0f);
        }
    
        /**
         * 初始化折线(一条线)
         *
         * @param name
         * @param color
         */
        private void initLineDataSet(String name, int color) {
    
            lineDataSet = new LineDataSet(null, name);
            lineDataSet.setLineWidth(1.5f);
            lineDataSet.setCircleRadius(1.5f);
            lineDataSet.setColor(color);
            lineDataSet.setCircleColor(color);
            lineDataSet.setHighLightColor(color);
            //设置曲线填充
            lineDataSet.setDrawFilled(true);
            lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
            lineDataSet.setValueTextSize(10f);
            lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
            //添加一个空的 LineData
            lineData = new LineData();
            lineChart.setData(lineData);
            lineChart.invalidate();
    
        }
    
        /**
         * 初始化折线(多条线)
         *
         * @param names
         * @param colors
         */
        private void initLineDataSet(List<String> names, List<Integer> colors) {
    
            for (int i = 0; i < names.size(); i++) {
                lineDataSet = new LineDataSet(null, names.get(i));
                lineDataSet.setColor(colors.get(i));
                lineDataSet.setLineWidth(1.5f);
                lineDataSet.setCircleRadius(1.5f);
                lineDataSet.setColor(colors.get(i));
    
                lineDataSet.setDrawFilled(true);
                lineDataSet.setCircleColor(colors.get(i));
                lineDataSet.setHighLightColor(colors.get(i));
                lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
                lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
                lineDataSet.setValueTextSize(10f);
                lineDataSets.add(lineDataSet);
    
            }
            //添加一个空的 LineData
            lineData = new LineData();
            lineChart.setData(lineData);
            lineChart.invalidate();
        }
    
        /**
         * 动态添加数据(一条折线图)
         *
         * @param number
         */
        public void addEntry(int number) {
    
            //最开始的时候才添加 lineDataSet(一个lineDataSet 代表一条线)
            if (lineDataSet.getEntryCount() == 0) {
                lineData.addDataSet(lineDataSet);
            }
            lineChart.setData(lineData);
            //避免集合数据过多,及时清空(做这样的处理,并不知道有没有用,但还是这样做了)
            if (timeList.size() > 11) {
                timeList.clear();
            }
    
            timeList.add(df.format(System.currentTimeMillis()));
    
            Entry entry = new Entry(lineDataSet.getEntryCount(), number);
            lineData.addEntry(entry, 0);
            //通知数据已经改变
            lineData.notifyDataChanged();
            lineChart.notifyDataSetChanged();
            //设置在曲线图中显示的最大数量
            lineChart.setVisibleXRangeMaximum(10);
            //移到某个位置
            lineChart.moveViewToX(lineData.getEntryCount() - 5);
        }
    
        /**
         * 动态添加数据(多条折线图)
         *
         * @param numbers
         */
        public void addEntry(List<Integer> numbers) {
    
            if (lineDataSets.get(0).getEntryCount() == 0) {
                lineData = new LineData(lineDataSets);
                lineChart.setData(lineData);
            }
            if (timeList.size() > 11) {
                timeList.clear();
            }
            timeList.add(df.format(System.currentTimeMillis()));
            for (int i = 0; i < numbers.size(); i++) {
                Entry entry = new Entry(lineDataSet.getEntryCount(), numbers.get(i));
                lineData.addEntry(entry, i);
                lineData.notifyDataChanged();
                lineChart.notifyDataSetChanged();
                lineChart.setVisibleXRangeMaximum(6);
                lineChart.moveViewToX(lineData.getEntryCount() - 5);
            }
        }
    
        /**
         * 设置Y轴值
         *
         * @param max
         * @param min
         * @param labelCount
         */
        public void setYAxis(float max, float min, int labelCount) {
            if (max < min) {
                return;
            }
            leftAxis.setAxisMaximum(max);
            leftAxis.setAxisMinimum(min);
            leftAxis.setLabelCount(labelCount, false);
    
            rightAxis.setAxisMaximum(max);
            rightAxis.setAxisMinimum(min);
            rightAxis.setLabelCount(labelCount, false);
            lineChart.invalidate();
        }
    
        /**
         * 设置高限制线
         *
         * @param high
         * @param name
         */
        public void setHightLimitLine(float high, String name, int color) {
            if (name == null) {
                name = "高限制线";
            }
            LimitLine hightLimit = new LimitLine(high, name);
            hightLimit.setLineWidth(4f);
            hightLimit.setTextSize(10f);
            hightLimit.setLineColor(color);
            hightLimit.setTextColor(color);
            leftAxis.addLimitLine(hightLimit);
            lineChart.invalidate();
        }
    
        /**
         * 设置低限制线
         *
         * @param low
         * @param name
         */
        public void setLowLimitLine(int low, String name) {
            if (name == null) {
                name = "低限制线";
            }
            LimitLine hightLimit = new LimitLine(low, name);
            hightLimit.setLineWidth(4f);
            hightLimit.setTextSize(10f);
            leftAxis.addLimitLine(hightLimit);
            lineChart.invalidate();
        }
    
        /**
         * 设置描述信息
         *
         * @param str
         */
        public void setDescription(String str) {
            Description description = new Description();
            description.setText(str);
            lineChart.setDescription(description);
            lineChart.invalidate();
        }
    }

    XML布局

    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
    
            <com.github.mikephil.charting.charts.LineChart
                android:id="@+id/dynamic_chart1"
                android:layout_width="match_parent"
                android:layout_height="380dp"/>
    
            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:onClick="addEntry"
                android:text="随机数据"
                />
    
            <com.github.mikephil.charting.charts.LineChart
                android:id="@+id/dynamic_chart2"
                android:layout_width="match_parent"
                android:layout_height="380dp"/>
        </LinearLayout>
    </ScrollView>
    

    Activity中的代码

    public class DynamicLineChartActivity extends AppCompatActivity {
    
        private DynamicLineChartManager dynamicLineChartManager1;
        private DynamicLineChartManager dynamicLineChartManager2;
        private List<Integer> list = new ArrayList<>(); //数据集合
        private List<String> names = new ArrayList<>(); //折线名字集合
        private List<Integer> colour = new ArrayList<>();//折线颜色集合
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_dynamic_linechart);
            LineChart mChart1 = (LineChart) findViewById(R.id.dynamic_chart1);
            LineChart mChart2 = (LineChart) findViewById(R.id.dynamic_chart2);
            //折线名字
            names.add("温度");
            names.add("压强");
            names.add("其他");
            //折线颜色
            colour.add(Color.CYAN);
            colour.add(Color.GREEN);
            colour.add(Color.BLUE);
    
            dynamicLineChartManager1 = new DynamicLineChartManager(mChart1, names.get(0), colour.get(0));
            dynamicLineChartManager2 = new DynamicLineChartManager(mChart2, names, colour);
    
            dynamicLineChartManager1.setYAxis(100, 0, 10);
            dynamicLineChartManager2.setYAxis(100, 0, 10);
    
            //死循环添加数据
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                list.add((int) (Math.random() * 50) + 10);
                                list.add((int) (Math.random() * 80) + 10);
                                list.add((int) (Math.random() * 100));
                                dynamicLineChartManager2.addEntry(list);
                                list.clear();
                            }
                        });
                    }
                }
            }).start();
        }
    
        //按钮点击添加数据
        public void addEntry(View view) {
            dynamicLineChartManager1.addEntry((int) (Math.random() * 100));
        }
    }

    四.使用中遇到的一些问题

    1.X轴添加字符串,或者设置显示格式

    xAxis.setValueFormatter(new IAxisValueFormatter() {
        @Override
        public String getFormattedValue(float value, AxisBase axis) {
            return timeList.get((int) value % timeList.size());
        }
    });

    2.动态添加数据数据时,曲线不自动往左边移动,而是挤在一堆

    //设置在曲线图中显示的最大数量
    lineChart.setVisibleXRangeMaximum(10);
    //移到某个位置
    lineChart.moveViewToX(lineData.getEntryCount() - 5);
    


    展开全文
  • matlab从曲线图提取数据

    千次阅读 2019-02-13 12:01:00
    上谷歌查了查,对于曲线图提取数据基本上是手动在曲线上取几个点,然后由这个几个点开始遍历领域点,判断领域点是否是黑色,然后再遍历这个黑色点的领域,最终找出一条最长的线便是曲线,一种类似曲线拟合的做法?...

    同学用肉体一顿饭让我帮他做下这个DDL
    394393-20190213104934723-1680220050.png
    样图是一张非常扭曲的三虚线图他甚至想OCR识别x轴y轴坐标单位
    394393-20190213105154359-1585349174.png

    • 上谷歌查了查,对于曲线图提取数据基本上是手动在曲线上取几个点,然后由这个几个点开始遍历领域点,判断领域点是否是黑色,然后再遍历这个黑色点的领域,最终找出一条最长的线便是曲线,一种类似曲线拟合的做法?
    • 知乎专栏提供了一种思路,先把曲线图上无关信息去掉,然后提取最大的连通区域,就是所需要的实线,只可惜样例图要做的是虚线
      第一种方法是同学AA想要的,不过英国人嘛,只告诉他要这样做,并没有告诉他基本思想,所以我们基于第二种方法拓展尝试一下。

    清洗图像

    所给的图像是RGB图像,且有噪声点,先将图像灰度化,计算图像阈值,通过阈值将图像二值化。
    394393-20190213111800809-171602924.png

    提取真实区域

    想要的真实区域就是下图中使用红框标出的区域394393-20190213110058094-1821556175.png

    法1

    一开始的想法是先在图片的(end*0.8:end-10,)区域中霍夫变换识别出下边框,然后取下边框的(,1:10)部分识别左边框,取左边框的最上端坐标和下边框的最右端坐标,作为分割图像的基准,真实区域就分割出来了。

    • 提取下边框很顺利
      394393-20190213110845661-784803464.png
    • 提取左边框不是很顺利
      394393-20190213111033164-490780888.png
    • 提取右边框也不是很顺利
      394393-20190213111209649-763159646.png
    • 提取上边框很顺利
      394393-20190213111246700-1968147451.png
      虽然和计划的有所偏差,但通过上边框的最左端坐标和下边框的最右段坐标,作为分割图像的基准,得到的真实图像理论上是相同的。

    法2

    对于样例图,真实区域是封闭的,是图中的最大连通区域,那找最大联通区域也可以提取出样例图的真实区域。
    394393-20190213111619527-1620448458.png
    再取得该区域最左上端白点坐标和最右下端白点坐标,作为分割图像的基准,得到真实图像。
    真实图像如图所示
    394393-20190213113235798-1344988663.png

    再次清洗图像

    为了方便起见,下文中“图”、“图像”指的是上一步中得到的真实图像,而不是原始图像。
    对于得到的图像,仍然存在边框、刻度线、右下角标识区域等无关信息。

    • 边框可以直接通过上一步法1中得到的边框坐标数组去掉。
    • 刻度线以左边框的刻度线为例,遍历图像(,1:5)范围内,若该点是黑点,则从该点开始,向右寻找最大的直线区域,去除。
      样例图中存在曲线与刻度线相交的情况,我采用的方法是对于该点,如果24领域中的黑点总数大于一个阈值,则认为该点是曲线上的点,保留。
    • 右下角标识区域直接找取联通区域,如果该连通区域的大小大于阈值,认为是标识区域,去除。
      得到的结果图像,边界存在问题,有待改进:
      394393-20190213113411661-1574549539.png

    分离曲线

    三条曲线都不是实线,没法通过找最大联通区域的方法逐个分离,但因为不同曲线中实线部分的长度是不一样的,所以可以贪心一下,从第1列开始,以某个阈值add_len为步长,找最大连通区域,再进行拼接,以图中最上面一条曲线为例:

    • 首先取图像(:,1:10)区域中的最大联通区域,或者取3个联通区域,认为联通区域在列上的坐标极小值为其高度值,高度值越小则越高,最高者则为想要取得最上面一条曲线。
      394393-20190213114724890-496339508.png
    • 然后取得该联通区域中最右端的点n1(x,y),再取(:,y+1:y+add_len)中的n个联通区域,对于每个联通区域,找出其最左端的点n2(x1,y1),求n1与n2之间的欧式距离,认为欧式距离最短的就是该曲线在(:,y+1:y+add_len)的部分,然后重复该步,直到y值无限接近于图像最右端。
    • 对于上一步也有不同的做法,取得该联通区域中最右端的点n1(x,y),在从i=1开始循环,取(:,y+1:y+add_len)中的i个最大联通区域,对于第i个区域,他的面积总是第i大的,找出其最左端的点n2(x1,y1),求n1与n2之间的欧式距离,若欧式距离小于某个阈值,则认为该联通区域是该曲线在(:,y+1:y+add_len)的部分,然后重复该步,直到y值无限接近于图像最右端。
      过程如图:
      394393-20190213121411295-2087361139.gif
      两种做法进行比较,得出的曲线基本相同。
      取得最上端曲线a如图所示:
      394393-20190213115605108-967378269.png
      然后将该曲线在图中去除,再重复之前的做法,取得第二条曲线b。对于第二条曲线,add_len需要改小,欧式距离的阈值需要改大。
      394393-20190213115652711-295329606.png
      将第二条曲线去除,得到第三条曲线c
      394393-20190213115708819-750804372.png
      可以看出第三条曲线的图像存在噪点,可以用一个区域对噪点清洗,得到第三条曲线c
      394393-20190213115858528-1972931722.png

    导出数据

    将a,b,c的坐标值与图像的size相除,再乘上单位,即可得到数据。

    转载于:https://www.cnblogs.com/shy-/p/10369076.html

    展开全文
  • SPSS(十九)SPSS之时间序列模型(图文+数据集)

    万次阅读 多人点赞 2019-06-17 22:32:38
    SPSS(十九)SPSS之时间序列模型(图文+数据集) 时间序列是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。正如人们常说,人生的出场顺序很重要,时间序列中隐藏着一些过去与未来的关系。时间序列...

    SPSS(十九)SPSS之时间序列模型(图文+数据集)

    时间序列是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。正如人们常说,人生的出场顺序很重要,时间序列中隐藏着一些过去与未来的关系。时间序列分析试图通过研究过去来预测未来。

    时间序列分析在工程、金融、科技等众多领域有着广泛的应用。在大数据时代,时间序列分析已经成为 AI 技术的一个分支,通过将时间序列分析与分类模型相结合,更好的应用于数据检测、预测等场景。

    时间序列模型简介

    • 依时间顺序排列起来的一系列观测值(观测值之间不独立)
    • 它考虑的不是变量间的因果关系,而是重点考察变量在时间方面的发展变化规律,并为之建立数学模型
    • 使用时间序列模型的前提:有足够长的数据序列;数据序列的变动是稳定而规律的

    另外一种理解方式:假如我们对一件事情研究其背后规律很久的话,可以收集到很多的自变量/影响因素去研究与因变量之间的关系,但是由于各种原因我们做不到,我们只能用一个t(时间)来替代所有的影响因素来研究自变量是如何变化的

     

    时间序列分析面临的问题

    时序应该在现实生活中应用的很广,但是为什么不常用这个模型呢?

    • 基础统计数据原因(数据收集)

    报表系统——质量问题
    统计口径——不统一
    范围变化、区域划分——变化

    • 理论和技术培训原因 

    之前没有好的工具来实现时间序列模型

     

    时间序列的方法分类

    • Time domain(最为常见的方法):将时间序列看成是过去一些点的函数,或者认为序列具有随时间系统变化的趋势,它可以用不多的参数来加以描述,或者说可以通过差分、周期等还原成随机序列。
    • Frequency domain:认为时间序列是由数个正弦波成份叠加而成,当序列的确来自一些周期函数集合时,该方法特别有用。 比如心电图
       

    时间序列的构成

    并不是每个序列都包含所有4种成分。比如以年为时间单位的序列就不会有季节变化;
    一些较短的序列也看不出循环变化。所以在分析的时候得具体情况具体分析。 

    • 长期趋势

    指一种长期的变化趋势。它采取一种全局的视角,不考虑序列局部的波动

    下图,整体呈下降趋势

    • 季节变化(Season)

    反映一种周期性的变化一般在一年中完成
    虽然称作“季节”,但是周期并不一定是季度,也可以是月、周等其它能在一年内完成的周期。因为,大多数的周期都以季节的形式出现,所以称作季节变化

    比较典型的季节变化例子:圣诞节效应;冷饮的销售情况

    • 循环变化(Cyclic)

    循环跨度超年

    指一种较长时间的周期变化。一般来说循环时间为2-15年。循环变化一般会出现波峰和波谷,呈现一种循环往复的现象。 
    比如:经济危机 

    • 不规则变化(error) 

    指时间序列中无法预计的部分,也可以理解为误差
    序列的随机波动 
    突发事件引起的 
    它是无法预测的 
    在分析中往往又将其称为白噪声

    它是时间序列中除去趋势、季节变化和自相关性之后的剩余随机扰动。由于时间序列存在不确定性,随机噪声总是夹杂在时间序列中,致使时间序列表现出某种震荡式的无规律运动。
    比如:911事件

     

    时间序列分析对长度的要求

    • 不同的序列分析方法对时间序列分析对长度不一样,建模过程一般都会做差分,差分会损失信息,差分得越多,相应要求的时间序列越长
    • 如果是稳定序列的话,历史数据越多,对预测的帮助越大
    • 如果存在周期,一般需要4个周期以上数理上认为应当在20个周期以上

           假如只有两三个周期,那周期性的分析就没有太大作用了

     

    对于时间序列问题有哪些基本分析思路

    看到数据其实不一定要上最复杂的方法

    • 平滑与季节分解(遇到比较简单的序列)

    用移动平均的方式消除波动,反映出主要的趋势

    • 回归模型

    如果在序列分析中我们考虑到自变量的话,根据历史数据建立相应的回归模型用于预测。甚至来说可以直接把时间当做自变量用于预测,当然我们知道回归时候要求残差是独立的,假如检验出来是非独立的话,我们可以去建一个自回归模型

    • ARIMA

    如果时间序列变化太复杂,我们可以采用ARIMA建模,现在最强大的时序建模方法。真正的时间序列模型建模分析方法
     

    平滑与季节分解

    • 是利用时间序列资料进行短期预测的一种方法。它的基本思想是:除去一些不规则变化后,时间序列将剩下一些基本的变化模式,而这种变化模式将延续到将来。
    • 描述时间序列数据的变化规律和行为,不去试图解释和理解这种变化的原因。例如:您可能发现在过去的一年里,三月和九月都会出现销售的高峰,您可能希望继续保持这样,尽管您不知道为什么。
    • 平滑的主要目的就是除去时间序列的不规则变化,把时间序列的基本变化模式突现出来,作为短期预测的基础。因此也有人把平滑称作“修匀”。
    • 平滑的方法很多。广义上说,可以认为回归也是一种平滑。因为拟合回归曲线可以把杂乱的观测数据修匀得到连续而光滑的曲线。
    • 移动平均和移动中位数等这些不同的平滑技术又被称为平滑器。平滑处理后,可以得到一些新的序列。不同的平滑器得到的新序列是不同的。选择合适的平滑器,寻求最佳的预测效果是平滑处理的关键。

     

    案例:NRC数据的建模预测

    美国1947年1月到1969年12月住宅建筑的数据,分析目的是希望能过通过历史数据来预测1970年全年的情况。

    数据集

    nrc是我们准备用于分析的变量

    nrc2又新增了12个月的数据,可以用来评价我们的预测效果

    556	556
    528	528
    545	545
    607	607
    701	701
    785	785
    874	874
    950	950
    1006	1006
    1093	1093
    1135	1135
    1070	1070
    891	891
    757	757
    874	874
    1028	1028
    1168	1168
    1257	1257
    1294	1294
    1305	1305
    1273	1273
    1203	1203
    1100	1100
    978	978
    846	846
    731	731
    763	763
    844	844
    981	981
    1086	1086
    1147	1147
    1171	1171
    1207	1207
    1238	1238
    1241	1241
    1171	1171
    1077	1077
    1031	1031
    1089	1089
    1276	1276
    1499	1499
    1703	1703
    1827	1827
    1898	1898
    1900	1900
    1785	1785
    1614	1614
    1427	1427
    1289	1289
    1188	1188
    1229	1229
    1288	1288
    1324	1324
    1399	1399
    1428	1428
    1409	1409
    1400	1400
    1397	1397
    1330	1330
    1200	1200
    1015	1015
    963	963
    1149	1149
    1234	1234
    1346	1346
    1437	1437
    1472	1472
    1486	1486
    1473	1473
    1481	1481
    1438	1438
    1309	1309
    1131	1131
    1057	1057
    1206	1206
    1363	1363
    1431	1431
    1570	1570
    1577	1577
    1550	1550
    1514	1514
    1481	1481
    1420	1420
    1294	1294
    1104	1104
    1029	1029
    1167	1167
    1347	1347
    1517	1517
    1627	1627
    1717	1717
    1770	1770
    1783	1783
    1759	1759
    1717	1717
    1650	1650
    1473	1473
    1379	1379
    1562	1562
    1753	1753
    1925	1925
    2064	2064
    2098	2098
    2082	2082
    2051	2051
    1983	1983
    1851	1851
    1656	1656
    1392	1392
    1305	1305
    1457	1457
    1618	1618
    1753	1753
    1884	1884
    1908	1908
    1895	1895
    1860	1860
    1798	1798
    1741	1741
    1567	1567
    1324	1324
    1206	1206
    1350	1350
    1486	1486
    1604	1604
    1718	1718
    1767	1767
    1796	1796
    1787	1787
    1761	1761
    1694	1694
    1513	1513
    1292	1292
    1192	1192
    1302	1302
    1421	1421
    1550	1550
    1702	1702
    1804	1804
    1876	1876
    1907	1907
    1954	1954
    1957	1957
    1832	1832
    1606	1606
    1493	1493
    1676	1676
    1907	1907
    2091	2091
    2253	2253
    2350	2350
    2358	2358
    2310	2310
    2232	2232
    2092	2092
    1883	1883
    1588	1588
    1408	1408
    1613	1613
    1804	1804
    1935	1935
    2112	2112
    2039	2039
    1982	1982
    1931	1931
    1860	1860
    1790	1790
    1644	1644
    1378	1378
    1221	1221
    1459	1459
    1720	1720
    1860	1860
    2059	2059
    2053	2053
    2053	2053
    2055	2055
    2041	2041
    1974	1974
    1807	1807
    1543	1543
    1368	1368
    1605	1605
    1906	1906
    2141	2141
    2377	2377
    2357	2357
    2377	2377
    2330	2330
    2210	2210
    2113	2113
    1965	1965
    1686	1686
    1492	1492
    1666	1666
    1950	1950
    2206	2206
    2421	2421
    2517	2517
    2553	2553
    2516	2516
    2500	2500
    2450	2450
    2230	2230
    1867	1867
    1678	1678
    1866	1866
    2068	2068
    2191	2191
    2385	2385
    2518	2518
    2541	2541
    2439	2439
    2327	2327
    2260	2260
    2118	2118
    1834	1834
    1639	1639
    1782	1782
    2000	2000
    2203	2203
    2429	2429
    2550	2550
    2561	2561
    2473	2473
    2377	2377
    2284	2284
    2136	2136
    1848	1848
    1644	1644
    1781	1781
    1979	1979
    2124	2124
    2287	2287
    2387	2387
    2351	2351
    2202	2202
    1978	1978
    1785	1785
    1614	1614
    1368	1368
    1248	1248
    1405	1405
    1613	1613
    1836	1836
    2107	2107
    2336	2336
    2471	2471
    2446	2446
    2375	2375
    2310	2310
    2191	2191
    1859	1859
    1655	1655
    1885	1885
    2262	2262
    2518	2518
    2628	2628
    2721	2721
    2790	2790
    2780	2780
    2678	2678
    2593	2593
    2454	2454
    2133	2133
    1940	1940
    2195	2195
    2540	2540
    2810	2810
    2962	2962
    2974	2974
    2880	2880
    2763	2763
    2648	2648
    2482	2482
    2288	2288
    	1961
    	1765
    	1986
    	2297
    	2485
    	2592
    	2650
    	2707
    	2721
    	2747
    	2735
    	2627


    时间序列操作的基本步骤

    • 预处理过程

    缺失值的填补 

    一般这两种方法我们比较常用


    时间变量的定义(spss对数据集进行了特殊标记,让spss知道其为序列数据,并非新增三个变量那么简单,必须是刚才进行下面的操作)


    时间序列的平稳化

    观测原始序列是什么分布,时间刻度这一块随便选一个时间自变量

    发现其有长期趋势及季节变化(大概一年)


    一次差分(假如序列匀速上升的话,一次差分序列后应该是平的)

    继续查看其变化(一次差分作为变量)

    确实序列变平了,但是随着时间增加季节变换还是存在的


    季节差分(把周期性也干掉),一阶:相邻的两个季节做相减

    看季节差分分布分布状况

    看到下面的序列,无长期趋势、无季节变换,可认为是一个比较平稳的序列了

    但是刚才上面在做一次差分后的序列,可以看出其序列随着时间增长离散程度会慢慢变大,后续分析可以考虑这一点,可以做变量变换。

    其实刚才上面的步骤不用那么麻烦,在序列图中即可观察

    当前周期:12在哪里设置呢?(在我们刚才定义日期选取的)

     

    关于数据平稳化问题:(非常详细的理论基础)

    大家可以参考

    https://zhuanlan.zhihu.com/p/60023855

    https://zhuanlan.zhihu.com/p/60648709

     

    时间序列趋势的图形化观察

    • Sequence Chart:序列图

    实际上就是一种特殊的线图

    • Autocorrelation Chart:做单个序列,任意滞后(包括负的滞后,也就是超前)的自相关和偏相关图

    对序列图的初步观察结果作进一步确认(检验其是不是白噪声序列)
    重点关心主要的相关趋势,然后再对模型进一步修正

    刚才我们认为做了一次差分和季节差分真的为平稳序列了吗?

    滞后n阶:隔了n个数据的自相关性

    Sig.<0.05,证明存在自相关的,不都是白噪声

    为了方便查看,给出了图,1到5阶都是存在统计学意义的

    自相关系数是有传递性的问题在里面的,spss就会计算偏自相关系数,屏蔽传递的效应后,看剩余的关联是否还存在

    自相关拖尾,偏自相关也拖尾,这两个是为了知道我们进行建模的

    自相关图:自回归系数的变化
    偏相关图:偏回归系数的变化

    假如他是以下模型,应满足下面的特征

    实际用起来,spss会提供一个自动分析的方法

    模型拟合
    几乎均可包含在ARIMA模型族中
    寻找适当的参数是一个反复尝试的过程

    生成 ARIMA 模型的基本步骤:

    1. 对序列绘图,进行 ADF 检验,观察序列是否平稳;对于非平稳时间序列要先进行 d 阶差分,转化为平稳时间序列;
    2. 经过第一步处理,已经得到平稳时间序列。要对平稳时间序列分别求得其自相关系数(ACF)和偏自相关系数(PACF),通过对自相关图和偏自相关图的分析,得到最佳的阶数p、q;
    3. 由以上得到的d、q、p ,得到 ARIMA 模型。然后开始对得到的模型进行模型检验。

    专家建模器:会在指数平滑模型和ARIMA模型里面选取

     

    R方相对于平稳的R方来说,是比较过于乐观的,假如数据是有波动趋势的,我们将趋势解释掉之后,占相当大的变异解释度进去了,平稳的R方比较客观

    RMSE(残差均方)

    MAPE(相对误差)

    MAXAPE(最大值相对误差)

    MAE(绝对误差)

    MAXAE(最大值绝对误差)

    正态化BIC(比较专业化的指标)

     

    当前模型剩下来的这块能否当成白噪声?

    H0:白噪声序列

    Sig.>0.05,剩下来的确实是白噪声序列

     

     

    如何让其做预测?怎么用时间序列?

    由于SPSS的一个小BUG,变量名前缀要修改一下,不能是中文

    对比一下原始序列和预测值效果

    我们想预测到久一点呢?

    假如我们有1970年的真实数据了,对比一下模型预测及真实数据差别

    展开全文
  • 利用python提取网站曲线图数据

    千次阅读 热门讨论 2019-09-10 21:10:32
    数据目标:曲线图 F12,如图位置输入JSON.stringify(dataSeries.dataPoints) copy,粘贴到data.txt 数据是一个列表,里面是个字典 编写程序如下: import json as js datafile = 'data1.txt' resultfile = ...
  • C#如何根据数据库的查找出来的数据绘制曲线图(折线图或者散点图均可)
  • js+html实现曲线图

    热门讨论 2009-09-22 21:44:37
    js+html实现曲线图,大家可以看看,有些地方的不好,请多多指教.
  • 之所以遇到这个问题,还得从我这个Python菜鸟说起,我想把Python程序中print的误差结果绘制成曲线图,但是在程序中编写代码屡试不爽。。。于是计划利用熟悉的MATLAB绘制曲线图。 1.将误差结果保存成文本。 2.利用...
  • HIGHCHARTS 是什么? Highcharts是一个使用纯JavaScript编写的绘图工具,它提供了简单的方式为你的网页或者...spline -> 曲线图 area -> 面积图 areaspline -> 曲线面积图 arearange -> 面积范围图 areasplinerange -
  • HTML 绘制曲线图

    万次阅读 2019-01-18 09:23:59
    怎么样画一个漂亮的HTML曲线图
  • origin画三个曲线图的方法

    万次阅读 2019-06-21 11:59:50
    如果你画的曲线图没有只有点,没有线连接,一定是你的数据有问题,中间有空数据或者有空格数据,完整图如下: 在每个点上单击选中右键选择properties选择independent,也就是无关联,然后设置每个点的颜色和线条...
  • matlab中利用数据生成曲线图

    万次阅读 2014-09-02 16:14:00
    然后在已画成的曲线图选Tools->Edit Plot对图标的字体、曲线颜色进行微调。 2、完整源代码: k=0:115; plot(k,S1,k,S2,k,S3,k,S4,k,S5); axis([0 120 -0.35 0.35]); legend('S_{mt}','S_{1000-lr}/S_{mt}','S_...
  • 根据生存曲线的估计,可以推断出相比组之间存活时间的差异,因此生存曲线非常有用,几乎可以在每个生存分析中看到。 例 在我们将对象放入ggsurvplot()函数之后,我们可以创建简单的生存曲线估计。让我们来看看患...
  • QT系列之曲线图绘制(推荐QCustomPlot)

    千次阅读 多人点赞 2020-04-12 11:17:36
    一个好的曲线图应该具有的功能: 1.美观——背景,线条颜色,线条宽度,字体,边框间距,坐标轴间隔; 2.以鼠标为中心进行缩放,以及重置曲线图; 3.显示鼠标点所在坐标值; 4.图中曲线的名称图例; 5.支持拖拽...
  • matlab将txt数据转化曲线图

    千次阅读 2017-01-16 10:57:42
    参考http://jingyan.baidu.com/article/0a52e3f43f2e6bbf63ed724a.html ... 使用load函数加载txt文件数据,或者直接使用matlab软件导入数据 然后使用plot(x,y)函数画图 x表示x坐标,是一个集合数组 y
  • C# Winform 使用GDI+ 绘制实时曲线图、面积曲线图

    万次阅读 多人点赞 2018-04-23 21:49:59
    问题来源 最近为了公司界面的美化,想将原来的单纯曲线图绘制变成曲线面积图。...曲线图里面的很属性都能自定义。需求分析 功能实现分析 1.GDI+绘图可以实现点与点之间的连接,而且能够实现路径(Graphi...
  • matlab编写的读取.mat文件数据并画曲线图的gui程序。
  • QT读取数据并绘制曲线

    千次下载 热门讨论 2012-07-08 09:23:26
    本代码为QT读取记事本的数据并利用这些数据绘制曲线,解压后附有效果
  • 简介该项目是在后台调取数据库数据在DAO层进行处理,再把处理完的数据集合传到SERVICE层,之后JSP页面将SERVICE层的数据生成以时间为X轴,数量为Y轴的曲线图。 这是SERVICE层调取的数据。 这是JSP生成的页面曲线图...
  • R语言绘制频率直方

    千次阅读 2019-12-26 23:48:16
    频率直方数据统计中经常会用到的图形展示方式,同时在生物学分析中可以更好的展示表型性状的数据分布类型;R基础做图中的hist函数对单一数据的展示很方便,但是当遇到数据的时候就不如ggplot2绘制来的方便。...
  • ↑关注 + 星标~有趣的不像个技术号每晚九点,我们准时相约大家好,我是朱小五昨天的次条给大家发了一个新华社的视频45秒看清多国疫情变化!(点击下即可观看)之前大家遇到的最多的...
  • 利用VBA在Excel里画曲线图

    千次阅读 2019-03-20 10:24:47
    虽然利用Excel的插入工具栏里的插入图表可以方便的生成曲线图,但对于数据多的时候还是觉得麻烦了一些。我想到了利用VBA来一键生成曲线图。以前从来没有接触过VBA,所以走了一些弯路,我在CSDN查了好多东西,在Excel...
  • matplotlib 绘制个子曲线

    千次阅读 2020-02-12 17:53:46
    1、生成个视图(画板): 在matplotlib 中,一个figure即为一个画板,用plt.figure()创建一个新画板,如果只有一个画板的话这句可以省略。 #创建第一个视图(画板) plt.figure(1) #第一个画板的内容 #… #创建第...
  • 如何在Excel中制作曲线图

    千次阅读 2020-10-09 00:44:29
    在此示例中,我们要根据Cookie销售数据创建曲线图。 Select and highlight the range A1:F2 and then click Insert > Line or Area Chart > Line. 选择并突出显示范围A1:F2,然后单击插入>折线图或面积图>折线。 ...
  • python绘制曲线图

    万次阅读 2019-03-14 16:14:18
    # -*- coding: UTF-8 -*- import numpy as np import matplotlib as mpl ...# 这里导入你自己的数据 # ...... # ...... # x_axix,train_pn_dis这些都是长度相同的list() # 开始画图 plt.title('Result Analy...
  • python画曲线图-python画曲线

    千次阅读 2020-10-28 22:54:00
    广告关闭腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越返的越,最高满返5000元!桃心形曲线的方程如下 matlab绘制效果如下:? matlab程序如下。 clccleart = -10:0.01:10x = 16*(sin...
  • QT简单曲线图绘制(基于QChart)

    千次阅读 2020-08-12 22:02:49
    本例指定一系列离散点,可绘制曲线图,并可将图表嵌入widget中(本例嵌入了mainwi) 效果如下: 本例曲线图绘制使用QT的QChart模块实现(QT5.7及其以上版本才有此功能),自行封装了Chart类, 调用如下: .pro工程...
  • C#实现显示实时数据,并形成曲线,保存数据,完整的项目代码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 115,274
精华内容 46,109
关键字:

多数据曲线图怎么做