3

これが問題です。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: truejqplotエクステンダーのオプションとしてのみ指定する場合、マーク間の間隔だけで問題がないことを期待します。しかし、その後何が起こるかというと、間隔はクールですが、元の日付ラベルは、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課題追跡システムで課題を開きました

どれどれ。

さよなら

クリス

4

2 に答える 2

0

私はついにjqplotレンダラーをデバッグし、この動作を引き起こすコードの行を見つけました。

興味のある方は、こちらのコメントセクションでバグ修正を見つけてください: Bitbucket Issue Tracker

助けてくれてありがとう

于 2013-02-01T13:10:44.407 に答える
0

この修正に非常に興味がありますが、BitBucketの問題は制限された領域にあるため、アクセスできません。だから私はこのAxisDateRendererを修正しようと試みましたが、幸いなことに私は修正しました:)

そのため、Primefaces(6.0)チャートは古いバージョンのJQPlotライブラリを使用します。このバージョンのバグにより、最小の日付軸の境界が最初の値ではなく、ユーザーブラウザのロケールのタイムゾーンに応じて古い値に設定されます。たとえば、最初の値が12:00で、GMTがGMT + 1の場合、日付軸の最小値は12:00ではなく11:00になります。

minVale

次の行(createTicks関数内)はベッドを置き換える必要があります(コードは以下に縮小して記述されていることに注意してください)

ad = ad.getTime() + ad.getUtcOffset();

次の行までに:

ad = Math.floor((ad.getTime() - ad.getUtcOffset())/r) * r + ad.getUtcOffset();

置き換える非縮小線:

min = min.getTime()  + min.getUtcOffset();

と:

 min = Math.floor((min.getTime() - min.getUtcOffset())/tempti) * tempti + min.getUtcOffset();

Primefacesのchart.jsを以前のバージョンに更新しようとしましたが、チャートが機能しなくなったことに注意してください。新しいバージョンが使用されることを期待して、Primefacesの次の更新を待ちます。また、Primefaces6.0で使用されているJQPlotのバージョンもわかりません。

于 2016-09-08T10:05:06.547 に答える