Chartについて

タグの編集
投稿者 いっくん  (社会人) 投稿日時 2017/6/14 06:16:31
Chartについて質問があります。

1)ChartAreasプロパティのAxisXプロパティのIsLogarithmicプロパティをTrueに設定して実行すると、「対数スケールはこの軸には使用できません。」のエラーになります。
このエラーを抑制するためには、SuppressExceptionsプロパティをTrueにするといいという記事を見つけたのですが、自分の環境では再現できませんでした。
単純にTrueにするだけでは、ダメなのでしょうか?

2)SeriesプロパティのXValusTypeをDoubleにしました。
そのあと、AddXYメソッドで、Y軸に0、X軸にDouble.MaxValueを指定したところ、「Decimal 型の値が大きすぎるか、または小さすぎます。」という、エラーになりXValusTypeのDoubleが効いていないように思うのですが、使い方が間違っているのでしょうか?

3)そもそも、.NetでChartを使うこと自体、お勧めできないのでしょうか?
そのような記事を見かけたもので・・・

以上、お願いします。

確認環境:Visual Studio 2013、2015
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/6/14 11:16:00
ここでいう Chart クラスとは
System.Windows.Forms.DataVisualization.Charting.Chart 
のことですね。



ひとまず、下記は動作しますか?

Option Strict On
Imports System.Windows.Forms.DataVisualization.Charting
Public Class Form1
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    '1)ChartAreasプロパティのAxisXプロパティのIsLogarithmicプロパティをTrueに設定して実行 
    Dim ca As New ChartArea("DummyArea")
    ca.AxisX.IsLogarithmic = True
    ca.AxisY.IsLogarithmic = False

    Dim sr As New Series("DummySeries")
    sr.ChartType = SeriesChartType.Bar
    sr.ChartArea = ca.Name
    sr.XAxisType = AxisType.Primary
    sr.YAxisType = AxisType.Primary

    '2)SeriesプロパティのXValusTypeをDoubleに 
    sr.XValueType = ChartValueType.Double
    sr.YValueType = ChartValueType.Int32

    'そのあと、AddXYメソッドで、Y軸に0、X軸にDouble.MaxValueを指定 
    sr.Points.AddXY(Double.MaxValue, 0)
    sr.Points.AddXY(7.0E+307, 1)
    sr.Points.AddXY(3.2E+251, 2)
    sr.Points.AddXY(4.7E+192, 3)
    sr.Points.AddXY(6.1E+135, 4)
    sr.Points.AddXY(5.9E+81, 5)
    sr.Points.AddXY(2.9E+45, 6)
    sr.Points.AddXY(1.9E+15, 7)

    Chart1.ChartAreas.Clear()
    Chart1.Series.Clear()

    Chart1.ChartAreas.Add(ca)
    Chart1.Series.Add(sr)
  End Sub
End Class
投稿者 いっくん  (社会人) 投稿日時 2017/6/14 16:00:02
魔界の仮面弁士さん、ありがとうございます。

>ひとまず、下記は動作しますか?
コードをコピー&ペーストすると動きました。

その後、
・AddXYをすべてコメントにした
「グラフ領域の軸 - 対数スケールはこの軸には使用できません。」

・sr.Points.AddXY(Double.MaxValue, 0)のみ
「グラフ領域の軸 - 軸の最小値および最大値が指定されていません。」

・sr.Points.AddXY(7.0E+307, 1)まで、コメント解除
「軸オブジェクト – ポイント値または軸の最小値/最大値が無効であるため、自動間隔エラーが発生しました。」

・sr.Points.AddXY(3.2E+251, 2)まで、コメント解除
「軸オブジェクト – ポイント値または軸の最小値/最大値が無効であるため、自動間隔エラーが発生しました。」

・sr.Points.AddXY(4.7E+192, 3)まで、コメント解除
エラー無く、表示
でした。


すみません、今日はあまり時間が避けなくて内容を細かく解釈するところまで出来ませんが、取り急ぎご返事まで。


確認環境は、VB2015です。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/6/14 17:26:13
> 今日はあまり時間が避けなくて
今日は、自分もあまり割けなくて一部未確認ですが:

> 取り急ぎご返事まで。
SuppressExceptions は True でしょうか、False でしょうか。


> ・AddXYをすべてコメントにした
> 「グラフ領域の軸 - 対数スケールはこの軸には使用できません。」
最低一つ以上の値を割り当てておいてください。

対数なので負数やゼロ値が駄目なのは勿論ですが、そもそも
「0 より大きな値が一つも無い」状態も禁止されていたと思います。


> ・sr.Points.AddXY(Double.MaxValue, 0)のみ
> 「グラフ領域の軸 - 軸の最小値および最大値が指定されていません。」
データが一件だけだからでは無いでしょうか?
しかも、指定するデータが閾値になってしまっていますし。

Minimum および Maximum は、既定で Double.NaN が設定されており、
データが登録されていれば自動判断されるようになっていますが、
今回のようなケースでは、明示的に指定した方が良いかもしれません。
投稿者 いっくん  (社会人) 投稿日時 2017/6/15 21:08:04
魔界の仮面弁士さん、返信が遅くなり申し訳ありません。
会社からは、書き込みができないもので、自宅に帰ってからの返信になってしまいます。

昨日のご質問の回答を含めて、調べたことを返信いたします。

〇対数スケール時、値がないとエラーになる。
・SuppressExceptionsの設定を問わず、エラーになりました。
そういうものだと思えばいいのですが、別のH.P.では可能と書いてあったのが気になります。

〇Points.AddXY(Double.MaxValue, 0)のみの時、「グラフ領域の軸 - 軸の最小値および最大値が指定されていません。」
・これは、SuppressExceptionsで抑制できました。


また、魔界の仮面弁士さんの書き込みに対して質問させてください。

>> ・sr.Points.AddXY(Double.MaxValue, 0)のみ
>> 「グラフ領域の軸 - 軸の最小値および最大値が指定されていません。」

>データが一件だけだからでは無いでしょうか?
>しかも、指定するデータが閾値になってしまっていますし。

データが一件だとダメな理由がわかりませんでした。
また、指定するデータが閾値だとダメな理由もわかりませんでした。

MaximumをDecimal.MaxValueに設定し、sr.Points.AddXY(Double.MaxValue, 0)を実行してもエラーにならなかったので、Chart内部でDecimalで処理している部分があるのかな?と思います。