Диаграмма: показать больше описаний значений на оси X

я показываю диаграмму пользователю, у которого есть одна область диаграммы с линейной диаграммой. На этом я получил, например, одну строчку. Эта строка имеет около 200 значений. Все эти значения имеют описание (например,"01.01.2013", "05.02.2013" и так далее).

когда диаграмма показана, я могу видеть только два описания, даже если будет место для гораздо большего количества описаний. Линия отображается правильно,но есть только две точки, описанные.

я повернул текст вертикально так там больше места, но это не помогло. Если я отображаю меньше значений (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)

на каждую дату вводится новая точка для всех рядов, но только те точки, где они имеют важные значения, получают выделенный. Эти значения рассчитываются математически.

один пример, чтобы объяснить это: я получил две серии, Один имеет два значения (6 и 4) на точке "01.01.2013" и "03.01.2013". Другой ряд имеет 3 значения (4,6,5.5) on "01.01.2013","02.01.2013" и "03.01.2013". Когда я просто показываю их, первая серия заканчивается на второй дате, даже если было значение для третьей даты. Я решил это, заполнив фиктивное значение в первой серии датой "02.01.2013" который является только средним в этом точка (=5). Эта точка просто не подсвечивается маркером. Вот как я рисую свой график.

EDIT2:

после Скиппи это ответ и комментарий, мое новое судебное разбирательство. Переменная 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

решение Скиппи

2 ответов


Да я согласен с Майклом. Я могу только добавить к этому объяснению.

, установив интервал:

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 точек не имеет значения и не должно быть предоставлено. В этом случае точка позиционируется в область построения определяется только их индексом точек (т. е. их местоположением в коллекции точек) и их значениями Y.

когда значения X "индексируются", индекс точки данных, а не значение x точки, используется для определения положения точек вдоль категориальной оси (X). Например, на рисунке 1 ниже показаны две диаграммы, отображающие одни и те же данные. Однако на первой диаграмме используются неиндексированные значения X, поэтому значения X этих точек определяют их расположение вдоль X-оси. Второй график индексируется, поэтому ее показатели используются для определения их положения вдоль оси X. В этом случае значения X используются только для меток оси и ничего более.

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

я получил свою исходную информацию о интервалах и смещениях интервалов в следующем сайт:

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

здесь он обсуждает тип данных и решает вашу проблему выделенных значений.

на каждую дату вводится новая точка для всех рядов, но выделяются только те точки, где они имеют важные значения

например, предположим, что вы хотите создать повторную полоску, чтобы выделить выходные дни. Вы устанавливаете интервал в 7 и его тип в Дни. Поскольку первая точка-воскресенье, вы устанавливаете IntervalOffset в 6 (то есть 6-й день недели) и его тип в Days. Полученная диаграмма не показывает первую полоску.

это объяснение для установки интервала.

хорошим эмпирическим правилом при использовании свойств Interval и IntervalOffset диаграммы является то, что IntervalOffset должен быть меньшей величиной интервала, чем интервал (т. е. Интервал Дней / IntervalOffset часов, интервал, лет / IntervalOffset месяцев и т. д.).

я добавил Эти источники:

  1. Для справки
  2. чтобы показать, что я также провел свое исследование после установления проблемы, как указано в моих комментариях выше.

Флориан, можете вы пльс показать код для ярлыков, свойств ЕТК оси КС? - ивытты вчера

вы когда-нибудь рассматривали 3rd party построение компонентов, таких как ZedGraph ? Скорее всего, такие маленькие предостережения уже есть. Попробуй! – Вчера Neolisk

в ответ на 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

Я думаю, что вы должны преобразовать представление даты строки в фактический объект datetime перед добавлением его в диаграмму. Я не тестировал его, но что-то вроде этого: (где 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)

диаграмма может управлять объектом datetime вместо строк и имеет специальный код, который имеет дело с датами. Если вы это сделаете, вы можете настроить, как он отображается при форматировании:

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

Если вы хотите отображать только каждый другой день измените интервал на 2