我在我的项目中实现了温度报告的折线图(MPAndroidChart库)。在X轴上应绘制日期时间并绘制Y轴温度。
我刚刚将日期时间添加为X轴标签中的字符串,但它已折叠。所以请任何人指导我。
答案 0 :(得分:2)
请尝试以下操作。
设置X轴
XAxis xAxis = mChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setValueFormatter(new MyXAxisValueFormatter());
xAxis.setLabelsToSkip(0);
创建新的MyXAxisValueFormatter
工具XAxisValueFormatter
public class MyXAxisValueFormatter implements XAxisValueFormatter {
@Override
public String getXValue(String dateInMillisecons, int index, ViewPortHandler viewPortHandler) {
try{
SimpleDateFormat sdf = new SimpleDateFormat("dd MMM");
return sdf.format(new Date(Long.parseLong(dateInMillisecons)));
}
catch (Exception e)
{
return dateInMillisecons;
}
}
希望这有帮助
答案 1 :(得分:2)
使用 MPAndroidChart 3.0+ 版:
将格式化程序设置为 x 轴(在下面创建):
// Formatter to adjust epoch time to readable date
lineChart.xAxis.setValueFormatter(new LineChartXAxisValueFormatter());
新建一个 LineChartXAxisValueFormatter 类:
public class LineChartXAxisValueFormatter extends IndexAxisValueFormatter {
@Override
public String getFormattedValue(float value) {
// Convert float value to date string
// Convert from seconds back to milliseconds to format time to show to the user
long emissionsMilliSince1970Time = ((long) value) * 1000;
// Show time in local version
Date timeMilliseconds = new Date(emissionsMilliSince1970Time);
DateFormat dateTimeFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault());
return dateTimeFormat.format(timeMilliseconds);
}
}
当条目添加到 chartDataArray
时,它们以秒为单位添加,而不是毫秒,以避免输入为浮点数(即毫秒除以 1000)时潜在的精度问题。
chartDataArray.add(new Entry(secondsSince1970Float, yValueFloat));
快乐编码!
答案 2 :(得分:1)
根据@Ben 的回答,如果您正在创建条形图,并且条形图的时间跨度类似于一小时或一天,并且您提供毫秒或秒的数据,则最终会使条形图变得太细而无法可见。这是 2017 年 (https://github.com/PhilJay/MPAndroidChart/issues/2892) 发布的错误,遗憾的是至今仍未解决。
提出了一种解决方法,它是先将毫秒值转换为条形图的时间跨度,然后再将其设置为 BarEntry。我的时间跨度是一天,所以 我有格式化程序:
static class BarChartXAxisValueFormatter extends IndexAxisValueFormatter {
@Override
public String getFormattedValue(float value) {
// Convert float value to date string
// Convert from days back to milliseconds to format time to show to the user
long emissionsMilliSince1970Time = TimeUnit.DAYS.toMillis((long)value);
// Show time in local version
Date timeMilliseconds = new Date(emissionsMilliSince1970Time);
SimpleDateFormat dateTimeFormat = new SimpleDateFormat("MM-dd");
return dateTimeFormat.format(timeMilliseconds);
}
}
我设置了 X 轴:
xAxis.setValueFormatter(new BarChartXAxisValueFormatter());
然后当设置数据到栏时,我有
new BarEntry(TimeUnit.MILLISECONDS.toDays((long)valX), valY)
。
答案 3 :(得分:0)
如果实际上仍然...
class DateAxisValueFormatter implements IAxisValueFormatter {
private String[] mValues;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd.hh");
public DateAxisValueFormatter(String[] values) {
this.mValues = values; }
@Override
public String getFormattedValue(float value, AxisBase axis) {
// "value" represents the position of the label on the axis (x or y)
return mValues[(int) value];
}
}
并且您必须在Create上放置String[]
值(public DateAxisValueFormatter(String[] values) )
,其中每个值都是DateString。
X的数据系列条目(新条目(forX,forY))必须为flat array = 0,1,2,3,4
对不起,我的英语不好,我来自俄罗斯。自1988年起担任水电厂实时控制系统开发公司的主要负责人(www.asu-epro.ru)。 Borodatov迈克尔miclosoft@mail.ru