web-dev-qa-db-ja.com

グラフ:X軸に値の説明をさらに表示

折れ線グラフを含む1つのグラフ領域を持つユーザーにグラフを表示しています。これについては、例えば、1行取得しました。この行には約200の値があります。これらの値にはすべて説明があります(例:_"01.01.2013"_、_"05.02.2013"_など)。

チャートを表示すると、さらに多くの説明用のスペースがある場合でも、2つの説明しか表示されません。線は正しく表示されますが、説明されている点は2つだけです。

テキストを垂直に回転させてスペースを増やしましたが、これは役に立ちませんでした。より少ない値(5または10)を表示すると、説明が正しく表示されます。

これは実際にどのように見えるかです(説明は実際には日付ではなく文字列です)。

The Graph with a lot of values but only two descriptions at the X axis

ご協力ありがとうございました!

[〜#〜]編集[〜#〜]:マイコード:

_chart.ChartAreas(0).AxisY.Maximum = 6
chart.ChartAreas(0).AxisY.Minimum = 1
chart.ChartAreas(0).AxisX.LabelStyle.Angle = -90
chart.Series.Clear()
chart.ChartAreas(0).AxisY.StripLines.Clear()
Dim myStripLine1 as new StripLine()
myStripLine1.IntervalOffset = 4
chart.ChartAreas(0).AxisY.StripLines.add(myStripLine1)

'now adding all series
chart.Series.Add("Chemie") 'just to take the example in the image above
chart.Series(chart.Series.Count - 1).ChartType = DataVisualization.Charting.SeriesChartType.Line
chart.Series(chart.Series.Count - 1).BorderWidth = 4

'now adding quite much values (on every date, every Serie has a value)
 chart.Series(chart.Series.Count - 1).Points.AddXY("01.03.2011", 4.9)
_

毎日、すべてのシリーズに新しいポイントが入力されますが、重要な値を持つポイントのみが強調表示されます。これらの間の値は数学的に計算されます。

これを説明する1つの例:2つのシリーズがあり、1つはポイント_"01.01.2013"_と_"03.01.2013"_に2つの値(6と4)があります。他のシリーズには、_"01.01.2013"_、_"02.01.2013"_および_"03.01.2013"_の3つの値(4、6、5.5)があります。表示するだけでは、3番目の日付の値があったとしても、最初のシリーズは2番目の日付で終了します。これを解決するには、最初のシリーズのダミー値に、この時点での平均(= 5)である日付_"02.01.2013"_を入力します。この点は、マーカーの黒丸で強調表示されません。これは私が私のグラフを描く方法です。

EDIT2:

Skippy's の回答とコメントの後、私の新しいトライアル。変数_MainForm.grades_は、約150のグレードを含むDictionary(Of Integer,Dictionary(Of String, String))です

_    Dim subjects As New Dictionary(Of Integer, ArrayList)
    Dim allgrades As New ArrayList
    For Each grade In MainForm.grades
        Dim cD As New Dictionary(Of String, String)
        cD.Add("SUBJECTID", grade.Value("SUBJECTID"))
        cD.Add("GRADE", grade.Value("GRADE"))
        cD.Add("DATE", grade.Value("DATE"))
        allgrades.Add(cD)
    Next

    cht_main.ChartAreas(0).AxisX.IntervalType = DateTimeIntervalType.Days
    cht_main.ChartAreas(0).AxisX.LabelStyle.Angle = -90
    Dim gradesDateSorter = New gradesDateSorter()
    allgrades.Sort(gradesDateSorter)
    For Each grade In allgrades
        If Not subjects.ContainsKey(Integer.Parse(grade("SUBJECTID"))) Then
            subjects.Add(Integer.Parse(grade("SUBJECTID")), New ArrayList)
        End If
        Dim gradeDict As New Dictionary(Of String, String)
        gradeDict.Add("DATE", grade("DATE"))
        gradeDict.Add("GRADE", grade("GRADE"))
        subjects(Integer.Parse(grade("SUBJECTID"))).Add(gradeDict)
    Next
    For Each subject In subjects
        'adding serie
        cht_main.Series.Add(MainForm.subjects(subject.Key)("NAME"))
        cht_main.Series(cht_main.Series.Count - 1).ChartType = DataVisualization.Charting.SeriesChartType.Line
        cht_main.Series(cht_main.Series.Count - 1).BorderWidth = 4
        'cht_main.Series(cht_main.Series.Count - 1).IsXValueIndexed = True
        For Each grade In subject.Value
            cht_main.Series(cht_main.Series.Count - 1).Points.AddXY(Date.Parse(grade("DATE")), Double.Parse(grade("GRADE")))
        Next
    Next
_

最後の5行目では、_IsXValueIndexed=True_をコメント化しました。アクティブにすると、グラフに大きな赤いエラークロスが表示されるためです。


解決

X軸に間隔を設定するとうまくいきます!

_chart.ChartAreas(0).AxisX.Interval = 1
_

Skippy によるソリューション

15
Florian Müller

はい、マイケルに同意します。この時点で説明に追加することしかできません。

間隔を設定することにより:

myStripLine1.IntervalOffset = 4

X軸の値が4つの「一般的なX軸」値の頻度でのみプロットされることを保証します。

これをvaleに1に設定すると、すべてのx軸の値が整数として(この場合は日数として)増加します。

chart.ChartAreas(0).AxisX.Interval = 1

そして、入力するx軸の値を宣言するには:

DateTimeIntervalType.Days

'Declaration
    Public Sub Add( _
    labelsStep As Double, _
    intervalType As DateTimeIntervalType, _
    format As String _
)
End Sub

chart.ChartAreas(0).AxisX.IntervalType = DateTimeIntervalType.Days

'which as shown in Michael's answer is parsed to string.

Dim format as String = "MM.dd.yyyy"
Dim actualDate as Date = Date.ParseExact(yourDate, format)

マイケルのコメントで述べたように。設定することにより

mySeries.XValueIndexed = True

インデックス付きのすべてのX軸値がプロットされます。

次の引用で説明されているように、リンクが提供されています。

系列の各データポイントには、プロットエリアでの位置を決定するX値とY値があります。一部のグラフでは、ポイントのX値は重要ではなく、指定する必要はありません。この場合、プロットエリアのポイント位置は、それらのポイントインデックス(つまり、Pointsコレクション内の位置)とY値によってのみ決定されます。

X値に「インデックスが付けられている」場合、ポイントのX値ではなく、データポイントインデックスを使用して、カテゴリ(X)軸に沿ったポイントの位置が決定されます。以下の図1の例では、同じデータを表示する2つのグラフが示されています。ただし、最初のグラフはインデックスのないX値を使用するため、これらのポイントのX値は、x軸に沿った位置を決定します。 2番目のチャートにはインデックスが付けられているため、そのポイントインデックスは、x軸に沿ったそれらの位置を決定するために使用されます。この場合、X値は軸ラベルにのみ使用され、それ以上は使用されません。

http://support2.dundas.com/onlinedocumentation/winchart2005/Data_IndexedXValues.html

次のサイトで、間隔と間隔オフセットに関する私の元の情報を入手しました。

http://support2.dundas.com/Default.aspx?article=705

ここでは、データ型について説明し、強調表示された値の問題に対処します。

すべての日付で、すべてのシリーズに新しいポイントが入力されますが、重要な値を持つポイントのみが強調表示されます

たとえば、週末を強調するために繰り返し発生するStripLineを作成するとします。間隔を7に、タイプを日に設定します。最初のポイントは日曜日なので、IntervalOffsetを6(6番目の曜日を意味する)に設定し、そのタイプをDaysに設定します。結果のグラフには、最初のStripLineは表示されません。

間隔を設定するための説明です。

チャートのIntervalおよびIntervalOffsetプロパティを使用する際に従うべき良い経験則は、IntervalOffsetがIntervalよりも小さい間隔の大きさであることです(つまり、Interval Days/IntervalOffset Hours、Interval Years/IntervalOffset Monthsなど)。

これらのソースを追加しました:

  1. ご参考に
  2. また、上記のコメントで述べたように、問題を確認してから調査を行ったことを示します。

フロリアン、あなたはplsにx軸のラベル、プロパティなどのコードを示すことができますか? –昨日yvytty

ZedGraphなどのサードパーティ製のプロットコンポーネントを検討したことがありますか?ほとんどの場合、そのような小さな注意事項はすでにカバーされています。試してみます! –昨日のネオリスク

アドバイスしたZedGraphへの応答:

そして:コードを見た後

こんにちは私は明確にすることができます、あなたは毎日値をプロットしたいですか?私はあなたの解決策を持っていると思います、説明が必要ですvb.net内にすべてのツールがあります

@yvytty、いや、日付は毎日である必要はありません。また、長期間にわたって値が存在しない可能性もあり、データがない場所でチャートに大きなスパンを入れたくありません。実際、X軸の値にサンプルテキストを書き込むこともできますが、日付はわかりにくいだけです。主な問題は、VBチャートが、X軸でこれらの説明に非常に大きなマージンを計算することです。

日付と日付の文字列がフォーマットされていることは表示されません。 en-US日付形式を使用していないことも考慮に入れる必要があります(私はオーストラリアにいるため、同じ形式を使用しています)。デフォルトの日付タイプはen-USです。

DateTime.ParseExactメソッドを参照してください

http://msdn.Microsoft.com/en-us/library/system.datetime.parseexact.aspx

MSDNからスニペットを取得しました。

 Dim dateString, format As String   
 Dim result As Date 
 Dim provider As CultureInfo = CultureInfo.InvariantCulture

 Parse date and time with custom specifier.
 dateString = "Sun 15 Jun 2008 8:30 AM -06:00"
 format = "ddd dd MMM yyyy h:mm tt zzz"         
 result = Date.ParseExact(dateString, format, provider)

リンクを参照してください: http://msdn.Microsoft.com/en-us/library/w2sa9yss.aspx

DateTime.ToString(IFormatProvider)メソッドは、特定のカルチャの短い日付と長い時刻のパターンを使用して、日付と時刻の値の文字列表現を返します。次の例では、DateTime.ToString(IFormatProvider)メソッドを使用して、fr-FRカルチャの短い日付と長い時刻のパターンで日付と時刻を表示します。

Dim date1 As Date = #3/1/2008 7:00AM#
Console.WriteLine(date1.ToString(System.Globalization.CultureInfo.CreateSpecificCulture("fr-FR")))
' Displays 01/03/2008 07:00:00

このリンクを参照してください: http://msdn.Microsoft.com/en-us/library/system.datetime.aspx

したがって、次のようになります。

'note
Imports System.Globalization

Dim format as String = "dd.MM.yyyy"
Dim actualDate as Date = Date.ParseExact(yourDate, format, provider)

chart.ChartAreas(0).AxisX.LabelStyle.Format ="dd.MM.yyyy"

cht_main.ChartAreas(0).AxisX.IntervalType = DateTimeIntervalType.Days

cht_main.ChartAreas(0).AxisX.Interval = 1

また:

Double.Parse(grade("GRADE")
'grade is not of type double
20
Yvette Colomb

文字列の日付表現をグラフに追加する前に、実際の日時オブジェクトに変換する必要があると思います。私はそれをテストしませんでしたが、次のようなものです(ここでyourDateは、チャートに渡すために使用した文字列です)

Dim format as String = "MM.dd.yyyy"
Dim actualDate as Date = Date.ParseExact(yourDate, format)
chart.Series(chart.Series.Count - 1).Points.AddXY(actualDate, 4.9)

チャートは文字列の代わりに日時オブジェクトを管理でき、日付を処理する特別なコードがあります。これを行うと、フォーマットによって表示方法を調整できます。

chart.ChartAreas(0).AxisX.LabelStyle.Format ="MM.dd.yyyy"
chart.ChartAreas(0).AxisX.Interval = 1
chart.ChartAreas(0).AxisX.IntervalType = DateTimeIntervalType.Days

1日おきにのみ表示する場合は、間隔を2に変更します。

4
Michael