【发布时间】:2017-12-20 10:20:52
【问题描述】:
背景和问题
我正在尝试使用 MPAndroidChart 库以折线图的形式呈现 CSV 文件中记录的一些温度值和日期。但是我不完全理解如何在 X 轴上格式化我的日期值。我尝试使用 IAxisValueFormatter,但现在它仅以奇怪的格式 (2609.03.14:09:12:25) 显示我的 CSV 文件中的两个值。 CSV 文件中的值如下所示:"19.7 C,2017-12-09 12:59:43" 等等。由于 Entry 想要 (float, float) 创建一个入口点,这可能会影响精度?有什么建议可以解决这个问题吗?
要求
如果可能的话,我希望我的所有条目都显示在折线图中,并在 X 轴上显示相应的日期,就像它记录在 CSV 文件中一样。
我现在的 onCreate 方法:
public class MainActivity extends AppCompatActivity {
LineChart mLineChart;
InputStream inputStream;
String [] sensorData;
ArrayList<Entry> entries = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLineChart = findViewById(R.id.linegraph);
importData();
LineDataSet dataSet = new LineDataSet(entries, "Temperatures");
LineData lineData = new LineData(dataSet);
mLineChart.setData(lineData);
dataSet.setColor(Color.RED);
dataSet.setDrawCircles(false);
dataSet.setDrawValues(false);
dataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
mLineChart.getDescription().setText("");
mLineChart.getLegend().setEnabled(false);
mLineChart.invalidate();
YAxis leftAxis = mLineChart.getAxisLeft();
leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
leftAxis.setAxisMinimum(0f);
leftAxis.setAxisMaximum(30f);
YAxis rightAxis = mLineChart.getAxisRight();
rightAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
rightAxis.setAxisMinimum(0f);
rightAxis.setAxisMaximum(30f);
XAxis xAxis = mLineChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setDrawGridLines(false);
xAxis.setAxisMinimum(0f);
xAxis.setLabelCount(5);
xAxis.setAxisMaximum(400f);
xAxis.setGranularity(1f);
xAxis.setGranularityEnabled(true);
xAxis.setValueFormatter(new DateAxisValueFormatter(null));
}
我用于导入和创建条目的代码:
public void importData() {
inputStream = getResources().openRawResource(R.raw.sensor_vardagsrum);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
try {
String csvLine;
while ((csvLine = reader.readLine()) != null) {
sensorData = csvLine.split(",");
sensorData[0] = sensorData[0].substring(0, sensorData[0].length() - 1).replaceAll("\\s+", "");
sensorData[1] = sensorData[1].replaceAll("\\D", "");
float temp = Float.parseFloat(sensorData[0]);
float date = Float.parseFloat(sensorData[1]);
entries.add(new Entry(date, temp));
}
System.out.println(entries);
} catch (IOException ex) {
throw new RuntimeException("Error in reading CSV file" + ex);
}
}
}
我的 IAxisValueFormatter:
class DateAxisValueFormatter implements IAxisValueFormatter {
private String[] mValues;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd:hh:mm:ss");
public DateAxisValueFormatter(String[] values) {
this.mValues = values; }
@Override
public String getFormattedValue(float value, AxisBase axis) {
return sdf.format(new Date((long) value));
}
}
这是输出现在的样子:
【问题讨论】:
-
我添加了一个屏幕截图,向您展示现在如何绘制 X 轴。
标签: java android csv mpandroidchart axis-labels