极坐标图与mschart C#

时间:2018-05-07 11:57:40

标签: c# charts mschart

我目前正在开展一个项目,我需要在其中创建一个动态生成数据的Polar Plot。我已经设法创造了一个有点像样的极地情节,但无法创造所需的东西。 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

1 个答案:

答案 0 :(得分:2)

我不认为你可以从任何地方开始一个轴,但它是最小的。

(链接的帖子只会使标签从不同的值开始。)

所以我们必须帮助一点主人画画。

一些简短的参考文献:

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

结果:

enter image description here

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

更新:如果您想拥有一整套缩短的x轴网格线,您可以进行大量的数学运算或使用图形转换。像往常一样,后者更容易......:

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;后,我们得到了这个结果:

enter image description here