有没有办法在极坐标图上绘制一个点

时间:2016-08-21 14:15:41

标签: c# charts diagram

我想在环和段线之间的每个“交叉点”上添加一个彩色点(红色或绿色)。有没有比制作只有两个数据点的240系列更简单的方法?

The chart i want the points added to

1 个答案:

答案 0 :(得分:1)

1 - 无需创建不同的Series。只需在您想要的位置添加您想要的DataPoints!这是最简单的方法,因为您已经知道了这些值。

2 - 作为替代方案,您可以使用xxxPaint事件并绘制实心圆圈(或您喜欢的任何内容......)。为此,您需要将值转换为像素。使用AxisX/AxisY.ValueToPixelPosition方法可以通常然而 Polar Charts这不起作用。相反,你需要自己计算像素坐标..

第二种方式有点难,但当然会让你更好地控制你画的点的风格..

以下是添加DataPoints

的结果

enter image description here

第一版的示例代码;首先,我们设置一个带有轴属性的极坐标图:

Chart chart = chart2;
chart.Series.Clear();

ChartArea ca = chart.ChartAreas[0];
Axis ax = ca.AxisX;
Axis ay = ca.AxisY;

ax.Minimum  = 0;
ax.Maximum  = 360;
ax.Interval = 15;   // 15° interval
ax.Crossing = 0;    // start the segments at the top!

ay.Minimum  = 0;
ay.Maximum  = 10;
ay.Interval = 1;


Series s0 = chart.Series.Add("points");
s0.MarkerStyle = MarkerStyle.Circle;   
s0.SetCustomProperty("PolarDrawingStyle", "Marker");
s0.MarkerSize = 6; 
s0.MarkerColor = Color.Teal;
s0.ChartType = SeriesChartType.Polar;

然后我们在交叉点添加点,最后设置其中一个点以表明它们都可以不同......:

for (double vx = ax.Minimum; vx < ax.Maximum; vx += ax.Interval)
    for (double vy = ay.Minimum; vy <= ay.Maximum; vy += ay.Interval)
        s0.Points.AddXY(vx, vy);

s0.Points[333].MarkerColor = Color.Red;
s0.Points[333].MarkerSize = 12;

用于计算像素坐标see this post!

的代码

使用链接中的函数和此PrePaint事件:

private void chart2_PrePaint(object sender, ChartPaintEventArgs e)
{
    Chart chart = chart2;
    ChartArea ca = chart.ChartAreas[0];
    Series s0 = chart.Series["points"];

    foreach (DataPoint dp in s0.Points)
    {
        PointF pt = PolarValueToPixelPosition(dp, chart, ca);
        e.ChartGraphics.Graphics.DrawEllipse(Pens.OrangeRed, pt.X - 5, pt.Y - 5, 9, 9);
    }
}

我们可以用圆圈装饰每个点:

enter image description here

当然,如果您不想首先添加DataPoints,可以通过计算我在添加它们的循环中所做的值来替换它们。