【发布时间】:2017-05-16 12:18:35
【问题描述】:
我在我的项目中为温度报告实现了折线图(MPAndroidChart 库)。应在 X 轴上绘制日期时间,并在 Y 轴上绘制温度。
我刚刚在 X 轴标签中添加了日期时间作为字符串,但它已折叠。所以请任何人指导我。
【问题讨论】:
-
我有你想要的相同的实现,请试试This.
我在我的项目中为温度报告实现了折线图(MPAndroidChart 库)。应在 X 轴上绘制日期时间,并在 Y 轴上绘制温度。
我刚刚在 X 轴标签中添加了日期时间作为字符串,但它已折叠。所以请任何人指导我。
【问题讨论】:
试试下面的。
设置 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;
}
}
希望对你有帮助
【讨论】:
如果它仍然真的......
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 put String[] values (public DateAxisValueFormatter(String[] values) ) 其中每个值都是一个 DateString。
X 的数据系列条目(new Entry(forX,forY))必须是 flat array = 0,1,2,3,4
对不起,我的英语很差,我来自俄罗斯。自 1988 年起担任水力发电厂实时控制系统开发公司 (www.asu-epro.ru) 的主要负责人。 Borodatov Michael miclosoft@mail.ru
【讨论】:
使用 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));
编码愉快!
【讨论】:
进一步从@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).
【讨论】: