在Androidplot

时间:2017-06-08 02:01:17

标签: android androidplot

我正在使用Androidplot来显示实时数据。实时数据是动态的,x轴是时间。域是固定的时间跨度。由于值可以是任意double,因此rangeStepMode设置为subdivide y轴。问题是当所有值都相同时,绘图不能正确绘制。

non-working plot

您可以在图像中看到没有范围网格或标签。

From this related question

  

这是因为Androidplot没有足够的信息来自动计算单个点的合理域/范围比例。

这是有道理的,并且设置非零范围边界的链接解决方案有效但不是miny - 1maxy + 1之类的任意范围,我希望只有一个被标记在这些情况下,屏幕中间的范围行。

Single Range Line

我的活动:

public class SimpleXYPlotActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.simple_xy_plot_example);
        XYPlot plot = (XYPlot) findViewById(R.id.plot);
        Number[] series1Numbers = new Number[]{
                1,
                1,
        };
        XYSeries series1 = new SimpleXYSeries(SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Series1", series1Numbers);
        LineAndPointFormatter series1Format = new LineAndPointFormatter(Color.RED, Color.GREEN, null, null);
        plot.addSeries(series1, series1Format);


        StepMode stepMode = StepMode.SUBDIVIDE;
        int stepValue = 10;
        plot.setRangeStepMode(stepMode);
        plot.setRangeStepValue(stepValue);
    }
}

我的布局:

<com.androidplot.xy.XYPlot
    android:id="@+id/plot"
    style="@style/APDefacto.Dark"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    ap:rangeStep="5"
    ap:rangeStepMode="subdivide"
    ap:domainStep="1"
    ap:domainStepMode="increment_by_val"
    />

我尝试了什么

以下是关于简单xy示例的工作,但是当我尝试在我的时间序列类中的minmax内设置它时,绘制域网格线的线程进入一个非常长的循环,因为它计算的xPix非常大。对于我有多个系列的情况,这也不是一个非常好的解决方案。关于如何获得我想要的结果的任何想法?

    Double minY = null;
    Double maxY = null;
    for (Double aDouble : series1Numbers) {
        if (minY == null) {
            minY = aDouble;
        } else {
            minY = Math.min(minY, aDouble);
        }
        if (maxY == null) {
            maxY = aDouble;
        } else {
            maxY = Math.max(maxY, aDouble);
        }
    }
    if (minY.equals(maxY)) {
        plot.setUserRangeOrigin(minY);
        plot.setRangeBoundaries(0, 2 * maxY, BoundaryMode.FIXED);
        plot.setRangeStepMode(StepMode.INCREMENT_BY_PIXELS);
        plot.setRangeStepValue(Double.POSITIVE_INFINITY);
    } else {
        plot.setUserRangeOrigin(0);
        plot.setRangeBoundaries(minY, maxY, BoundaryMode.FIXED);
        plot.setRangeStepMode(StepMode.SUBDIVIDE);
        plot.setRangeStepValue(5);
    }

1 个答案:

答案 0 :(得分:0)

这不会消除CPU开销,但您可以使用PlotUtils.minMax为您找到这些值

如果您有可能实现和使用FastXYSeries,那么使用minMax的开销也会减少,因为只有在您的XYSeries数据发生变化时才能完成计算。