使用 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);
}

结果:

当然,找到 IntervalIntervalOffsetMinimumMaximum 的正确值完全取决于您..

更新: 如果你想要一整套缩短的 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;后我们得到这个结果: