有没有办法在极坐标图上画一个点
Is there a way to draw a Point on a Polar Chart
我想在环和分段线之间的每个 "crossing" 上添加一个彩色点(红色或绿色)。有没有比制作只有两个数据点的 240 系列更简单的方法?
1 - 无需创建不同的 Series
。只需在您想要的位置添加您想要的DataPoints
!这是最简单的方法,因为您已经知道这些值。
2 - 作为替代方案,您可以使用 xxxPaint
事件并绘制实心圆圈(或任何您喜欢的...)。为此,您需要将值转换为像素。这可以通常 通过AxisX/AxisY.ValueToPixelPosition
方法实现。 但是 对于 Polar Charts
这将不起作用。相反,您需要自己计算像素坐标。.
第二种方法有点难,但当然可以让您更好地控制绘制点的样式..
这是添加DataPoints
的结果:
第一个版本的示例代码;首先我们设置一个极坐标图及其坐标轴属性:
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!
使用 link 和这个 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);
}
}
我们可以用圆圈装饰每个点:
或者当然,如果您不想首先添加 DataPoints
,您可以通过计算值来替换它们,就像我在添加它们的循环中所做的那样..
我想在环和分段线之间的每个 "crossing" 上添加一个彩色点(红色或绿色)。有没有比制作只有两个数据点的 240 系列更简单的方法?
1 - 无需创建不同的 Series
。只需在您想要的位置添加您想要的DataPoints
!这是最简单的方法,因为您已经知道这些值。
2 - 作为替代方案,您可以使用 xxxPaint
事件并绘制实心圆圈(或任何您喜欢的...)。为此,您需要将值转换为像素。这可以通常 通过AxisX/AxisY.ValueToPixelPosition
方法实现。 但是 对于 Polar Charts
这将不起作用。相反,您需要自己计算像素坐标。.
第二种方法有点难,但当然可以让您更好地控制绘制点的样式..
这是添加DataPoints
的结果:
第一个版本的示例代码;首先我们设置一个极坐标图及其坐标轴属性:
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!
使用 link 和这个 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);
}
}
我们可以用圆圈装饰每个点:
或者当然,如果您不想首先添加 DataPoints
,您可以通过计算值来替换它们,就像我在添加它们的循环中所做的那样..