【问题标题】:TimeChart with XYMultipleSeriesRenderer has lines with missing values带有 XYMultipleSeriesRenderer 的 TimeChart 具有缺少值的行
【发布时间】:2014-09-09 23:17:03
【问题描述】:

我继承了一些使用 TimeChart 和 XYMultipleSeriesRenderer 来创建多系列 LineChart 的代码。示例如下所示。

上图有两个主要问题:
1) 蓝色系列不显示任何 4 个数据点的标签
2) 部分数据点(即2441.474和2388.316)距离太近。

至少,我想为#1 找到解决方案。下面是我用来生成视图的代码 sn-p。

创建 XYMultipleSeriesDataset:

private XYMultipleSeriesDataset createLineDataset() {
    List<String> titles = mData.getColumnHeadings();
    List<List<Double>> values = new ArrayList<List<Double>>();
    List<Date> actualDays = new ArrayList<Date>();

    // Add the dates that we have data for
    for (String heading : mData.getRowHeadings()) {
        long toAdd = DateUtil.getLongFromDateStringFromMachineMeasurement(heading);
        actualDays.add( new Date(toAdd) );
    }
    for (JdTableColumn column : mData.getColumns()) {
        List<Double> columnBodyAsDoubles = column.getColumnBodyAsDoubles();
        Log.d(TAG, "Column doubles: " + columnBodyAsDoubles.toString());
        values.add(columnBodyAsDoubles);
    }

    return buildDataset(titles, values, actualDays);
}

  private XYMultipleSeriesDataset buildDataset(final List<String> titles, final List<List<Double>> values, final List<Date> dates) {
    XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
    int length = titles.size();
    for (int i = 0; i < length; i++) {
        TimeSeries series = new TimeSeries(titles.get(i));
        List<Double> valueList = values.get(i);
        int seriesLength = valueList.size();

        for (int k = 0; k < seriesLength; k++) {
            series.add(dates.get(k), valueList.get(k));
        }
        dataset.addSeries(series);
    }
    return dataset;
}

创建时间表:

GraphRange range = getStandardGraphRange();
XYMultipleSeriesRenderer renderer = buildBarRenderer(mData.getColumnHeadings().size(), PointStyle.POINT, true, context, range.getMin(), range.getMax());
TimeChart timeChart = new TimeChart(createLineDataset(), renderer);
    timeChart.setDateFormat(TIME_CHART_DATE_FORMAT);
    GraphicalView chart = new GraphicalView(context, timeChart);

唯一与我看到的问题类似的 Stackoverflow 问题是:All chart values do not show in line graph in achartengine。但是,在那篇文章中,他们使用的是 XYSeriesRenderer,而我使用的渲染器 (XYMultipleSeriesRenderer) 没有建议的方法 setDisplayChartValuesDistance()。如果有人对如何解决此问题有任何建议,我将非常感谢您的反馈。

更新: 根据接受的答案,我必须在添加到 XYMultipleSeriesRenderer 渲染器的每个 XYSeriesRenderer 上使用 setDisplayChartDistance() 方法:

for (XYSeriesRenderer r : createBarSeriesRenderers(seriesLength, pointStyle, displayChartValues, context)) {
        r.setDisplayChartValuesDistance(8);
        renderer.addSeriesRenderer(r);
    }

【问题讨论】:

    标签: android achartengine


    【解决方案1】:

    您可以控制两个连续标签之间的最小距离(以像素为单位)。根据这个值,图表知道是否以及何时需要显示图表值标签。

    mRenderer.setDisplayChartValuesDistance(distanceInPixels);
    

    【讨论】:

    • 该方法似乎不适用于 XYMultipleSeriesRenderer。或者至少对于我正在使用的 AChart 版本。这是最近添加的吗?
    • 它在 XYSeriesRenderer 中。
    • 我有一个预编译的 jar 文件(我们继承了这个代码,所以不确定是什么版本)并且 Android Studio 无法识别建议的方法。我查看了 XYMultipleSeriesRenderer (achartengine.org/content/javadoc/org/achartengine/renderer/…) 及其超类 (achartengine.org/content/javadoc/org/achartengine/renderer/…) 的文档,但没有看到该方法。
    • 我从您的链接(achartengine-1.2.0.jar)下载了jar文件,但建议的方法仍然不可用。但是,我确实注意到某些方法已被弃用/删除(即 SimpleSeriesRenderer 的 setDisplayChartValues(true))。新版本的库改变了饼图的外观(数字在图表内,而不是连接到图表外数字的线),所以看起来我现在必须使用我们当前的 AChart 版本。但是,我想确认您的建议确实有效,以便我至少可以将您的答案标记为已接受。
    猜你喜欢
    • 2015-09-08
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 2020-09-25
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多