在 mschart 中的某些数据点显示 x 轴标签
Display x-axis label at certain data-points in mschart
我正在尝试绘制一条正态分布曲线(作为 SeriesChartType.Spline),该曲线上有一个选定的项目位置。我的 x 轴有点乱,所以我想整理一下,但我想不出在特定位置显示轴标签的方法。
我想在曲线上显示 {x(0), x(mean), x(n)} 处的值以及所选项目的数据点的 x 轴值。
我试过
.ChartAreas(0).AxisX.Interval
但我不一定有标准的区间范围。
有没有办法只在指定的数据点显示 x 轴标签?
[编辑]:
按照建议,我为此图表实现了几个自定义标签。它们并不完全是我所说的直观使用,但它们最终完成了工作。
'//create x-axis labels
mu = Math.Round(mu, 2, MidpointRounding.AwayFromZero)
bci = Math.Round(CDbl(bci), 2, MidpointRounding.AwayFromZero)
Dim muLabel = String.Format("{0}({1})", "µ", mu)
'//Fit axis
With .ChartAreas(0)
With .AxisX
.MajorGrid.LineWidth = 0
.MajorTickMark.Enabled = false
.Minimum = 0
With .CustomLabels
.Add(New CustomLabel(0, 0.4, 0, 0, LabelMarkStyle.LineSideMark)) '//origin label
.Add(New CustomLabel(mu-10, mu + 10, muLabel, 0, LabelMarkStyle.LineSideMark)) '//mean label)
.Add(New CustomLabel(bci-10, bci + 10, bci.ToString, 0, LabelMarkStyle.LineSideMark)) '//index label
End With
With .LabelStyle
.Format = "{0.00}"
.Font = New Font("Microsoft Sans Serif", 8)
End With
...
我为标签选择的范围有点随意。我的数据分布不会立即发生太大变化,因此我选择了一个看起来与字体合理的范围,以便标签位于中心。现在看起来更具可读性:http://i.imgur.com/7buwdyk.png
您应该可以使用 custom labels (example here), but might need to do some extra fiddling to hide the normal labels (example here).
您可以选择其中一个
用CustomLabels
替换普通标签。它们有点棘手,因为您无法设置它们的位置。相反,您需要 两个 位置(FromPosition
和 ToPosition
)来声明 CustomLabel
应居中的范围。请注意,一旦您使用 CustomLabels
,正常的将不会显示 。
或者您可以添加TextAnnotations
。您可以将 AnchorX
设置为您想要的值,并将 Y
位置设置为您的 y 值的最小值。获得这些权利也有点棘手,涉及 Annotation
的轴以及应该为假的 IsSizeAlwaysRelative
。
或者您可以使用 [=24= 编码 Pre
- 或 PostPaint
事件和 Graphics.DrawString
或 TextRenderer.DrawText
] axes函数获取坐标。这实际上可能是最容易做到的..
我正在尝试绘制一条正态分布曲线(作为 SeriesChartType.Spline),该曲线上有一个选定的项目位置。我的 x 轴有点乱,所以我想整理一下,但我想不出在特定位置显示轴标签的方法。
我想在曲线上显示 {x(0), x(mean), x(n)} 处的值以及所选项目的数据点的 x 轴值。
我试过
.ChartAreas(0).AxisX.Interval
但我不一定有标准的区间范围。
有没有办法只在指定的数据点显示 x 轴标签?
[编辑]:
按照建议,我为此图表实现了几个自定义标签。它们并不完全是我所说的直观使用,但它们最终完成了工作。
'//create x-axis labels
mu = Math.Round(mu, 2, MidpointRounding.AwayFromZero)
bci = Math.Round(CDbl(bci), 2, MidpointRounding.AwayFromZero)
Dim muLabel = String.Format("{0}({1})", "µ", mu)
'//Fit axis
With .ChartAreas(0)
With .AxisX
.MajorGrid.LineWidth = 0
.MajorTickMark.Enabled = false
.Minimum = 0
With .CustomLabels
.Add(New CustomLabel(0, 0.4, 0, 0, LabelMarkStyle.LineSideMark)) '//origin label
.Add(New CustomLabel(mu-10, mu + 10, muLabel, 0, LabelMarkStyle.LineSideMark)) '//mean label)
.Add(New CustomLabel(bci-10, bci + 10, bci.ToString, 0, LabelMarkStyle.LineSideMark)) '//index label
End With
With .LabelStyle
.Format = "{0.00}"
.Font = New Font("Microsoft Sans Serif", 8)
End With
...
我为标签选择的范围有点随意。我的数据分布不会立即发生太大变化,因此我选择了一个看起来与字体合理的范围,以便标签位于中心。现在看起来更具可读性:http://i.imgur.com/7buwdyk.png
您应该可以使用 custom labels (example here), but might need to do some extra fiddling to hide the normal labels (example here).
您可以选择其中一个
用
CustomLabels
替换普通标签。它们有点棘手,因为您无法设置它们的位置。相反,您需要 两个 位置(FromPosition
和ToPosition
)来声明CustomLabel
应居中的范围。请注意,一旦您使用CustomLabels
,正常的将不会显示 。或者您可以添加
TextAnnotations
。您可以将AnchorX
设置为您想要的值,并将Y
位置设置为您的 y 值的最小值。获得这些权利也有点棘手,涉及Annotation
的轴以及应该为假的IsSizeAlwaysRelative
。或者您可以使用 [=24= 编码
Pre
- 或PostPaint
事件和Graphics.DrawString
或TextRenderer.DrawText
] axes函数获取坐标。这实际上可能是最容易做到的..