Как я могу избежать того, что ZedGraph перемаркирует мой YAxis, разделив на 1000? - PullRequest
5 голосов
/ 14 августа 2011

Я создаю приложение форм Visual Studio C #, которое использует zedgraph для составления диаграммы данных, которые собирает программа, но я сталкиваюсь со следующей проблемой при построении данных:

Мои значения по оси y обычно находятся в диапазоне 100 000+, поэтому, когда график zed отображает значение, он помечает метки по оси y такими вещами, как 0, 10, 15, 20, 25, а затем на оси y обозначает добавит "(10 ^ 3)" к заголовку и отобразит значения соответственно. Я хочу, чтобы он пометил ось Y значениями 0, 10000, 15000, 20000 и т. Д. Или 0, 10 тыс., 15 тыс., 20 тыс. И т. Д. И не настроил заголовок оси Y.

Я попытался установить YAxis.Scale.MajorStep = double.Parse("10000");, но единственный эффект, который имеет место, это добавить тонну больше линий тиков на оси Y, но никакого другого эффекта. Вот мой код, который отображает данные:

    private void createGraph()
    {
        GraphPane myPane = zdc_graph.GraphPane;
        myPane.CurveList.Clear();
        myPane.GraphObjList.Clear();

        myPane.Title.Text = this.monitoredHost.hostName + "\nWorkState[" +
                            this.monitoredHost.currentWorkState + "]";
        myPane.XAxis.Title.Text = "";

        myPane.YAxis.Title.Text = "OPS Per Second";
        myPane.YAxis.Scale.FontSpec.FontColor = Color.Blue;
        myPane.YAxis.Title.FontSpec.FontColor = Color.Blue;
        myPane.YAxis.Scale.MaxAuto = true;

        myPane.Y2Axis.Title.Text = "Reading";
        myPane.Y2Axis.IsVisible = true;
        myPane.Y2Axis.Scale.FontSpec.FontColor = Color.Red;
        myPane.Y2Axis.Title.FontSpec.FontColor = Color.Red;

        myPane.XAxis.Type = AxisType.Date;
        myPane.XAxis.Scale.Format = "T";
        myPane.XAxis.Scale.MajorUnit = DateUnit.Second;
        myPane.YAxis.Scale.Min = 0;
        myPane.YAxis.Scale.MajorStep = double.Parse("10000");
        myPane.Y2Axis.Scale.Min = 0;

        LineItem kpiCurve = myPane.AddCurve("OPS Per Second",
                           this.monitoredHost.graphKpiList,
                           Color.Blue,SymbolType.Circle);
        LineItem pwrCurve = myPane.AddCurve("Reading", 
                           this.monitoredHost.graphPwrList, Color.Red, 
                           SymbolType.Circle);

        kpiCurve.Line.Width = 2.0F;
        kpiCurve.Symbol.Size = 4.0F;
        kpiCurve.Symbol.Fill = new Fill(Color.White);

        pwrCurve.Line.Width = 2.0F;
        pwrCurve.Symbol.Size = 4.0F;
        pwrCurve.Symbol.Fill = new Fill(Color.White);
        pwrCurve.IsY2Axis = true;

        myPane.Chart.Fill = new Fill(Color.White, Color.FromArgb(255, 255, 210), -45F);

        zdc_graph.AxisChange();
        zdc_graph.Refresh();
    }

Надеюсь, это имеет смысл. Спасибо за помощь.

Ответы [ 2 ]

9 голосов
/ 14 августа 2011

ZedGraph пытается определить величину и упростить график.Вы можете отключить это с помощью следующего:

myPane.YAxis.Scale.MagAuto = false;

Это приведет к появлению меток по оси Y, таких как 100000.

Если вы хотите отформатировать метку с запятой-разделителем, например 100,000:

myPane.YAxis.Scale.Format = "#,#";

Наконец, если вы предпочитаете показывать 100k, вам нужно подписаться на ScaleFormatEvent и вернуть свой собственный формат, например:

myPane.YAxis.ScaleFormatEvent += new Axis.ScaleFormatHandler(YAxis_ScaleFormatEvent);

string YAxis_ScaleFormatEvent(GraphPane pane, Axis axis, double val, int index)
{
    return String.Format("{0}k", val / 1000);
}
0 голосов
/ 08 апреля 2016

У меня похожая проблема.Таким образом, применяя ваш метод, он работает в приложении, но я также хочу распечатать график в файле PDF (используя MigraDoc), но он работает.

       public Bitmap printGraphPane()
       {
        ZedGraphControl graph = new ZedGraphControl();
        GraphPane newGP = myPane.GraphPane;
        //newGP.YAxis.Scale.Mag = 0;
        //newGP.YAxis.Scale.Format = "#";
        //newGP.YAxis.ScaleFormatEvent += new Axis.ScaleFormatHandler(YAxis_ScaleFormatEvent);

        Bitmap bit = new Bitmap(newGraph.Width, newGraph.Height);
        newGraph.ClientSize = bit.Size;
        newGraph.DrawToBitmap(bit, new Rectangle(0, 0, newGraph.Width, newGraph.Height));

        return bit;
       }
...