@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

Office Web Components(OWC)でグラフ表示させたが・・・

投稿者投稿内容
snow
常連さん
会議室デビュー日: 2008/02/05
投稿数: 26
投稿日時: 2008-02-05 16:28
サーバーにOffice Web Components Ver10をインストールし、画像データとしてクライアントにグラフ表示しています。
横軸のデータを日付にしたときと時間にした時で、グラフの表示が変わってしまいます。
時間にした時は一番左の縦軸から一番右の縦軸までの折れ線グラフが表示されます(グラフ表示エリアいっぱいに表示される)が、日付にした時は、折れ線グラフは一番左の縦軸と一番右の縦軸より内側に表示されます(グラフ表示エリアより狭い範囲に表示される)。
つまり、一番左の縦軸と折れ線グラフの開始点の間に隙間ができます。
同様に一番右の縦軸と折れ線グラフの終点の間にも隙間ができてしまいます。
クライアントの画面は日付のグラフと時間のグラフの2画面を表示しますので、どちらかに統一したいのですが、どうすればよいでしょうか。
下記のソースはstring categoryの時間の方はコメントにしていますが、日付の方をコメントにすると折れ線グラフの表示範囲が狭くなります。なにしろOWCは始めてなので、わからないことだらけです。
よろしくお願いします。
Response.ContentType = "image/gif";
Response.Clear();
Response.Buffer=true;
Bitmap bitmap = new Bitmap(1230, 750, PixelFormat.Format24bppRgb);
ChartSpace chartSpace = new ChartSpaceClass();
ChChart chChart = chartSpace.Charts.Add(0);
chChart.Type = ChartChartTypeEnum.chChartTypeLineMarkers;
string category = "4/1,4/2,4/3,4/4,4/5,4/6;
//string category= "10:10,11:11,12:12,13:13,14:14,15:15";
string value = "9.99,9.98,9.97,9.96,9.95,9.95";
chChart.SeriesCollection.Add(0);
chChart.SeriesCollection[0].SetData(ChartDimensionsEnum.chDimCategories,
(int)ChartSpecialDataSourcesEnum.chDataLiteral, category);
chChart.SeriesCollection[0].SetData(ChartDimensionsEnum.chDimValues,(int)
ChartSpecialDataSourcesEnum.chDataLiteral, value);
Response.BinaryWrite((byte[])chartSpace.GetPicture("gif", 1230, 750));
bitmap.Dispose();
Tesla
常連さん
会議室デビュー日: 2007/03/13
投稿数: 30
投稿日時: 2008-02-06 00:35
引用:

時間にした時は一番左の縦軸から一番右の縦軸までの折れ線グラフが表示されます(グラフ表示エリアいっぱいに表示される)が、日付にした時は、折れ線グラフは一番左の縦軸と一番右の縦軸より内側に表示されます(グラフ表示エリアより狭い範囲に表示される)。


日付を指定した場合は時系列軸が適用され、自動調整されるようです。

[OFF2003] [INFO] Office グラフ コンポーネントによる時系列軸の使用
http://support.microsoft.com/kb/289288/ja

リンク先より
引用:

時間は連続しているため、時系列軸ではデータが連続して途切れなく均等にプロットされます。グラフ コンポーネントによって自動的に項目軸に時系列が適用された場合、GroupingType プロパティを chAxisGroupingNone に設定することにより、時系列機能を無効にできます。


こちらで確認したところ、時系列機能を無効すると縦軸との隙間がなくなりました。


引用:

Bitmap bitmap = new Bitmap(1230, 750, PixelFormat.Format24bppRgb);

bitmap.Dispose();


本題とは関係ありませんが、このコードは不要だと思います。
snow
常連さん
会議室デビュー日: 2008/02/05
投稿数: 26
投稿日時: 2008-02-06 16:16
回答ありがとうございました。
GroupingType プロパティを chAxisGroupingNone に設定することにより、表示エリアいっぱいにグラフを表示することができました。
また、
  Bitmap bitmap = new Bitmap(1230, 750, PixelFormat.Format24bppRgb);
  bitmap.Dispose();
上の2行は削除しても思った様に表示ができました。
またわからないことが発生してしまったので、教えて下さい。
横軸をyyyy/mm/dd hh/mm/ssとしているのですが、表示するデータは2008/02/06 16:00:00,2008/02/06 17:00:00,2008/02/06 17:10:00の時にグラフを表示すると、16時と17時の間隔と17時と17時10分の間隔が同じに表示されてしまいます。
16時と17時の間隔は1時間で、17時と17時10分の間隔は10分なので、時間に対応した間隔(幅)に表示したいのですがどうすれば良いでしょうか?
GroupingUnitTypeをchAxisUnitDayにしてみたのですが、例外が発生してしまいます。
よろしくお願いいたします。

Tesla
常連さん
会議室デビュー日: 2007/03/13
投稿数: 30
投稿日時: 2008-02-06 23:53
時系列軸を使用すると目盛の間隔は自動調整されます。

例えば、string category = "2008/02/06,2008/02/07,2008/02/09"; を指定した場合、
X軸は、02/06, 02/07, 02/08, 02/09 になります。

しかし、時間を指定した場合は時系列軸は適用されません。

ヘルプより引用
時系列グラフと時間
時間、分、または秒間隔で入力されたデータから時系列グラフを作成することはできません。時系列軸の基本単位は、日、週、月、四半期、または年で設定します。

ですのでおそらく無理だと思います。
snow
常連さん
会議室デビュー日: 2008/02/05
投稿数: 26
投稿日時: 2008-02-07 10:19
回答ありがとうございます。
OWCでは、時間を指定した場合の時系列軸の目盛の間隔は自動調整はできないことわかりました。
OWC以外で、できるツールはご存じありませんでしょうか?
よろしくお願いいたします。
Tesla
常連さん
会議室デビュー日: 2007/03/13
投稿数: 30
投稿日時: 2008-02-07 21:59
他のツールについては使ったことがないのでわかりません。


引用:

こちらで確認したところ、時系列機能を無効すると縦軸との隙間がなくなりました。


今更ですが、グラフとY軸との間に隙間ができる理由について補足しておきます。

以下ヘルプより引用
引用:

日付形式のデータをグラフの項目軸 (X 軸) として使用する場合、日付間の間隔を表すのに時系列の項目軸が使用されます。
日付の表示 データ内の日付が任意の順序で並んでいる場合でも、時系列軸では特定の基本単位間隔で日付順に表示されます。
時系列の初期グループ サイズ (日、週、月、四半期、年) は、データの日付範囲に従ってグラフにより設定されます。たとえば、初期グループ サイズが月に設定されている場合、異なる観点から分析するためにグループ サイズを四半期に変更することができます。このようにすると、グラフは自動的に各グループのデータ要素を合計し、グループにつき 1 つのデータ要素をプロットできます。


つまり、
//string category= "10:10,11:11,12:12,13:13,14:14,15:15";
を指定すると、X軸の目盛上に時刻と値がプロットされるため、グラフがY軸に接しますが、
コード:
 Y軸
  |
  *
  |      *
  |
  |-------------X軸
  |      |
10:10  11:11


string category = "4/1,4/2,4/3,4/4,4/5,4/6;
を指定した場合は時系列軸が適用され、間隔を表すためにX軸の目盛の中間点にプロットされます。
コード:
 Y軸
  |
  |   *
  |          *
  |
  |----------------- X軸
  |      |       |
     4/1    4/2

snow
常連さん
会議室デビュー日: 2008/02/05
投稿数: 26
投稿日時: 2008-02-12 20:18
Office Web Components(OWC)の使用をあきらめて、「ZedGraph」というものを
使ってみました。ZedGraphでは秒単位まで、時系列に表示することができました。
使い方もデモがありましたので、わかりやすかったです。
しかし、デモにないことをやろうとすると、説明が英語しか見つけられなかったので、
時間がかかりました。
ZedGraphも時系列で表示すると、グラフ領域一杯には表示できない様です。
どうしても、縦軸とプロットの間に隙間ができてしまいます。
ざんねんです。
未記入
会議室デビュー日: 2009/04/10
投稿数: 1
投稿日時: 2009-04-10 12:59
諦めておられた…縦軸とデータの間にできる隙間は、

GraphPane.XAxis.Scale.MinGrace = 0.0
GraphPane.XAxis.Scale.MaxGrace = 0.0

で限りなくゼロになりますよ。

スキルアップ/キャリアアップ(JOB@IT)