【发布时间】:2013-05-18 12:29:35
【问题描述】:
我正在向用户展示一个图表,它有一个带有折线图的图表区域。例如,在这一点上,我得到了一条线。这条线有大约 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)
在每个日期,都会为所有系列输入一个新点,但只有那些具有重要价值的点才会突出显示。之间的这些值是通过数学计算得出的。
一个例子来解释这一点:我有两个系列,一个在点 "01.01.2013" 和 "03.01.2013" 上有两个值(6 和 4)。另一个系列在"01.01.2013"、"02.01.2013" 和"03.01.2013" 上有3 个值(4、6、5.5)。当我只显示它们时,第一个系列将在第二个日期结束,即使第三个日期有一个值。我通过在第一个系列中用日期"02.01.2013" 填充一个虚拟值来解决这个问题,这只是此时的平均值(=5)。这一点根本不会用标记项目符号突出显示。这就是我绘制图表的方式。
EDIT2:
Skippy's 回答和评论后,我的新试用。变量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的解决方案
【问题讨论】:
-
您是否考虑过 3rd 方绘图组件,例如 ZedGraph?很可能这些小警告已经包含在那里。试一试!
-
@yvytty,我已经用我的代码编辑了我的答案。
-
@Neolisk,我还没有尝试,因为我实际上只使用基本的VB并且我尝试不使用库,但是如果它们不超重,我会尽快看看; )
-
@yvytty,不,日期不必是每天,也可能长时间没有价值,我不希望图表中有大跨度没有数据。实际上,我也可以在 X 轴值处写一些示例文本,日期只是令人困惑。主要问题是 VB 图表以某种方式在 X 轴上的这些描述上计算了一个非常大的边距。
-
@yvytty 取决于你的回答是否真的回答了我公认的复杂问题;)
标签: vb.net for-loop multidimensional-array charts axis-labels