【问题标题】:Plotting Real time Data (from a sensor) in reverse X-axis direction (from x=6000 to x=1000) in Android App在 Android App 中以反向 X 轴方向(从 x=6000 到 x=1000)绘制实时数据(来自传感器)
【发布时间】:2015-04-09 13:28:12
【问题描述】:

我尝试使用 Achart 引擎,然后使用 GraphView 在相反的 x 轴方向绘制来自传感器的数据(实时、实时更新)。我这样做是因为我想绘制频率 (x) 的函数的幅度 (y),并且我以递减的频率顺序(从 6000Hz 到 1000Hz)接收这些幅度。我的问题是 Achartengine 在增加 x 轴方向对传入数据进行排序,因此当我尝试使用 x 值进行实时更新时,会减少应用程序崩溃。而 GraphView 只是按收到的顺序重新排序点以再次按递增顺序绘制它们并删除图形轴......因此两个库都没有实现我想要做的事情。我尝试用一​​些值初始化绘图,然后逐点更新绘图,但效果不佳(这些点未绘制在绘图的正确位置,并且显示的值不是正确的)。

感谢您的帮助! :)

这是我的代码的一小部分,展示了我在主要活动中对 Achartengine 的实现:

    public void lineGraphHandler() {

        LinearLayout layout = (LinearLayout) findViewById(R.id.chart);

        gView = line.getView(this);

        if (meas_exec == 1 || stim_end == 1 )
        {
            line.clearPoints();
            stim_end = 0;
        }

        for (int i = 0; i < 22; i++) {


                Point p = MockData.initialize(i); // We got new
                // data!
                Point n = MockData.initialize(i); // We got new
                                    // data!
                line.addNewPoints(p, n); // Add it to our graph

        }

        thread = new Thread() {
            public void run() 
            {
                for (int i = 21; i >= 0; i--) {

                    if(stim_end == 0)
                    {
                        try {
                            Thread.sleep(1800);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        Point p = MockData.getDataFromReceiver1(i); // We got new
                        // data!
                        Point n = MockData.getDataFromReceiver2(i); // We got new
                                            // data!
                        line.addNewPoints(p, n); // Add it to our graph
                        gView.repaint();

                    }



                }
                meas_exec = 1;
            }
        };

        thread.start();


        layout.addView(gView);

    }

来自我的 MockData.java:

public class MockData {

public static Point initialize(int x)
        {
            // Our first data
            double[] xi = { 1,1.091,1.189,  1.297,  1.414,  1.542,  1.682,  1.834,  2,  2.181,  2.378,  2.594,  2.828,  3.084,  3.364,  3.668,  4, 4.362,   4.757,  5.187,  5.657,  6.169};  // x values!
            double[] yi =  { -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10 }; // y values!


            return new Point(xi[x], yi[x]);
        }


    public static Point getDataFromReceiver1(int x)
    {

        // Our simulated dataset sensor 1

        double[] x1 ={ 1,1.091,1.189,   1.297,  1.414,  1.542,  1.682,  1.834,  2,  2.181,  2.378,  2.594,  2.828,  3.084,  3.364,  3.668,  4, 4.362,   4.757,  5.187,  5.657,  6.169};  // x values!
        double[] y1 =  { 1.4, 1.1, 1.5, 8.3, 11.4,-1, 2, 8.3, 11.4, 2, 8.3, 13, -10, 8.3, 11.4, 2,  8.3, 13, -10, 2, 0, 3 }; // y values!


        return new Point(x1[x], y1[x]);
    }


        public static Point getDataFromReceiver2(int x)
        {
            // Our simulated dataset sensor 2

            double[] x2 = { 1,1.091,1.189,  1.297,  1.414,  1.542,  1.682,  1.834,  2,  2.181,  2.378,  2.594,  2.828,  3.084,  3.364,  3.668,  4, 4.362,   4.757,  5.187,  5.657,  6.169};// x values!
            double[] y2 =  { 3, 3.4,-2, -10.6, -3, -8, -5, 0, 2 ,-3, -8,  2 ,-3, -15.0, -3, -8, 3, 3.4, 0, 2 , 2 ,-3}; // y values!


            return new Point(x2[x], y2[x]);
        }
}

编辑

这是我想要完成的一个插图。红色箭头显示我要绘制值的方向(指示第 1、2、3... 点顺序)

http://i61.tinypic.com/164ccz.png

所以我绘制的第一个点大约是 6kHz,最后大约是 1kHz,但是当我查看该图时,它应该正确显示在 1kHz 到 6kHz 之间。所以一开始图左边的点会丢失,会逐渐被绘制出来。

【问题讨论】:

    标签: android graph plot achartengine android-graphview


    【解决方案1】:

    您是否尝试在绘制 X 值之前将它们乘以 -1

    这会将您的值从 -6000 绘制到 -1000,而无需做任何其他事情,只需更改 X 轴标签的显示方式。

    我确实有一个如何在 GraphView 中执行此操作的示例,所以如果此解决方案适合您,请不要犹豫!

    【讨论】:

    • 但是我的值也会不合逻辑地从左到右绘制,而从右到左绘制它们会更好......我会考虑的
    • 我不明白。你有你想要完成的最终结果的图片吗?
    • 请在我的问题中查看我的编辑,以获得显示我想要完成的图片,谢谢 :)
    • 我遗漏了一些东西:一旦你拥有所有数据,你想“只是”显示一个静态图,还是一种动画(你画一个点,等一下,然后画下一个)?
    • 当我从传感器收集数据时,我一次绘制一个点(实时更新)。
    【解决方案2】:

    我在这里找到了这个解决方案:Google Groups Achartengine 但我似乎找不到引用的 java 文件(DefaultRenderer.java、Pan.java ...) 只能看到包里对应的.class文件...

    【讨论】:

      【解决方案3】:

      我终于找到了一个解决方案,方法是简单地初始化一个表,然后用新样本更新这个表,并为我收集的每个新样本刷新图表。

      代码示例:

      measurement_table[index] = measurement;
      noise_table[index] = noise;
      
      
      //Clear points in lineseries to add a new lineseries after
      line.clearPoints();
      
      //Update with a new lineseries
      for(int i=0;i<table_size;i++)
      {           
          Point p = new Point(x[i], measurement_table[table_size-1-i]);
          Point n = new Point(x[i], noise_table[table_size-1-i]);
          line.addNewPoints(p, n); // Add it to our graph 
      }
      gView.repaint(); //Replot
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-09
        • 1970-01-01
        相关资源
        最近更新 更多