C# 用mschart C绘制极坐标图#

C# 用mschart C绘制极坐标图#,c#,charts,mschart,C#,Charts,Mschart,我目前正在做一个项目,我需要用动态生成的数据创建一个极坐标图。我已经成功地创建了一个稍微像样的极坐标图,但无法创建所需的。 这是我用来设置中间偏移量的代码: public Form1() { InitializeComponent(); chart1.ChartAreas[0].AxisX.MajorTickMark.Enabled = false; chart1.ChartAreas[0].AxisX.MajorGrid.Ena

我目前正在做一个项目,我需要用动态生成的数据创建一个极坐标图。我已经成功地创建了一个稍微像样的极坐标图,但无法创建所需的。

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

    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;

    }
我在这里找到了一些帮助:

我举了一个例子来说明我是如何尝试得到极光的:

我认为除了最小值之外,你无法从任何地方创建轴

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

因此,我们必须帮助业主绘制一点图纸

一些简短的参考资料:

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);
}
结果:

当然,为
间隔
间隔偏移量
最小值
最大值
找到正确的值完全取决于您

更新:如果你想拥有一整套缩短的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();
}
Graphics g=e.ChartGraphics.Graphics;
int pyc=(int)ay.ValueToPixelPosition(ay.Minimum);//y中心
对于(int i=0;i<360/ax.Interval;i++)
{
g、 翻译形式(px,pyc);
g、 旋转变换((浮动)(i*最大间隔));
g、 翻译形式(-px,-pyc);
g、 抽绳(钢笔。颜色由您选择,px,py1,px,py2);
g、 ResetTransform();
}
设置后
ax.Interval=30我们得到这个结果:


我认为除了最小值之外,你无法从任何地方创建轴

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

因此,我们必须帮助业主绘制一点图纸

一些简短的参考资料:

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);
}
结果:

当然,为
间隔
间隔偏移量
最小值
最大值
找到正确的值完全取决于您

更新:如果你想拥有一整套缩短的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();
}
Graphics g=e.ChartGraphics.Graphics;
int pyc=(int)ay.ValueToPixelPosition(ay.Minimum);//y中心
对于(int i=0;i<360/ax.Interval;i++)
{
g、 翻译形式(px,pyc);
g、 旋转变换((浮动)(i*最大间隔));
g、 翻译形式(-px,-pyc);
g、 抽绳(钢笔。颜色由您选择,px,py1,px,py2);
g、 ResetTransform();
}
设置后
ax.Interval=30我们得到这个结果:



你解决了你的问题吗?有点,我想把整数放在中间。这意味着什么?去图表的中心还是坐在轴的中间?这些似乎是x轴标签。在极坐标图上,MSChart不允许移动轴,也不允许使用辅助轴。因此,只有解决办法是可行的:要么用第二个图表区覆盖,要么用拉丝将标签拉长。两者都很棘手,可能不值得麻烦。你解决了你的问题吗?有点,我想把整数放在中间。这意味着什么?去图表的中心还是坐在轴的中间?这些似乎是x轴标签。在极坐标图上,MSChart不允许移动轴,也不允许使用辅助轴。因此,只有解决办法是可行的:要么用第二个图表区覆盖,要么用拉丝将标签拉长。这两种方法都很棘手,可能不值得费心。有没有办法设置X轴的间隔?这样就有了从第一个圆到最后一个圆的线,在每一个角度都画出了?OBS!我知道我可以设置X轴间隔,但它会更改角度间隔。我想知道的是,我是否可以改变通常从中心到边缘绘制的线的长度,在每个角度。我更新了答案,包括一整套x轴网格线。谢谢!但是为什么/怎么得到g?哎呀,是e.ChartGraphics.Graphics。有没有设置X轴的间隔?这样就有了从第一个圆到最后一个圆的线,在每一个角度都画出了?OBS!我知道我可以设置X轴间隔,但它会更改角度间隔。我想知道的是,我是否可以改变通常从中心到边缘绘制的线的长度,在每个角度。我更新了答案,包括一整套x轴网格线。谢谢!但是你为什么/怎么得到g?哎呀,是e.ChartGraphics.Graphics。