【问题标题】:Format date labels on x axis in MPAndroidChart在 MPAndroidChart 中的 x 轴上格式化日期标签
【发布时间】: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


【解决方案1】:

由于您的日期是浮点值,因此您需要将其恢复为 Date 所以这里不要传递 null,而是创建新的 IAxisValueFormatter 对象并实现方法 getFormattedValue,这是我的解决方案:

Date d = new Date(Float.valueOf(value).longValue());
String date = new SimpleDateFormat("dd-MM", Locale.YOUR_REGION).format(d);

希望它对你有用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2019-06-28
    • 2015-06-08
    • 2012-07-29
    • 2017-10-13
    • 2021-12-09
    相关资源
    最近更新 更多