在MPAndroidChart中,如何设置x轴(时间)上固定间隔的标签?

问题描述 投票:0回答:1

我已经尝试了一周的不同事情,包括设置粒度以及轴的最小值和最大值。看看 y 轴上的值分布得多么整齐,间隔固定为 40,数字总是以数字 0 结尾。我什至不需要做任何事情就可以使 y 轴像这样,默认是这样的。我希望 x 轴的分布类似,例如会出现 6 个值 [11:20 11:30 11:40 11:50 12:00 12:10],然后当您放大时它们可能会显示为这样 [ 11:20 11:25 11:30 11:35 11:40 11:45]

这是我的代码:

XAxis xAxis = averageEventRateLineChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setDrawGridLines(false);
xAxis.setDrawAxisLine(true);
xAxis.setDrawGridLinesBehindData(false);                                       
xAxis.setAxisLineColor(mContext.getResources().getColor(R.color.graph_line_color));
xAxis.setTextSize(10f);
xAxis.setAxisLineWidth(1f);                           
xAxis.setTextColor(mContext.getResources().getColor(R.color.grey_text_color));
xAxis.setTypeface(ResourcesCompat.getFont(mContext, R.font.open_sans_regular));
xAxis.setValueFormatter(new MyValueFormatter());

YAxis leftAxis = averageEventRateLineChart.getAxisLeft();
leftAxis.setDrawGridLines(false);
leftAxis.setDrawAxisLine(true);
leftAxis.setDrawGridLinesBehindData(false);                     
leftAxis.setAxisLineColor(mContext.getResources().getColor(R.color.graph_line_color));
leftAxis.setAxisLineWidth(1f);
leftAxis.setAxisMinimum(0);
leftAxis.setTextSize(10f);                             
leftAxis.setTextColor(mContext.getResources().getColor(R.color.grey_text_color));
leftAxis.setTypeface(ResourcesCompat.getFont(mContext, R.font.open_sans_regular));

时间格式化类:

public class MyValueFormatter extends ValueFormatter {

    private final SimpleDateFormat formatHours = new SimpleDateFormat("HH:mm", Locale.ENGLISH);
    private final SimpleDateFormat formatDays = new SimpleDateFormat("MMM d", Locale.ENGLISH);
    private final SimpleDateFormat formatMonths = new SimpleDateFormat("MMM yyyy", Locale.ENGLISH);

    public MyValueFormatter(LineChart lineChart) {
    }

    @Override
    public String getFormattedValue(float value) {
        long dataRange = (long) (mLineChart.getHighestVisibleX() - mLineChart.getLowestVisibleX());
        if (dataRange < TimeUnit.HOURS.toMillis(24)) {
            return formatHours.format(new Date((long) value));
        } else if (dataRange < TimeUnit.DAYS.toMillis(7)) {
            return formatDays.format(new Date((long) value));
        } else {
            return formatMonths.format(new Date((long) value));
        }
    }
}
android mpandroidchart linegraph
1个回答
0
投票

我不知道MPAndroidChart,但你绝对需要一个能够在你指定的时间点在水平轴上设置时间标签的地图库(否则你的目标无法实现)。在这种假设下,您将必须自己进行一些计算,我将使用徒步旅行的海拔图来解释这一点:

    计算标签不重叠的垂直网格线的最大数量。在我的示例中:图表的宽度为 900px,时间标签的宽度为 84px,因此最大 900:84=10.7 行。
  1. 计算一个行距对应哪个时间间隔:我的步行持续时间是从 8:51 到 15:27 = 396 分钟。 396:10.7 = 37 分钟。
  2. 将此结果
  3. 向上

    舍入为您在时间轴上所需的时间间隔(例如 1、2、5、15 或 30 分钟、1、2、5 小时等,您将需要多个 if 命令)。就我而言,Δ = 1 小时。

    
    

  4. 找到8:51=531分钟后的第一个整数倍[这里540=9:00,一般是
  5. Δ*Math.ceil((531)/Δ)

    ],并在时间9:00的位置创建标签9:00(以及垂直网格线)轴。

    
    

  6. 在时间间隔 Δ 之后再次执行此操作,直到时间超过 15:27。
© www.soinside.com 2019 - 2024. All rights reserved.