使用MPAndroidChart绘制的条形图:条形不可见。

5
我将使用MPAndroidChart来生成一个简单的柱状图,该图位于折叠式工具栏内。当我添加条目时,条目的值在图表上以正确的高度可见,但是我看不到条形图本身。
以下是我创建变量的方式:
final List<BarEntry> barEntries = new ArrayList<>();
final BarDataSet barDataSet = new BarDataSet(barEntries, getResources().getString(R.string.cycles_profiled));
final BarData barData = new BarData(barDataSet);

这是我如何填充数据并刷新图表的方法:
final Calendar cal = getFirstDayOfWeek();
for (int i = 0; i < NUMBER_OF_DAYS; i++) {
    long date = cal.getTimeInMillis();
    barEntries.add(new BarEntry(date, map.get(date)));
    cal.add(Calendar.DAY_OF_WEEK, 1);
}
barDataSet.setValues(barEntries);
barChart.setData(barData);
barData.notifyDataChanged();
barChart.notifyDataSetChanged();
barChart.invalidate();

图表

我在应用程序的其他部分创建条形图没有问题。当我在折叠工具栏中绘制折线图时,也能正常工作。


从这里开始调试非常困难。请确保您拥有最新版本的库,并尝试创建一个最小、完整、可验证的示例 - David Rawson
另外,你是如何将背景颜色设置为蓝色的? - David Rawson
谢谢,我编辑了问题。 - apat
1
@apat:你找到解决方案了吗?我也遇到了同样的问题... - androfan
1
@androfan,抱歉我还没有找到解决方案。你的图表也在可折叠工具栏中吗? - apat
显示剩余7条评论
4个回答

6

我遇到了相同的问题,并感谢 OumaSyuu 解决了它。 由于某种原因,BarChart 难以处理毫秒级别的数据... 将您的毫秒值转换为分钟:TimeUnit.MILLISECONDS.toMinutes(millisecondValue),您的日子将会更美好!

  • 如果将时间单位转换为分钟不起作用,请尝试使用其他(更高的)时间单位。适合您的时间单位是条形之间的平均间隔,对我来说是小时。
    • 另一个有趣的观点可能会帮助您设计图表-在方法setBarWidth(float mBarWidth)中,输入mBarWidth表示的是值而不是像素。

4

当我将时间戳用于X轴值时,遇到了同样的问题,这被报告为库中的一个错误。因此,我提出了以下解决方案:

首先创建一个ArrayList:

ArrayList<String> xAxis_stringArray = new ArrayList<>();

当您将条目添加到条目列表时,设置x值为数据源(字符串值)的索引,并像这样将字符串值添加到字符串数组中:

jsonObject = results.getJSONObject(index); String s = jsonObject.getString(x); xAxis_stringArray.add(s); entries.add(new Entry(Float.valueOf(index), Float.valueOf(jsonObject.getString(y))));

最后,请将x轴引用到值格式化程序类:

XAxis xAxis = sum_chart.getXAxis();
xAxis.setValueFormatter(new TimeAxisValueFormatter(xAxis_stringArray));

TimeAxisValueFormatter类:

public class TimeAxisValueFormatter implements IAxisValueFormatter {

ArrayList<String> arrayList = new ArrayList<>();

public TimeAxisValueFormatter(ArrayList<String> list) {
    this.arrayList = list;
}

@Override
public String getFormattedValue(float value, AxisBase axis) {
    return arrayList.get(Math.round(value));
}}

1
我刚遇到了同样的问题,对我来说增加条形图宽度解决了问题。我认为问题在于数据分布的稀疏程度影响了线条的宽度。如果你有一个数据集只分布在一个小时内,并且每分钟都有一条记录,那么我认为这个问题就不存在了。但如果像我一样,数据在5个小时左右非常稀疏,那么条形图的宽度就会变得越来越小,以容纳所有的记录,最终导致条形图消失。
        data.setBarWidth(2f);

enter image description here

当我将barwidth增加到80f时:
        data.setBarWidth(80f);

enter image description here


1

你忘了设置.setColor

尝试使用以下代码:

barDataSet.setColor(Color.rgb(0, 155, 0)); //Put your RGB Color

不是我不做,我只是还没有发布代码,但我会的。 - apat
我执行:barDataSet.setColor(Color.WHITE) - apat
这不是和我的问题一样,因为我的图表已经显示出来了。此外,图表的宽度和高度在XML中设置。 - apat
1
Color.WHITE 已经是一个实际的颜色。 我已经尝试使用自己的颜色和 getResources().getColor(R.color.mycolor),但结果是相同的。 - apat
@apat 有任何线索吗? - IntelliJ Amiya
不,我完全不知道。我在我的应用程序中绘制其他的条形图,没有任何问题。只有这一个,在折叠工具栏中,不显示条形。 - apat

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