使用 mschart C# 绘制极坐标图
Polar Plot with mschart C#
我目前正在处理一个项目,我需要在其中使用动态生成的数据创建极坐标图。我已经设法创建了一个有点像样的极地图,但无法创建所需的内容。
This is my Polar Plot
这是我用来设置中间偏移量的代码:
public Form1()
{
InitializeComponent();
chart1.ChartAreas[0].AxisX.MajorTickMark.Enabled = false;
chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
chart1.ChartAreas[0].AxisY.Minimum = -20;
chart1.ChartAreas[0].AxisY.MajorGrid.IntervalOffset = 15;
chart1.ChartAreas[0].AxisY.MajorGrid.Interval = 5;
chart1.ChartAreas[0].AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Solid;
chart1.ChartAreas[0].AxisX.MajorGrid.LineDashStyle = ChartDashStyle.Solid;
}
我在这里找到了一些帮助:How to displace the origin of the Y axis on a polar Mschart?
我有一个关于如何尝试获得极地的例子:
The finished example
我不认为你可以让轴从任何地方开始,但它的最小值。
(链接的 post 只会使标签从不同的值开始。)
所以我们必须帮忙画一点主人图。
一些简短的参考:
var ca = chart1.ChartAreas[0];
var ax = ca.AxisX;
var ay = ca.AxisY;
现在让我们隐藏 y 轴:
ay.LineWidth = 0;
要绘制从间隔偏移量到最大值的轴部分,我们只需对 PostPaint
事件进行编码:
private void chart1_PostPaint(object sender, ChartPaintEventArgs e)
{
// add references..
..
// then use values to calulate pixel coordinates..
int py1 = (int)ay.ValueToPixelPosition(ay.Minimum + ay.IntervalOffset);
int py2 = (int)ay.ValueToPixelPosition(ay.Maximum);
int px = (int)ax.ValueToPixelPosition(ax.Maximum - ax.Minimum);
// blue to make it stand out
e.ChartGraphics.Graphics.DrawLine(Pens.Blue, px, py1, px, py2);
}
结果:
当然,找到 Interval
、IntervalOffset
、Minimum
和 Maximum
的正确值完全取决于您..
更新: 如果你想要一整套缩短的 x 轴网格线,你可以做很多数学运算或使用图形转换。像往常一样,后者要容易得多..:[=22=]
Graphics g = e.ChartGraphics.Graphics;
int pyc = (int)ay.ValueToPixelPosition(ay.Minimum); // y-center
for (int i = 0; i < 360 / ax.Interval; i++)
{
g.TranslateTransform(px, pyc);
g.RotateTransform((float)(i * ax.Interval));
g.TranslateTransform(-px, -pyc);
g.DrawLine(Pens.colorOfYourChoice, px, py1, px, py2);
g.ResetTransform();
}
设置ax.Interval = 30;
后我们得到这个结果:
我目前正在处理一个项目,我需要在其中使用动态生成的数据创建极坐标图。我已经设法创建了一个有点像样的极地图,但无法创建所需的内容。 This is my Polar Plot
这是我用来设置中间偏移量的代码:
public Form1()
{
InitializeComponent();
chart1.ChartAreas[0].AxisX.MajorTickMark.Enabled = false;
chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false;
chart1.ChartAreas[0].AxisY.Minimum = -20;
chart1.ChartAreas[0].AxisY.MajorGrid.IntervalOffset = 15;
chart1.ChartAreas[0].AxisY.MajorGrid.Interval = 5;
chart1.ChartAreas[0].AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Solid;
chart1.ChartAreas[0].AxisX.MajorGrid.LineDashStyle = ChartDashStyle.Solid;
}
我在这里找到了一些帮助:How to displace the origin of the Y axis on a polar Mschart?
我有一个关于如何尝试获得极地的例子: The finished example
我不认为你可以让轴从任何地方开始,但它的最小值。
(链接的 post 只会使标签从不同的值开始。)
所以我们必须帮忙画一点主人图。
一些简短的参考:
var ca = chart1.ChartAreas[0];
var ax = ca.AxisX;
var ay = ca.AxisY;
现在让我们隐藏 y 轴:
ay.LineWidth = 0;
要绘制从间隔偏移量到最大值的轴部分,我们只需对 PostPaint
事件进行编码:
private void chart1_PostPaint(object sender, ChartPaintEventArgs e)
{
// add references..
..
// then use values to calulate pixel coordinates..
int py1 = (int)ay.ValueToPixelPosition(ay.Minimum + ay.IntervalOffset);
int py2 = (int)ay.ValueToPixelPosition(ay.Maximum);
int px = (int)ax.ValueToPixelPosition(ax.Maximum - ax.Minimum);
// blue to make it stand out
e.ChartGraphics.Graphics.DrawLine(Pens.Blue, px, py1, px, py2);
}
结果:
当然,找到 Interval
、IntervalOffset
、Minimum
和 Maximum
的正确值完全取决于您..
更新: 如果你想要一整套缩短的 x 轴网格线,你可以做很多数学运算或使用图形转换。像往常一样,后者要容易得多..:[=22=]
Graphics g = e.ChartGraphics.Graphics;
int pyc = (int)ay.ValueToPixelPosition(ay.Minimum); // y-center
for (int i = 0; i < 360 / ax.Interval; i++)
{
g.TranslateTransform(px, pyc);
g.RotateTransform((float)(i * ax.Interval));
g.TranslateTransform(-px, -pyc);
g.DrawLine(Pens.colorOfYourChoice, px, py1, px, py2);
g.ResetTransform();
}
设置ax.Interval = 30;
后我们得到这个结果: