自定义图表元素
Custom chart elements
我想在 C# 中使用自定义元素制作图表。我有:
我想要的:
红圈标记的元素需要用图片替换。我的程序代码很短,只是图表的一些值。图表的所有设置均由图表部分的 "Collection" 设置(如第一张图片所示)。
这是一个 BoxPlot 图表,需要 6 个 y 值。
您可以添加它们或让图表计算它们。
您似乎想将多张图像添加到各种 y 值..
这里有一个例子,说明如何通过所有者绘制图表来做到这一点。 (不,不是整个图表,只是一些额外的自定义绘图;-)
它将图像添加到 每个 的 y 值;只适应您真正想要的那些值应该很容易。如果你只想要一个,你甚至可以取消 ImageList
并从资源中选择图像; (尽管使用 ImageList
是一种不错的方式,只要您能忍受 256x256 最大尺寸的限制并且所有图像具有相同的尺寸和颜色深度..)
您似乎只想要其中之一:
4 Average and mean
5 Median
private void chart_PostPaint(object sender, ChartPaintEventArgs e)
{
Series s1 = chart.Series[0];
ChartArea ca = chart.ChartAreas[0];
Axis ax = ca.AxisX;
Axis ay = ca.AxisY;
Graphics g = e.ChartGraphics.Graphics;
int iw = imageList1.ImageSize.Width / 2;
int ih = imageList1.ImageSize.Height / 2;
foreach (DataPoint dp in s1.Points)
{
int x = (int) ax.ValueToPixelPosition(dp.XValue);
for (int i = 0; i < 6; i++)
{
int y = (int) ay.ValueToPixelPosition(dp.YValues[i]);
g.DrawImage(imageList1.Images[i], x - iw, y - ih);
}
}
}
我建议使用 png
具有透明度和奇数宽度的文件,这样它们看起来不错并且居中。 (我随机使用了 16x16,这不是很好 ;-) - 为此你需要设置 ImageSize
和 ImageList
的 ColorDepth
。
要进一步设计图表样式,您可以使用这些特殊属性
Custom attributes
BoxPlotPercentile, BoxPlotSeries, BoxPlotShowAverage,
BoxPlotShowMedian, BoxPlotShowUnusualValues, BoxPlotWhiskerPercentile,
DrawSideBySide, MaxPixelPointWidth, MinPixelPointWidth,
PixelPointDepth, PixelPointGapDepth, PixelPointWidth, PointWidth
注意需要全部设置为字符串,可能是这样:
s1.SetCustomProperty("someAttribute", "someValue");
我想在 C# 中使用自定义元素制作图表。我有:
我想要的:
红圈标记的元素需要用图片替换。我的程序代码很短,只是图表的一些值。图表的所有设置均由图表部分的 "Collection" 设置(如第一张图片所示)。
这是一个 BoxPlot 图表,需要 6 个 y 值。
您可以添加它们或让图表计算它们。
您似乎想将多张图像添加到各种 y 值..
这里有一个例子,说明如何通过所有者绘制图表来做到这一点。 (不,不是整个图表,只是一些额外的自定义绘图;-)
它将图像添加到 每个 的 y 值;只适应您真正想要的那些值应该很容易。如果你只想要一个,你甚至可以取消 ImageList
并从资源中选择图像; (尽管使用 ImageList
是一种不错的方式,只要您能忍受 256x256 最大尺寸的限制并且所有图像具有相同的尺寸和颜色深度..)
您似乎只想要其中之一:
4 Average and mean
5 Median
private void chart_PostPaint(object sender, ChartPaintEventArgs e)
{
Series s1 = chart.Series[0];
ChartArea ca = chart.ChartAreas[0];
Axis ax = ca.AxisX;
Axis ay = ca.AxisY;
Graphics g = e.ChartGraphics.Graphics;
int iw = imageList1.ImageSize.Width / 2;
int ih = imageList1.ImageSize.Height / 2;
foreach (DataPoint dp in s1.Points)
{
int x = (int) ax.ValueToPixelPosition(dp.XValue);
for (int i = 0; i < 6; i++)
{
int y = (int) ay.ValueToPixelPosition(dp.YValues[i]);
g.DrawImage(imageList1.Images[i], x - iw, y - ih);
}
}
}
我建议使用 png
具有透明度和奇数宽度的文件,这样它们看起来不错并且居中。 (我随机使用了 16x16,这不是很好 ;-) - 为此你需要设置 ImageSize
和 ImageList
的 ColorDepth
。
要进一步设计图表样式,您可以使用这些特殊属性
Custom attributes
BoxPlotPercentile, BoxPlotSeries, BoxPlotShowAverage, BoxPlotShowMedian, BoxPlotShowUnusualValues, BoxPlotWhiskerPercentile, DrawSideBySide, MaxPixelPointWidth, MinPixelPointWidth, PixelPointDepth, PixelPointGapDepth, PixelPointWidth, PointWidth
注意需要全部设置为字符串,可能是这样:
s1.SetCustomProperty("someAttribute", "someValue");