15

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

チャートが表示されると、さらに多くの説明を表示するスペースがあるにもかかわらず、2 つの説明しか表示されません。線は正しく表示されますが、2 つのポイントしか記述されていません。

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

これは実際にどのように見えるかです (記述は実際には文字列であり、日付ではありません)。

多くの値が含まれているが、X 軸の説明が 2 つしかないグラフ

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

編集:私のコード:

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"とに 2 つの値 (6 と 4) があり"03.01.2013"ます。"01.01.2013"他の系列には、とに 3 つの値 (4,6,5.5) が"02.01.2013"あり"03.01.2013"ます。それらを表示すると、3 番目の日付の値があったとしても、最初のシリーズは 2 番目の日付で終了します。最初のシリーズのダミー値を日付で埋めることでこれを解決しましたが、"02.01.2013"これはこの時点での平均 (=5) です。このポイントは、マーカーの箇条書きで強調表示されません。これが私のグラフの描き方です。

EDIT2:

Skippyの回答とコメントの後、私の新しい試み。変数MainForm.gradesは、Dictionary(Of Integer,Dictionary(Of String, String))約 150 の成績を含む

    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によるソリューション

4

2 に答える 2

19

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

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

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 に設定し、そのタイプを Days に設定します。最初のポイントは日曜日なので、IntervalOffset を 6 (週の 6 日目) に設定し、そのタイプを Days に設定します。結果のチャートには、最初の StripLine が表示されません。

間隔の設定について説明します。

Chart の Interval および IntervalOffset プロパティを使用する場合に従うべき経験則として、IntervalOffset は Interval よりも小さい間隔の大きさにする必要があります (つまり、Interval Days / IntervalOffset Hours、Interval Years / IntervalOffset Months など)。

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

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

フロリアン、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
于 2013-05-29T06:39:02.450 に答える