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

Диаграмма: показать больше описаний значений по оси 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) для "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

В пятой последней строке я прокомментировал IsXValueIndexed=True потому что, когда я его активировал, диаграмма генерировалась с большим красным крестиком ошибок.


РЕШЕНИЕ

Установка интервала на оси X делает свое дело!

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

Решение от Skippy

4b9b3361

Ответ 1

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

Установив свой интервал:

myStripLine1.IntervalOffset = 4

Вы гарантируете, что ваши значения по оси X будут отображаться только на частоте 4 "общих значений оси x":

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

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 должен быть более низкой величиной интервала, чем интервал (т.е. интервальные дни/интервалOffset Hour, интервал Years/IntervalOffset Months и т.д.).

Я добавил эти источники:

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

Флориан, можете ли вы показать код для меток, свойств и т.д. оси x? - yvytty вчера

Вы когда-нибудь рассматривали компоненты компоновки сторонних разработчиков, такие как ZedGraph? Скорее всего, такие небольшие оговорки уже покрыты там. Дать ему шанс! - вчера неолиск

В ответ на ZedGraph я посоветовал:

И: После просмотра кода

Привет, я могу уточнить, ХОТИТЕ, чтобы ежедневно составлять значения? Я думаю, что у меня есть ваше решение, просто нужно уточнить, у вас есть все инструменты в vb.net

@yvytty, нет, даты не обязательно должны быть ежедневно, также не может быть никакой ценности в течение длительного времени, и я не хочу большого диапазона в моей диаграмме, где нет данных. Фактически, я мог бы также написать некоторый образец текста по значениям оси X, даты только путают. Основная проблема заключается в том, что диаграмма VB каким-то образом вычисляет очень большой запас по этим описаниям на оси X

Он не показывает, что вы отформатировали строку даты и даты. Также необходимо учитывать, что вы не используете формат даты в США (я в Австралии, поэтому мы имеем тот же формат, что и вы). Тип даты по умолчанию - en-US.

Обратитесь к DateTime.ParseExact Method

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

Ответ 2

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