使用不同形状的MPAndroidChart图例(Legend)

3
我正在使用MPAndroidChart,并需要使用ScatterChart绘制多个数据集。由于数据集数量是动态的,我使用了一种逻辑来为每个数据集创建颜色和形状的组合。生成的图表如下所示。如您所见,此示例中有十个数据集,每个数据集都用唯一的形状+颜色组合表示。问题在于图例形状。如何更改图例形状以与数据集形状相匹配? 图表: enter image description here 源代码:
        private static final int SCATTER_SHAPES_MOD = 4; //there are four shapes
        private static final int SCATTER_COLOR_MOD = 5; //there are five colors
        for (int i=0; i < dataSeries.size(); i++) {
            ScatterDataSet set = new ScatterDataSet(dataSeries.get(i), choiceArray[i]);
            set.setScatterShape(ScatterShapeArray[i % SCATTER_SHAPES_MOD]);
            set.setColor(ColorTemplate.COLORFUL_COLORS[i % SCATTER_COLOR_MOD]);
            set.setScatterShapeSize(10f);
            set.setDrawValues(false); // Hide data labels
            dataSets.add(set); // add the dataset
        }
        if (dataSeries.size() > 0) {
            data = new ScatterData(xVals, dataSets);
            // Set chart data
            chart.setData(data);
        }
2个回答

4

实际上,现在亲爱的Philipp已经添加了这个功能,我认为他忘记更新这里了,因此我正在更新,希望能对某些人有所帮助。

现在Legend类中有一个名为setCustom的新函数,可以用于上述目的。我已经测试过了。请看下面的代码。循环是使用我已经拥有的dataSets完成的,例如我的ScatteredDataSet。

    List<LegendEntry> entries = new ArrayList<>();
    for (int i = 0; i < dataSets.size(); i++) {
        final LegendEntry entry = new LegendEntry();
        IScatterDataSet set = dataSets.get(i);
        String Label = set.getLabel();

        if (Label.equalsIgnoreCase("A")) {
            entry.form = Legend.LegendForm.CIRCLE;
            entry.formColor = set.getColor();
            entry.label = Label;

        } else if(Label.equalsIgnoreCase("B")){

            entry.form = Legend.LegendForm.CIRCLE;
            entry.formColor = set.getColor();
            entry.label = Label;



        } else if(Label.equals("C")){

            entry.form = Legend.LegendForm.SQUARE;
            entry.formColor = set.getColor();
            entry.label = Label;



        }
        else if (entry.formColor == ColorTemplate.COLOR_NONE ||
                entry.formColor == 0) {
            entry.form = Legend.LegendForm.EMPTY;
            entry.label = Label;

        }
        entries.add(entry);
    }

    LegendEntry[] mEntries = entries.toArray(new LegendEntry[entries.size()]);

    Legend l = mChart.getLegend();
    l.setCustom(mEntries);
    l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
    l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
    l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
    l.setDrawInside(false);
    l.setXOffset(10f);

我感谢Philipp提供这个很棒的库。注意:我看到的唯一限制是LegendForm只有几个作为枚举的形状,不能更改,而Scatter chart有更多的形状,不能在图例中复制!如果有办法,请在此发布。


2

很遗憾,默认情况下目前不可能实现。 您需要修改库以获得您所描述的行为。

我可能会在将来添加这样的功能。


2
谢谢。这将是一个很棒的功能添加。 - user1928896

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接