我正在使用Androidplot来显示实时数据。实时数据是动态的,x轴是时间。域是固定的时间跨度。由于值可以是任意double
,因此rangeStepMode
设置为subdivide
y轴。问题是当所有值都相同时,绘图不能正确绘制。
您可以在图像中看到没有范围网格或标签。
这是因为Androidplot没有足够的信息来自动计算单个点的合理域/范围比例。
这是有道理的,并且设置非零范围边界的链接解决方案有效但不是miny - 1
到maxy + 1
之类的任意范围,我希望只有一个被标记在这些情况下,屏幕中间的范围行。
我的活动:
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);
}
答案 0 :(得分:0)
这不会消除CPU开销,但您可以使用PlotUtils.minMax为您找到这些值
如果您有可能实现和使用FastXYSeries
,那么使用minMax
的开销也会减少,因为只有在您的XYSeries数据发生变化时才能完成计算。