これが問題です。java.sql.Timestampと(簡単にするために)データとしてのintを含む永続化された「スナップショット」がたくさんあります。
Primefaces 3.4.1を含むJSFページがあり、<p:lineChart>
その後ろにチャートのモデルを含むManagedBeanがあります。
次に、時間範囲を選択し、その範囲内のすべてのスナップショットをフェッチするとします。グラフのデータモデルにすべてのタイムスタンプ(x軸)とすべての整数(y軸)を入力します。
だから私が人口を増やしている間にすることは:
data = new HashMap<Object, Number>();
List<Snapshot> allSnapshots = persistenceService.getAllSnapshots();
for(int i = 0; i < allSnapshots.size(); i++) {
Snapshot s = allSnapshots.get(i);
data.put(new Date(s.getTimestamp().getTime()), s.getData());
}
chartModel.getSeries().get(0).setData(data);
(注:サンプルコードでは、100個程度をすばやく生成したため、すべてのスナップショットをフェッチします)。
私はこのようにチャートを設定しました:
<p:lineChart id="chart" value="#{backingBean.chartModel}" xaxisAngle="-90">
<f:convertDateTime pattern="HH:mm:ss"/>
</p:lineChart>
正常に動作しますが、モデルに100個のデータポイントが含まれている場合、xaxisはすべての目盛りで混雑しています。
次に、primefacesのオプションを使用してjqplotエクステンダー関数を使用しました。extender="extend"
だから私はチャートの属性として追加するだけです、ここextend
で次のjs関数はあります:
function extend() {
this.cfg.axes = {
xaxis: {
renderer: $.jqplot.DateAxisRenderer,
rendererOptions: { tickRenderer: $.jqplot.CanvasAxisTickRenderer },
tickOptions: {
showGridline: true,
formatString: '%H:%M',
angle: -90
}
}
}
}
これは現在のバージョンです。何時間も読んで試行錯誤した後でも、次のことが正しくないため、正しく理解できません。
- 日付が変換されないため、目盛りはレンダリングされません。現時点では、これは無視され、formatString自体が表示されます...
- 実際のデータの左右に追加の目盛りが作成されますが、これは望ましくありません。
autoscale: true
jqplotエクステンダーのオプションとしてのみ指定する場合、マーク間の間隔だけで問題がないことを期待します。しかし、その後何が起こるかというと、間隔はクールですが、元の日付ラベルは、0から利用可能なデータの量までの裸の数字に変わります。
私はこれに対処することに少し疲れています.....多分私は根本的に間違ったことをしています。そうでなければ、なぜこれがそれほど複雑なのかわかりません。
アドバイスありがとうございます!
乾杯
クリス
編集:
perissfのおかげで、私はこれをチェックしました:https ://stackoverflow.com/a/14287971/870122
提案されたエクステンダーを使用すると、次の出力が得られます: http ://www.abload.de/img/clipboard01y6sgj.png
(申し訳ありませんが、新しいユーザー制限のため、画像を直接投稿することはできません:-/)
ご覧のとおり、目盛りはHH:MMとして正しくレンダリングされているので、とても便利です。しかし、ご覧のとおり、別の非常に奇妙な問題が発生しています。
スナップショットの指定された時間範囲は
- 開始時間:2013-01-28 13:01:25.415
- 終了時間:2013-01-28 13:14:32.145
Glassfish構成でJVMがUTCに設定されているときに、System.currentTimeMillis()を使用してこれらをUTCタイムスタンプとして収集しました。
お気づきのとおり、プロット内のデータポイントは1時間シフトされ、14:01に開始されます。これは、値が現在のタイムゾーンであるUTC+1に自動変換されたように見えます。ただし、左端のxaxisティックは、13:00の元のUTC値の前後に配置されます。
アプリケーションが実行される実際のタイムゾーンがわからないため、タイムスタンプUTCを収集しますが、「変換された」時間値を表示したいと思います。ですから、私のタイムゾーンへの自動シフトは素晴らしい機能ですが、xaxisのスケーリングは実際には素晴らしくて奇妙ではありません。
私がそれを取り除く方法について何か提案はありますか?
乾杯
クリス
EDIT2:
レンダリングされたページをFirebugでデバッグしているときに、プロットオブジェクトのjqplot内部変数に遭遇しました。これには、xaxisの最小値と最大値が含まれているようです。最小値は13:00頃の元の最小UTC値に設定され、最大値は14:15頃にシフトされたUTC+1値に設定されます。
どういうわけか、最小値は自動タイムゾーン調整に応じてシフトされません。
他のすべての値、つまりdataBounds、データ自体などは、すべて1時間適切にシフトされます。
Bitbucketjqplot課題追跡システムで課題を開きました
どれどれ。
さよなら
クリス