問題描述
背景
對于我應用中的一些圖表,我使用的是 MPAndroidChart 庫.我的圖表的所有水平軸都是基于時間的,它們可以跨越一整年、一個月、一周、一天或一個小時.它總是顯示一個完整的時間段,例如 1 月至 12 月、周一至周日、0:00 - 24:00 等.軸的值始終是紀元時間戳(以秒為單位).
For some charts in my app, I'm using the MPAndroidChart library. All horizontal axis' of my graphs are time based, they can span a full year, a month, a week, a day or span one hour. It always shows a full period, so January-December, Monday-Sunday, 0:00 - 24:00 etc. The value of the axis is always the epoch-timestamp (in seconds).
要求
我希望 x 軸標簽遵循以下規則:
I want the x-axis labels to follow these rules:
- 月 1 日(如果是 年跨度);
- 在一天的開始,如果是月或周跨度;
- 在任何整小時 (##:00)(并非全部),如果是天跨度;
- 在小時跨度的任何5分鐘點上.
- at 1st of month in case of year span;
- at start of day in case of month or week span;
- on any full hour (##:00) (not perse all) in case of a day span;
- on any 5 minute point on an hour span.
問題
我可以設置 x 軸的 granularity
,這樣可以確保兩點之間的空間不小于粒度所說的,但這可能意味著(在一天跨度的情況下)第一個標簽是凌晨 1:00,第二個是凌晨 2:01,第三個是凌晨 3:16,因為這符合(最小)60 分鐘的粒度.
I can set the granularity
of the x-axis, which makes sure there is no less space between two points then the granularity says, but that can mean that (in case of day span) the first label is at 1:00am, and the second at 2:01am and the third is at 3:16am, since that fits a granularity of (minimum) 60 minutes.
當前不正確的情況,最好是 [0:00, 3:00, 6:00, 9:00 ..]
Current incorrect situation, which would ideally be something like [0:00, 3:00, 6:00, 9:00 ..]
問題
有沒有辦法控制x軸標簽的定位來達到上面的效果?
Is there a way to control the positioning of the x-axis labels to achieve the results above?
推薦答案
我也做過,試試這個,
XAxis xAxis = mChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE);
xAxis.setDrawGridLines(false);
xAxis.setGranularity(1f); // only intervals of 1 day
xAxis.setTypeface(mTfLight);
xAxis.setTextSize(8);
xAxis.setTextColor(ContextCompat.getColor(this, R.color.colorYellow));
xAxis.setValueFormatter(new GraphXAxisValueFormatter(range, interval, slot));
在你的情況下,在這個 range
中.如果你想要一個月,那么有 12 個,如果是第 7 周等等.
in this range
in your case. If you want month then there is 12, in case of week 7 etc.
在 interval
中你通過了 1.
in interval
you pass 1.
在 slot
你必須通過,識別你的數據,比如月、年、日,我為此使用了枚舉.
in slot
you have to pass, identification of your data like month, year, day, i have use enum for this.
public class GraphXAxisValueFormatter implements IAxisValueFormatter {
private static int MINUTES_INTERVAL = 5;
private String[] mValues;
private int mInterval;
private SensorInterval.Interval mSlot;
public GraphXAxisValueFormatter(List<BinSensorData> range, int interval, SensorInterval.Interval slot) {
mValues = new String[range.size()];
mInterval = interval;
mSlot = slot;
Calendar calendar = Calendar.getInstance();
for (int i = 0; i < range.size(); i++) {
calendar.setTimeInMillis(range.get(i).getTime());
int unroundedMinutes = calendar.get(Calendar.MINUTE);
int mod = unroundedMinutes % MINUTES_INTERVAL;
calendar.add(Calendar.MINUTE, mod < 8 ? -mod : (MINUTES_INTERVAL - mod));
String s = "";
if (slot.equals(SensorInterval.Interval.HOUR) || slot.equals(SensorInterval.Interval.DAY))
s = Util.getTimeFromTimestamp(calendar.getTimeInMillis());
else if (slot.equals(SensorInterval.Interval.WEEK))
s = Util.getDayFromTimestamp(calendar.getTimeInMillis());
else if (slot.equals(SensorInterval.Interval.MONTH))
s = Util.getMonthFromTimestamp(calendar.getTimeInMillis());
else if (slot.equals(SensorInterval.Interval.YEAR))
s = Util.getYearFromTimestamp(calendar.getTimeInMillis());
Util.setLog("Time : "+s);
mValues[i] = s;
}
}
@Override
public String getFormattedValue(float value, AxisBase axis) {
Util.setLog("Value : "+ value);
if (value % mInterval == 0 && value >= 0) {
return mValues[(int) value % mValues.length];
} else
return "";
}
@Override
public int getDecimalDigits() {
return 0;
}
參見:http://prntscr.com/dbn62x
這篇關于MPAndroidChart x 軸日期/時間標簽格式的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!