双轴标签
Dual axis labels
是否可以用两个系列创建 XYPlot(系列具有相同的 domain/x 值,但 range/y 值完全不同)?我的意思是,第一个系列在左侧范围轴上有自己的比例,第二个系列在右侧范围轴上有自己的比例。
编辑:
从 1.3.1 开始,添加了 NormedXYSeries,使双尺度实现更简单一些。 DualScaleActivity in the DemoApp 提供了完整的示例。
从 1.x 开始及更高版本,这可以通过 Androidplot 实现 - f(x) example 提供了如何完成的基本示例。
两个重要的部分是创建自定义 LineLabelRenderer 以生成刻度标签。此提供的示例用于自定义颜色和刻度间距:
/**
* Draws every other tick label and renders text in gray instead of white.
*/
class MySecondaryLabelRenderer extends MyLineLabelRenderer {
@Override
public void drawLabel(Canvas canvas, XYGraphWidget.LineLabelStyle style,
Number val, float x, float y, boolean isOrigin) {
if(val.doubleValue() % 2 == 0) {
final Paint paint = style.getPaint();
if(!isOrigin) {
paint.setColor(Color.GRAY);
}
super.drawLabel(canvas, style, val, x, y, isOrigin);
}
}
}
然后您需要将自定义 LineLabelRenderer 附加到图的边缘之一:
plot.getGraph().setLineLabelRenderer(XYGraphWidget.Edge.RIGHT, new MySecondaryLabelRenderer());
如果你不需要任何花哨的着色,你也可以只设置一个自定义格式化程序:
plot.getGraph().getLineLabelStyle(XYGraphWidget.Edge.RIGHT).setFormat(new Format() {
@Override
public StringBuffer format(Object seriesVal, StringBuffer stringBuffer,
FieldPosition fieldPosition) {
// do whatever you need to do here.
stringBuffer.append(((Number) seriesVal).doubleValue() + "bla");
return stringBuffer;
}
@Override
public Object parseObject(String s, ParsePosition parsePosition) {
// nothing to do here
return null;
}
});
这将为您提供一个准确标记的双比例尺,但根据两个比例尺的不同程度,您最终可能会缩小其中一个系列,或者至少尺寸不理想。
解决这个新问题的最佳方法是将所有系列数据标准化为 0 到 1 之间的范围,然后在自定义格式化程序中将标准化值扩展回其原始值。
是否可以用两个系列创建 XYPlot(系列具有相同的 domain/x 值,但 range/y 值完全不同)?我的意思是,第一个系列在左侧范围轴上有自己的比例,第二个系列在右侧范围轴上有自己的比例。
编辑: 从 1.3.1 开始,添加了 NormedXYSeries,使双尺度实现更简单一些。 DualScaleActivity in the DemoApp 提供了完整的示例。
从 1.x 开始及更高版本,这可以通过 Androidplot 实现 - f(x) example 提供了如何完成的基本示例。
两个重要的部分是创建自定义 LineLabelRenderer 以生成刻度标签。此提供的示例用于自定义颜色和刻度间距:
/**
* Draws every other tick label and renders text in gray instead of white.
*/
class MySecondaryLabelRenderer extends MyLineLabelRenderer {
@Override
public void drawLabel(Canvas canvas, XYGraphWidget.LineLabelStyle style,
Number val, float x, float y, boolean isOrigin) {
if(val.doubleValue() % 2 == 0) {
final Paint paint = style.getPaint();
if(!isOrigin) {
paint.setColor(Color.GRAY);
}
super.drawLabel(canvas, style, val, x, y, isOrigin);
}
}
}
然后您需要将自定义 LineLabelRenderer 附加到图的边缘之一:
plot.getGraph().setLineLabelRenderer(XYGraphWidget.Edge.RIGHT, new MySecondaryLabelRenderer());
如果你不需要任何花哨的着色,你也可以只设置一个自定义格式化程序:
plot.getGraph().getLineLabelStyle(XYGraphWidget.Edge.RIGHT).setFormat(new Format() {
@Override
public StringBuffer format(Object seriesVal, StringBuffer stringBuffer,
FieldPosition fieldPosition) {
// do whatever you need to do here.
stringBuffer.append(((Number) seriesVal).doubleValue() + "bla");
return stringBuffer;
}
@Override
public Object parseObject(String s, ParsePosition parsePosition) {
// nothing to do here
return null;
}
});
这将为您提供一个准确标记的双比例尺,但根据两个比例尺的不同程度,您最终可能会缩小其中一个系列,或者至少尺寸不理想。
解决这个新问题的最佳方法是将所有系列数据标准化为 0 到 1 之间的范围,然后在自定义格式化程序中将标准化值扩展回其原始值。