首页 > 解决方案 > 使用 mschart C# 绘制极坐标图

问题描述

我目前正在做一个项目,我需要用动态生成的数据创建一个极坐标图。我设法创建了一个不错的极地图,但无法创建所需的内容。 这是我的极地图

这是我用来在中间设置偏移量的代码:

    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;

    }

我在这里找到了一些帮助:如何在极坐标 Mchart 上移动 Y 轴的原点?

我有一个关于如何尝试获取极地的示例: 完成的示例

标签: c#chartsmschart

解决方案


我不认为你可以让一个轴从任何地方开始,除了它的最小值。

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

所以我们将不得不帮助一些所有者绘图。

一些简短的参考:

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和找到正确的值完全取决于您。IntervalOffsetMinimumMaximum

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

在此处输入图像描述


推荐阅读