Полярный график с MSchart C # - PullRequest
0 голосов
/ 07 мая 2018

В настоящее время я работаю над проектом, в котором мне нужно создать полярный график с динамически генерируемыми данными. Мне удалось создать несколько приличный полярный сюжет, но я не смог создать то, что нужно. Это мой Полярный Заговор

это код, который я использовал для установки смещения в середине:

    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;

    }

Я нашел некоторую помощь здесь: Как сместить начало оси Y на полярном графике?

У меня есть пример того, как я пытаюсь получить полярность: Готовый пример

1 Ответ

0 голосов
/ 07 мая 2018

Я не думаю, что вы можете начать ось с любого места, кроме минимума.

(Связанный пост заставляет метки начинаться с другого значения.)

Так что нам нужно помочь с небольшим рисунком владельца.

Несколько кратких ссылок:

var ca = chart1.ChartAreas[0];
var ax = ca.AxisX;
var ay = ca.AxisY;

Теперь давайте скроем ось у:

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

Конечно, найти правильные значения для Interval, IntervalOffset, Minimum и Maximum - все зависит от вас ..

Обновление: Если вы хотите иметь полный набор укороченных линий сетки по оси 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

...