class_docstr: Artist for an igraph.Graph object.
  
  @param graph: An igraph.Graph object to plot
  @param layout: A layout object or matrix of coordinates to use for plotting.
      Each element or row should describes the coordinates for a vertex.
  @param vertex_style: A dictionary specifying style options for vertices.
  @param edge_style: A dictionary specifying style options for edges.
class_docstr_tok: ["Artist","for","an","igraph.Graph","object",".","@","param","graph",":","An","igraph.Graph","object","to","plot","@","param","layout",":","A","layout","object","or","matrix","of","coordinates","to","use","for","plotting",".","Each","element","or","row","should","describes","the","coordinates","for","a","vertex",".","@","param","vertex_style",":","A","dictionary","specifying","style","options","for","vertices",".","@","param","edge_style",":","A","dictionary","specifying","style","options","for","edges","."]
docstr: Get limits on x/y axes based on the graph layout data.
  
  There is a small padding based on the size of the vertex marker to
  ensure it fits into the canvas.
docstr_tok: ["Get","limits","on","x\/y","axes","based","on","the","graph","layout","data",".","There","is","a","small","padding","based","on","the","size","of","the","vertex","marker","to","ensure","it","fits","into","the","canvas","."]
code: def get_datalim(self):
      """Get limits on x/y axes based on the graph layout data.
  
      There is a small padding based on the size of the vertex marker to
      ensure it fits into the canvas.
      """
      import numpy as np
  
      layout = self.kwds["layout"]
  
      if len(layout) == 0:
          mins = np.array([0, 0])
          maxs = np.array([1, 1])
          return (mins, maxs)
  
      # Use the layout as a base, and expand using bboxes from other artists
      mins = np.min(layout, axis=0).astype(float)
      maxs = np.max(layout, axis=0).astype(float)
  
      # NOTE: unlike other Collections, the vertices are basically a
      # PatchCollection with an offset transform using transData. Therefore,
      # care should be taken if one wants to include it here
      if self._vertices is not None:
          trans = self.axes.transData.transform
          trans_inv = self.axes.transData.inverted().transform
          verts = self._vertices
          for path, offset in zip(verts.get_paths(), verts._offsets):
              bbox = path.get_extents()
              mins = np.minimum(
                  mins, trans_inv(bbox.min + trans(offset))
              )
              maxs = np.maximum(
                  maxs, trans_inv(bbox.max + trans(offset))
              )
  
      if self._edges is not None:
          for path in self._edges.get_paths():
              bbox = path.get_extents()
              mins = np.minimum(mins, bbox.min)
              maxs = np.maximum(maxs, bbox.max)
  
      if self._groups is not None:
          for path in self._groups.get_paths():
              bbox = path.get_extents()
              mins = np.minimum(mins, bbox.min)
              maxs = np.maximum(maxs, bbox.max)
  
      # 5% padding, on each side
      pad = (maxs - mins) * 0.05
      mins -= pad
      maxs += pad
  
      return (mins, maxs)
  
imports: from warnings import warn
  from functools import wraps, partial
  from igraph._igraph import convex_hull, VertexSeq
  from igraph.drawing.baseclasses import AbstractGraphDrawer
  from igraph.drawing.utils import FakeModule
  from .edge import MatplotlibEdgeDrawer, EdgeCollection
  from .polygon import HullCollection
  from .utils import find_matplotlib
  from .vertex import MatplotlibVertexDrawer, VertexCollection
label_desc: Use image node_id 11 for calling the GraphArtist obj's underlying member method code with example usage: obj.get_datalim() and returns: mins,  maxs, mins,  maxs