You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MPAndroidChart绘制时间-价格折线图时X轴刻度设置问题求助

Fixing X-Axis Scale Issues with MPAndroidChart for Time-Based Price Line Charts

Hi there! I’ve run into similar X-axis scaling headaches with MPAndroidChart when dealing with sorted time-series data and user-selected date ranges. Let’s break down how to fix this properly:

1. Bind Actual Time Data to Each Entry

The core issue here is probably that you’re using the entry’s index as the X-value, which breaks when data gets sorted. Instead, store the actual timestamp (or Date object) as the X-value for every Entry:

List<Entry> priceEntries = new ArrayList<>();
// Assume you have lists for prices and their corresponding Date objects
for (int i = 0; i < priceData.size(); i++) {
    long timeInMillis = dateList.get(i).getTime();
    priceEntries.add(new Entry(timeInMillis, priceData.get(i)));
}

This way, even if your dataset gets sorted, each point retains its true time reference.

2. Use a Custom X-Axis Formatter

Next, create a formatter to convert those timestamps into human-readable date/time labels. This ensures the X-axis always shows the correct time, regardless of data order:

public class TimeXAxisFormatter implements IAxisValueFormatter {
    private final SimpleDateFormat dateFormat;

    public TimeXAxisFormatter(String datePattern) {
        dateFormat = new SimpleDateFormat(datePattern, Locale.getDefault());
    }

    @Override
    public String getFormattedValue(float value, AxisBase axis) {
        // Convert the float timestamp back to a long, then format it
        long timestamp = (long) value;
        return dateFormat.format(new Date(timestamp));
    }
}

Then apply it to your X-axis:

XAxis xAxis = chart.getXAxis();
// Use a pattern that fits your needs (e.g., "MM/dd HH:mm" for date + time)
xAxis.setValueFormatter(new TimeXAxisFormatter("MM/dd HH:mm"));

3. Filter Data for User-Selected Time Ranges

When the user picks a start/end time, filter your entry list to only include points within that window before feeding it to the chart. This lets MPAndroidChart automatically adjust the X-axis range to match the selected period:

// Get user-selected start and end times (as Date objects)
long userStartMillis = selectedStartDate.getTime();
long userEndMillis = selectedEndDate.getTime();

List<Entry> filteredEntries = new ArrayList<>();
for (Entry entry : priceEntries) {
    long entryTime = (long) entry.getX();
    if (entryTime >= userStartMillis && entryTime <= userEndMillis) {
        filteredEntries.add(entry);
    }
}

// Update the chart with filtered data
LineDataSet dataSet = new LineDataSet(filteredEntries, "Price Over Time");
LineData lineData = new LineData(dataSet);
chart.setData(lineData);
chart.invalidate(); // Refresh the chart to apply changes

4. Tweak X-Axis Display (Optional)

To make the X-axis labels look cleaner, add these adjustments:

  • xAxis.setGranularity(60 * 1000); // Set minimum interval (e.g., 1 minute) to avoid duplicate labels
  • xAxis.setLabelRotationAngle(45f); // Rotate labels to prevent overlap
  • xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); // Place the X-axis at the bottom
  • xAxis.setDrawGridLines(false); // Hide grid lines if they clutter the chart

By tying each entry to its actual timestamp, using a custom formatter, and filtering data for user ranges, you’ll eliminate the X-axis scaling issues caused by sorted data and dynamic time windows.

内容的提问来源于stack exchange,提问作者Pavlo Kravchenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:51:33