在 Android 应用程序中以反向 X 轴方向(从 x=6000 到 x=1000)绘制实时数据(来自传感器)
Plotting Real time Data (from a sensor) in reverse X-axis direction (from x=6000 to x=1000) in Android App
我尝试使用 Achart 引擎,然后使用 GraphView 在相反的 x 轴方向上绘制来自传感器(实时、实时更新)的数据。我这样做是因为我想根据频率 (x) 绘制幅度 (y),并且我以递减的频率顺序(从 6000Hz 到 1000Hz)接收这些幅度。我的问题是 Achartengine 以增加的 x 轴方向对传入数据进行排序,因此当我尝试使用 x 值进行实时更新时,应用程序崩溃了。而 GraphView 只是按照收到的顺序重新排序点,以再次按递增顺序绘制它们并删除图形轴......因此这两个库都没有实现我想要做的。我尝试用一些值初始化绘图,然后逐点更新绘图,但效果不佳(这些点未绘制在绘图上的正确位置,显示的值也不正确)。
感谢您的帮助! :)
这是我的代码的一小部分,显示了我在主 activity:
中对 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 之间。所以一开始图左边的点会缺失,慢慢会画出来。
您是否尝试过在绘制 X 值之前将它们乘以 -1?
这将绘制从 -6000 到 -1000 的值,无需执行任何其他操作,只需更改 X 轴标签的显示方式即可。
我有一个在 GraphView 中如何执行此操作的示例,所以如果此解决方案适合您,请不要犹豫,索取它!
我在这里找到了这个解决方案:Google Groups Achartengine
但我似乎找不到引用的 java 文件(DefaultRenderer.java、Pan.java...)
只能看到包里对应的.class文件...
我终于找到了一个解决方案,只需初始化一个 table,然后用新样本更新这个 table,并为我收集的每个新样本刷新绘图。
代码示例:
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
我尝试使用 Achart 引擎,然后使用 GraphView 在相反的 x 轴方向上绘制来自传感器(实时、实时更新)的数据。我这样做是因为我想根据频率 (x) 绘制幅度 (y),并且我以递减的频率顺序(从 6000Hz 到 1000Hz)接收这些幅度。我的问题是 Achartengine 以增加的 x 轴方向对传入数据进行排序,因此当我尝试使用 x 值进行实时更新时,应用程序崩溃了。而 GraphView 只是按照收到的顺序重新排序点,以再次按递增顺序绘制它们并删除图形轴......因此这两个库都没有实现我想要做的。我尝试用一些值初始化绘图,然后逐点更新绘图,但效果不佳(这些点未绘制在绘图上的正确位置,显示的值也不正确)。
感谢您的帮助! :)
这是我的代码的一小部分,显示了我在主 activity:
中对 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 之间。所以一开始图左边的点会缺失,慢慢会画出来。
您是否尝试过在绘制 X 值之前将它们乘以 -1?
这将绘制从 -6000 到 -1000 的值,无需执行任何其他操作,只需更改 X 轴标签的显示方式即可。
我有一个在 GraphView 中如何执行此操作的示例,所以如果此解决方案适合您,请不要犹豫,索取它!
我在这里找到了这个解决方案:Google Groups Achartengine 但我似乎找不到引用的 java 文件(DefaultRenderer.java、Pan.java...) 只能看到包里对应的.class文件...
我终于找到了一个解决方案,只需初始化一个 table,然后用新样本更新这个 table,并为我收集的每个新样本刷新绘图。
代码示例:
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