双轴标签

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 之间的范围,然后在自定义格式化程序中将标准化值扩展回其原始值。