2016-07-05 10 views
0

グラフをX軸でズームするとグラフが消えます。 Libのバージョン - MPAndroidChart:V3.0.0-β1ズーム時にグラフが消えます

enter image description here

私は例LineChartTimeを使用。そして、setData()関数のlong hourMillis = 36000L;を編集し、グラフ表示に問題がありました。

UPDATED!

時間サンプリングが360000ミリ秒または6分未満のときに問題になります。 "LineChartTime"のような1時間の場合、すべてがOKです。しかし、x値を1451606400000Lから0に減らし、時間サンプリングを1ミリ秒にするとすべてがOKです。だから私は、浮動小数点型のx値の主な問題は、それが間違った大きなLONG値を処理すると思う。

私は一時的な解決策を見つけました。私は現在の時刻を取得した場合 は、私は(01.01 0時00 2016)1451606400000Lにそれを軽減し、それほど大きくない値を描く、誰かが私に教えてください別の解決策を持っている場合もフォーマッタ文字列

 xAxis.setValueFormatter(new AxisValueFormatter() { 

     private FormattedStringCache.Generic<Long, Date> mFormattedStringCache = new FormattedStringCache.Generic<>(new SimpleDateFormat("yyyy dd MMM HH:mm")); 

     @Override 
     public String getFormattedValue(float value, AxisBase axis) { 
      Long v = (long) value + 1451606400000L; 
      return mFormattedStringCache.getFormattedValue(new Date(v), v); 
     } 

を変更します。

+1

解決策を下の回答ボックスに転送し、最新の編集をロールバックしてください。私たちは、質問の投稿への回答を絞り込まない方が好きであり、私たちはタイトルに[解決済み]のハックをしたくないです。ありがとう。 – halfer

答えて

0

ズームインすると、ライブラリは可視領域外の値をレンダリングしません。ここのアルゴリズムはfloatタイプを使用していますが(これは多くの理由が考えられます)、これは「大きな」数字に問題を引き起こします。

floatは内部的には32ビットのIEEE 754です。つまり、有効数字は約7桁に過ぎません。ミリ秒単位のタイムスタンプでは、少なくとも最後の桁が切り捨てられます(少なくとも、どの線を描くかを決めるために)、線の一部が消えてしまいます。

オプション1:float精度の範囲内 使用タイムスタンプ、または少なくとも近いです。

現在のデータをプロットする場合は、自分のソリューションと同様に、の値をタイムスタンプから減算し、フォーマット時に同じ値を戻します。 1秒の精度でライブできる場合は、タイムスタンプを60000で割って、それに応じてフォーマッタを調整します。

オプション2:可視領域外に線を引くライブラリにパッチを適用します。

大きなデータセットを持っていない場合に役立つクイックフィックスは、すべてをレンダリングすることです。折れ線グラフでは、このような行1280近くBarLineChartBase.javaに以下の2つの方法の内容を変更します。

public float getLowestVisibleX() { 
    return mXAxis.mAxisMinimum; 
} 

public float getHighestVisibleX() { 
    return mXAxis.mAxisMaximum; 
} 

これはおそらく、乱暴に非効率的である、またはデータセットのサイズによっては問題があってもなくてもよいです。

関連する問題