How can I avoid that ZedGraph relabels my YAxis, dividing by 1000?
Asked Answered
G

2

5

I am creating a C# visual studio forms application that uses zedgraph to chart the data that the program collects but I am running into the following issue when plotting the data:

My y-axis values are usually in the 100,000+ range so when zed graph plots the value it labels the y-axis labels with stuff like 0, 10, 15, 20, 25 and then on the y-axis label it will append "(10^3)" to the title and will plot the values accordingly. What I want to do is have it label the y-axis either with values like 0, 10,000, 15,000, 20,000 etc or 0, 10k, 15k, 20k and so on and not have it adjust the y-axis title.

I tried setting YAxis.Scale.MajorStep = double.Parse("10000"); but the only effect that has is to add a ton of more tick lines on the y-axis but no other effect. Here is my code that graphs the data:

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

I hope this makes sense. Thanks for the help.

Graciagracie answered 13/8, 2011 at 22:21 Comment(0)
B
10

ZedGraph is attempting to detect magnitude and simplify the graph. You can turn this off with the following:

myPane.YAxis.Scale.MagAuto = false;

This will result in y-axis labels like 100000.

If you want to format the label with a separator comma like 100,000:

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

Finally, if you prefer to show 100k, you'll need to subscribe to the ScaleFormatEvent and return your own format, like this:

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);
}
Blackjack answered 14/8, 2011 at 16:35 Comment(0)
M
0

I am having similar problem. So applying your method it works on the application but i also want to print out the graph in a PDF file (using MigraDoc) but it does work.

       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;
       }
Madonna answered 8/4, 2016 at 1:46 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.