Диаграмма: показать больше описаний значений на оси X
я показываю диаграмму пользователю, у которого есть одна область диаграммы с линейной диаграммой. На этом я получил, например, одну строчку. Эта строка имеет около 200 значений. Все эти значения имеют описание (например,"01.01.2013"
, "05.02.2013"
и так далее).
когда диаграмма показана, я могу видеть только два описания, даже если будет место для гораздо большего количества описаний. Линия отображается правильно,но есть только две точки, описанные.
я повернул текст вертикально так там больше места, но это не помогло. Если я отображаю меньше значений (5 или 10), описания отображаются правильно.
вот как это на самом деле выглядит (описания на самом деле строки, а не даты).
Спасибо за помощь!
редактировать: Мой Код:
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 месяцев и т. д.).
я добавил Эти источники:
- Для справки
- чтобы показать, что я также провел свое исследование после установления проблемы, как указано в моих комментариях выше.
Флориан, можете вы пльс показать код для ярлыков, свойств ЕТК оси КС? - ивытты вчера
вы когда-нибудь рассматривали 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