背景
アプリの一部のグラフでは、MPAndroidChartライブラリを使用しています。私のグラフのすべての横軸は時間ベースであり、1年、1か月、1週間、1日、または1時間にわたることができます。常に完全な期間が表示されるため、1月〜12月、月曜日〜日曜日、0:00〜24:00など。軸の値は常にエポックタイムスタンプ(秒単位)です。
要件
X軸ラベルに次のルールを適用します。
問題
X軸のgranularity
を設定できます。これにより、2つのポイントの間にスペースがあることを確認できます。これにより、粒度が示しますが、これは、(1日のスパンの場合)最初のラベルが1であることを意味します。 :00 am、2番目は2:01 am、3番目は3:16 amです。これは(最小)60分の粒度に適合するためです。
現在の不正確な状況。理想的には[0:00, 3:00, 6:00, 9:00 ..]
質問
上記の結果を達成するためにx軸ラベルの位置を制御する方法はありますか?
私は同じことをしました、これを試してください、
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のようになります。
interval
では、1を渡します。
slot
で渡す必要があります。月、年、日などのデータの識別、これには列挙型を使用します。
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;
}
曜日についても同様の問題がありました...
私のタイムスタンプはあなたのタイムスタンプと同じ形式でしたが、それらがエントリの浮動小数点数に変換されたとき、それらはあまりにも多くの精度を失い、不規則な間隔を与えました。
ミリ秒単位のタイムスタンプを分単位のタイムスタンプに変換しましたが、完全に機能します
float変換が正確に機能していないことを確認し、そこから間隔を定期的にする残りのパラメーターを設定できます