pythonbest-fitopenturns

How to set Axes limits on OpenTurns Viewer?


I'm using openturns to find the best fit distribution for my data. I got to plot it alright, but the X limit is far bigger than I'd like. My code is:

import statsmodels.api as sm
import openturns as ot
import openturns.viewer as otv

data = in_seconds

sample = ot.Sample(data, 1)
tested_factories = ot.DistributionFactory.GetContinuousUniVariateFactories()
best_model, best_bic = ot.FittingTest.BestModelBIC(sample, tested_factories)
print(best_model)


graph = ot.HistogramFactory().build(sample).drawPDF()
bestPDF = best_model.drawPDF()
bestPDF.setColors(["blue"])
graph.add(bestPDF)

name = best_model.getImplementation().getClassName()
graph.setLegends(["Histogram",name])
graph.setXTitle("Latências (segundos)")
graph.setYTitle("Frequência")


otv.View(graph)

I'd like to set X limits as something like "graph.setXLim", as we'd do in matplotlib, but I'm stuck with it as I'm new to OpenTurns.

Thanks in advance.


Solution

  • Any OpenTURNS graph has a getBoundingBox method which returns the bounding box as a dimension 2 Interval. We can get/set the lower and upper bounds of this interval with getLowerBound and getUpperBound. Each of these bounds is a Point with dimension 2. Hence, we can set the bounds of the graphics prior to the use of the View class.

    In the following example, I create a simple graph containing the PDF of the gaussian distribution.

    import openturns as ot
    import openturns.viewer as otv
    n = ot.Normal()
    graph = n.drawPDF()
    _ = otv.View(graph)
    

    Bell curve

    Suppose that I want to set the lower X axis to -1. The script:

    boundingBox = graph.getBoundingBox()
    lb = boundingBox.getLowerBound()
    print(lb)
    

    produces:

    [-4.10428,-0.0195499]
    

    The first value in the Point is the X lower bound and the second is the Y lower bound. The following script sets the first component of the lower bound to -1, wraps the lower bound into the bounding box and sets the bounding box into the graph.

    lb[0] = -1.0
    boundingBox.setLowerBound(lb)
    graph.setBoundingBox(boundingBox)
    _ = otv.View(graph)
    

    This produces the following graph.

    Bell curve with minimum X axis equal to -1

    The advantage of these methods is that they configure the graphics from the library, before the rendering is done by Matplotlib. The drawback is that they are a little more verbose than the Matplotlib counterpart.