docstr: Construct a new Shape object
  
  Parameters
  ----------
  arg
      dict of properties compatible with this constructor or
      an instance of :class:`plotly.graph_objs.layout.Shape`
  editable
      Determines whether the shape could be activated for
      edit or not. Has no effect when the older editable
      shapes mode is enabled via `config.editable` or
      `config.edits.shapePosition`.
  fillcolor
      Sets the color filling the shape's interior. Only
      applies to closed shapes.
  fillrule
      Determines which regions of complex paths constitute
      the interior. For more info please visit
      https://developer.mozilla.org/en-
      US/docs/Web/SVG/Attribute/fill-rule
  label
      :class:`plotly.graph_objects.layout.shape.Label`
      instance or dict with compatible properties
  layer
      Specifies whether shapes are drawn below or above
      traces.
  legend
      Sets the reference to a legend to show this shape in.
      References to these legends are "legend", "legend2",
      "legend3", etc. Settings for these legends are set in
      the layout, under `layout.legend`, `layout.legend2`,
      etc.
  legendgroup
      Sets the legend group for this shape. Traces and shapes
      part of the same legend group hide/show at the same
      time when toggling legend items.
  legendgrouptitle
      :class:`plotly.graph_objects.layout.shape.Legendgroupti
      tle` instance or dict with compatible properties
  legendrank
      Sets the legend rank for this shape. Items and groups
      with smaller ranks are presented on top/left side while
      with "reversed" `legend.traceorder` they are on
      bottom/right side. The default legendrank is 1000, so
      that you can use ranks less than 1000 to place certain
      items before all unranked items, and ranks greater than
      1000 to go after all unranked items. When having
      unranked or equal rank items shapes would be displayed
      after traces i.e. according to their order in data and
      layout.
  legendwidth
      Sets the width (in px or fraction) of the legend for
      this shape.
  line
      :class:`plotly.graph_objects.layout.shape.Line`
      instance or dict with compatible properties
  name
      When used in a template, named items are created in the
      output figure in addition to any items the figure
      already has in this array. You can modify these items
      in the output figure by making your own item with
      `templateitemname` matching this `name` alongside your
      modifications (including `visible: false` or `enabled:
      false` to hide it). Has no effect outside of a
      template.
  opacity
      Sets the opacity of the shape.
  path
      For `type` "path" - a valid SVG path with the pixel
      values replaced by data values in
      `xsizemode`/`ysizemode` being "scaled" and taken
      unmodified as pixels relative to `xanchor` and
      `yanchor` in case of "pixel" size mode. There are a few
      restrictions / quirks only absolute instructions, not
      relative. So the allowed segments are: M, L, H, V, Q,
      C, T, S, and Z arcs (A) are not allowed because radius
      rx and ry are relative. In the future we could consider
      supporting relative commands, but we would have to
      decide on how to handle date and log axes. Note that
      even as is, Q and C Bezier paths that are smooth on
      linear axes may not be smooth on log, and vice versa.
      no chained "polybezier" commands - specify the segment
      type for each one. On category axes, values are numbers
      scaled to the serial numbers of categories because
      using the categories themselves there would be no way
      to describe fractional positions On data axes: because
      space and T are both normal components of path strings,
      we can't use either to separate date from time parts.
      Therefore we'll use underscore for this purpose:
      2015-02-21_13:45:56.789
  showlegend
      Determines whether or not this shape is shown in the
      legend.
  templateitemname
      Used to refer to a named item in this array in the
      template. Named items from the template will be created
      even without a matching item in the input figure, but
      you can modify one by making an item with
      `templateitemname` matching its `name`, alongside your
      modifications (including `visible: false` or `enabled:
      false` to hide it). If there is no template or no
      matching item, this item will be hidden unless you
      explicitly show it with `visible: true`.
  type
      Specifies the shape type to be drawn. If "line", a line
      is drawn from (`x0`,`y0`) to (`x1`,`y1`) with respect
      to the axes' sizing mode. If "circle", a circle is
      drawn from ((`x0`+`x1`)/2, (`y0`+`y1`)/2)) with radius
      (|(`x0`+`x1`)/2 - `x0`|, |(`y0`+`y1`)/2 -`y0`)|) with
      respect to the axes' sizing mode. If "rect", a
      rectangle is drawn linking (`x0`,`y0`), (`x1`,`y0`),
      (`x1`,`y1`), (`x0`,`y1`), (`x0`,`y0`) with respect to
      the axes' sizing mode. If "path", draw a custom SVG
      path using `path`. with respect to the axes' sizing
      mode.
  visible
      Determines whether or not this shape is visible. If
      "legendonly", the shape is not drawn, but can appear as
      a legend item (provided that the legend itself is
      visible).
  x0
      Sets the shape's starting x position. See `type` and
      `xsizemode` for more info.
  x1
      Sets the shape's end x position. See `type` and
      `xsizemode` for more info.
  xanchor
      Only relevant in conjunction with `xsizemode` set to
      "pixel". Specifies the anchor point on the x axis to
      which `x0`, `x1` and x coordinates within `path` are
      relative to. E.g. useful to attach a pixel sized shape
      to a certain data value. No effect when `xsizemode` not
      set to "pixel".
  xref
      Sets the shape's x coordinate axis. If set to a x axis
      id (e.g. "x" or "x2"), the `x` position refers to a x
      coordinate. If set to "paper", the `x` position refers
      to the distance from the left of the plotting area in
      normalized coordinates where 0 (1) corresponds to the
      left (right). If set to a x axis ID followed by
      "domain" (separated by a space), the position behaves
      like for "paper", but refers to the distance in
      fractions of the domain length from the left of the
      domain of that axis: e.g., *x2 domain* refers to the
      domain of the second x  axis and a x position of 0.5
      refers to the point between the left and the right of
      the domain of the second x axis.
  xsizemode
      Sets the shapes's sizing mode along the x axis. If set
      to "scaled", `x0`, `x1` and x coordinates within `path`
      refer to data values on the x axis or a fraction of the
      plot area's width (`xref` set to "paper"). If set to
      "pixel", `xanchor` specifies the x position in terms of
      data or plot fraction but `x0`, `x1` and x coordinates
      within `path` are pixels relative to `xanchor`. This
      way, the shape can have a fixed width while maintaining
      a position relative to data or plot fraction.
  y0
      Sets the shape's starting y position. See `type` and
      `ysizemode` for more info.
  y1
      Sets the shape's end y position. See `type` and
      `ysizemode` for more info.
  yanchor
      Only relevant in conjunction with `ysizemode` set to
      "pixel". Specifies the anchor point on the y axis to
      which `y0`, `y1` and y coordinates within `path` are
      relative to. E.g. useful to attach a pixel sized shape
      to a certain data value. No effect when `ysizemode` not
      set to "pixel".
  yref
      Sets the shape's y coordinate axis. If set to a y axis
      id (e.g. "y" or "y2"), the `y` position refers to a y
      coordinate. If set to "paper", the `y` position refers
      to the distance from the bottom of the plotting area in
      normalized coordinates where 0 (1) corresponds to the
      bottom (top). If set to a y axis ID followed by
      "domain" (separated by a space), the position behaves
      like for "paper", but refers to the distance in
      fractions of the domain length from the bottom of the
      domain of that axis: e.g., *y2 domain* refers to the
      domain of the second y  axis and a y position of 0.5
      refers to the point between the bottom and the top of
      the domain of the second y axis.
  ysizemode
      Sets the shapes's sizing mode along the y axis. If set
      to "scaled", `y0`, `y1` and y coordinates within `path`
      refer to data values on the y axis or a fraction of the
      plot area's height (`yref` set to "paper"). If set to
      "pixel", `yanchor` specifies the y position in terms of
      data or plot fraction but `y0`, `y1` and y coordinates
      within `path` are pixels relative to `yanchor`. This
      way, the shape can have a fixed height while
      maintaining a position relative to data or plot
      fraction.
  
  Returns
  -------
  Shape
code: def __init__(
      self,
      arg=None,
      editable=None,
      fillcolor=None,
      fillrule=None,
      label=None,
      layer=None,
      legend=None,
      legendgroup=None,
      legendgrouptitle=None,
      legendrank=None,
      legendwidth=None,
      line=None,
      name=None,
      opacity=None,
      path=None,
      showlegend=None,
      templateitemname=None,
      type=None,
      visible=None,
      x0=None,
      x1=None,
      xanchor=None,
      xref=None,
      xsizemode=None,
      y0=None,
      y1=None,
      yanchor=None,
      yref=None,
      ysizemode=None,
      **kwargs,
  ):
      """
      Construct a new Shape object
  
      Parameters
      ----------
      arg
          dict of properties compatible with this constructor or
          an instance of :class:`plotly.graph_objs.layout.Shape`
      editable
          Determines whether the shape could be activated for
          edit or not. Has no effect when the older editable
          shapes mode is enabled via `config.editable` or
          `config.edits.shapePosition`.
      fillcolor
          Sets the color filling the shape's interior. Only
          applies to closed shapes.
      fillrule
          Determines which regions of complex paths constitute
          the interior. For more info please visit
          https://developer.mozilla.org/en-
          US/docs/Web/SVG/Attribute/fill-rule
      label
          :class:`plotly.graph_objects.layout.shape.Label`
          instance or dict with compatible properties
      layer
          Specifies whether shapes are drawn below or above
          traces.
      legend
          Sets the reference to a legend to show this shape in.
          References to these legends are "legend", "legend2",
          "legend3", etc. Settings for these legends are set in
          the layout, under `layout.legend`, `layout.legend2`,
          etc.
      legendgroup
          Sets the legend group for this shape. Traces and shapes
          part of the same legend group hide/show at the same
          time when toggling legend items.
      legendgrouptitle
          :class:`plotly.graph_objects.layout.shape.Legendgroupti
          tle` instance or dict with compatible properties
      legendrank
          Sets the legend rank for this shape. Items and groups
          with smaller ranks are presented on top/left side while
          with "reversed" `legend.traceorder` they are on
          bottom/right side. The default legendrank is 1000, so
          that you can use ranks less than 1000 to place certain
          items before all unranked items, and ranks greater than
          1000 to go after all unranked items. When having
          unranked or equal rank items shapes would be displayed
          after traces i.e. according to their order in data and
          layout.
      legendwidth
          Sets the width (in px or fraction) of the legend for
          this shape.
      line
          :class:`plotly.graph_objects.layout.shape.Line`
          instance or dict with compatible properties
      name
          When used in a template, named items are created in the
          output figure in addition to any items the figure
          already has in this array. You can modify these items
          in the output figure by making your own item with
          `templateitemname` matching this `name` alongside your
          modifications (including `visible: false` or `enabled:
          false` to hide it). Has no effect outside of a
          template.
      opacity
          Sets the opacity of the shape.
      path
          For `type` "path" - a valid SVG path with the pixel
          values replaced by data values in
          `xsizemode`/`ysizemode` being "scaled" and taken
          unmodified as pixels relative to `xanchor` and
          `yanchor` in case of "pixel" size mode. There are a few
          restrictions / quirks only absolute instructions, not
          relative. So the allowed segments are: M, L, H, V, Q,
          C, T, S, and Z arcs (A) are not allowed because radius
          rx and ry are relative. In the future we could consider
          supporting relative commands, but we would have to
          decide on how to handle date and log axes. Note that
          even as is, Q and C Bezier paths that are smooth on
          linear axes may not be smooth on log, and vice versa.
          no chained "polybezier" commands - specify the segment
          type for each one. On category axes, values are numbers
          scaled to the serial numbers of categories because
          using the categories themselves there would be no way
          to describe fractional positions On data axes: because
          space and T are both normal components of path strings,
          we can't use either to separate date from time parts.
          Therefore we'll use underscore for this purpose:
          2015-02-21_13:45:56.789
      showlegend
          Determines whether or not this shape is shown in the
          legend.
      templateitemname
          Used to refer to a named item in this array in the
          template. Named items from the template will be created
          even without a matching item in the input figure, but
          you can modify one by making an item with
          `templateitemname` matching its `name`, alongside your
          modifications (including `visible: false` or `enabled:
          false` to hide it). If there is no template or no
          matching item, this item will be hidden unless you
          explicitly show it with `visible: true`.
      type
          Specifies the shape type to be drawn. If "line", a line
          is drawn from (`x0`,`y0`) to (`x1`,`y1`) with respect
          to the axes' sizing mode. If "circle", a circle is
          drawn from ((`x0`+`x1`)/2, (`y0`+`y1`)/2)) with radius
          (|(`x0`+`x1`)/2 - `x0`|, |(`y0`+`y1`)/2 -`y0`)|) with
          respect to the axes' sizing mode. If "rect", a
          rectangle is drawn linking (`x0`,`y0`), (`x1`,`y0`),
          (`x1`,`y1`), (`x0`,`y1`), (`x0`,`y0`) with respect to
          the axes' sizing mode. If "path", draw a custom SVG
          path using `path`. with respect to the axes' sizing
          mode.
      visible
          Determines whether or not this shape is visible. If
          "legendonly", the shape is not drawn, but can appear as
          a legend item (provided that the legend itself is
          visible).
      x0
          Sets the shape's starting x position. See `type` and
          `xsizemode` for more info.
      x1
          Sets the shape's end x position. See `type` and
          `xsizemode` for more info.
      xanchor
          Only relevant in conjunction with `xsizemode` set to
          "pixel". Specifies the anchor point on the x axis to
          which `x0`, `x1` and x coordinates within `path` are
          relative to. E.g. useful to attach a pixel sized shape
          to a certain data value. No effect when `xsizemode` not
          set to "pixel".
      xref
          Sets the shape's x coordinate axis. If set to a x axis
          id (e.g. "x" or "x2"), the `x` position refers to a x
          coordinate. If set to "paper", the `x` position refers
          to the distance from the left of the plotting area in
          normalized coordinates where 0 (1) corresponds to the
          left (right). If set to a x axis ID followed by
          "domain" (separated by a space), the position behaves
          like for "paper", but refers to the distance in
          fractions of the domain length from the left of the
          domain of that axis: e.g., *x2 domain* refers to the
          domain of the second x  axis and a x position of 0.5
          refers to the point between the left and the right of
          the domain of the second x axis.
      xsizemode
          Sets the shapes's sizing mode along the x axis. If set
          to "scaled", `x0`, `x1` and x coordinates within `path`
          refer to data values on the x axis or a fraction of the
          plot area's width (`xref` set to "paper"). If set to
          "pixel", `xanchor` specifies the x position in terms of
          data or plot fraction but `x0`, `x1` and x coordinates
          within `path` are pixels relative to `xanchor`. This
          way, the shape can have a fixed width while maintaining
          a position relative to data or plot fraction.
      y0
          Sets the shape's starting y position. See `type` and
          `ysizemode` for more info.
      y1
          Sets the shape's end y position. See `type` and
          `ysizemode` for more info.
      yanchor
          Only relevant in conjunction with `ysizemode` set to
          "pixel". Specifies the anchor point on the y axis to
          which `y0`, `y1` and y coordinates within `path` are
          relative to. E.g. useful to attach a pixel sized shape
          to a certain data value. No effect when `ysizemode` not
          set to "pixel".
      yref
          Sets the shape's y coordinate axis. If set to a y axis
          id (e.g. "y" or "y2"), the `y` position refers to a y
          coordinate. If set to "paper", the `y` position refers
          to the distance from the bottom of the plotting area in
          normalized coordinates where 0 (1) corresponds to the
          bottom (top). If set to a y axis ID followed by
          "domain" (separated by a space), the position behaves
          like for "paper", but refers to the distance in
          fractions of the domain length from the bottom of the
          domain of that axis: e.g., *y2 domain* refers to the
          domain of the second y  axis and a y position of 0.5
          refers to the point between the bottom and the top of
          the domain of the second y axis.
      ysizemode
          Sets the shapes's sizing mode along the y axis. If set
          to "scaled", `y0`, `y1` and y coordinates within `path`
          refer to data values on the y axis or a fraction of the
          plot area's height (`yref` set to "paper"). If set to
          "pixel", `yanchor` specifies the y position in terms of
          data or plot fraction but `y0`, `y1` and y coordinates
          within `path` are pixels relative to `yanchor`. This
          way, the shape can have a fixed height while
          maintaining a position relative to data or plot
          fraction.
  
      Returns
      -------
      Shape
      """
      super(Shape, self).__init__("shapes")
  
      if "_parent" in kwargs:
          self._parent = kwargs["_parent"]
          return
  
      # Validate arg
      # ------------
      if arg is None:
          arg = {}
      elif isinstance(arg, self.__class__):
          arg = arg.to_plotly_json()
      elif isinstance(arg, dict):
          arg = _copy.copy(arg)
      else:
          raise ValueError(
              """\
  The first argument to the plotly.graph_objs.layout.Shape
  constructor must be a dict or
  an instance of :class:`plotly.graph_objs.layout.Shape`"""
          )
  
      # Handle skip_invalid
      # -------------------
      self._skip_invalid = kwargs.pop("skip_invalid", False)
      self._validate = kwargs.pop("_validate", True)
  
      # Populate data dict with properties
      # ----------------------------------
      _v = arg.pop("editable", None)
      _v = editable if editable is not None else _v
      if _v is not None:
          self["editable"] = _v
      _v = arg.pop("fillcolor", None)
      _v = fillcolor if fillcolor is not None else _v
      if _v is not None:
          self["fillcolor"] = _v
      _v = arg.pop("fillrule", None)
      _v = fillrule if fillrule is not None else _v
      if _v is not None:
          self["fillrule"] = _v
      _v = arg.pop("label", None)
      _v = label if label is not None else _v
      if _v is not None:
          self["label"] = _v
      _v = arg.pop("layer", None)
      _v = layer if layer is not None else _v
      if _v is not None:
          self["layer"] = _v
      _v = arg.pop("legend", None)
      _v = legend if legend is not None else _v
      if _v is not None:
          self["legend"] = _v
      _v = arg.pop("legendgroup", None)
      _v = legendgroup if legendgroup is not None else _v
      if _v is not None:
          self["legendgroup"] = _v
      _v = arg.pop("legendgrouptitle", None)
      _v = legendgrouptitle if legendgrouptitle is not None else _v
      if _v is not None:
          self["legendgrouptitle"] = _v
      _v = arg.pop("legendrank", None)
      _v = legendrank if legendrank is not None else _v
      if _v is not None:
          self["legendrank"] = _v
      _v = arg.pop("legendwidth", None)
      _v = legendwidth if legendwidth is not None else _v
      if _v is not None:
          self["legendwidth"] = _v
      _v = arg.pop("line", None)
      _v = line if line is not None else _v
      if _v is not None:
          self["line"] = _v
      _v = arg.pop("name", None)
      _v = name if name is not None else _v
      if _v is not None:
          self["name"] = _v
      _v = arg.pop("opacity", None)
      _v = opacity if opacity is not None else _v
      if _v is not None:
          self["opacity"] = _v
      _v = arg.pop("path", None)
      _v = path if path is not None else _v
      if _v is not None:
          self["path"] = _v
      _v = arg.pop("showlegend", None)
      _v = showlegend if showlegend is not None else _v
      if _v is not None:
          self["showlegend"] = _v
      _v = arg.pop("templateitemname", None)
      _v = templateitemname if templateitemname is not None else _v
      if _v is not None:
          self["templateitemname"] = _v
      _v = arg.pop("type", None)
      _v = type if type is not None else _v
      if _v is not None:
          self["type"] = _v
      _v = arg.pop("visible", None)
      _v = visible if visible is not None else _v
      if _v is not None:
          self["visible"] = _v
      _v = arg.pop("x0", None)
      _v = x0 if x0 is not None else _v
      if _v is not None:
          self["x0"] = _v
      _v = arg.pop("x1", None)
      _v = x1 if x1 is not None else _v
      if _v is not None:
          self["x1"] = _v
      _v = arg.pop("xanchor", None)
      _v = xanchor if xanchor is not None else _v
      if _v is not None:
          self["xanchor"] = _v
      _v = arg.pop("xref", None)
      _v = xref if xref is not None else _v
      if _v is not None:
          self["xref"] = _v
      _v = arg.pop("xsizemode", None)
      _v = xsizemode if xsizemode is not None else _v
      if _v is not None:
          self["xsizemode"] = _v
      _v = arg.pop("y0", None)
      _v = y0 if y0 is not None else _v
      if _v is not None:
          self["y0"] = _v
      _v = arg.pop("y1", None)
      _v = y1 if y1 is not None else _v
      if _v is not None:
          self["y1"] = _v
      _v = arg.pop("yanchor", None)
      _v = yanchor if yanchor is not None else _v
      if _v is not None:
          self["yanchor"] = _v
      _v = arg.pop("yref", None)
      _v = yref if yref is not None else _v
      if _v is not None:
          self["yref"] = _v
      _v = arg.pop("ysizemode", None)
      _v = ysizemode if ysizemode is not None else _v
      if _v is not None:
          self["ysizemode"] = _v
  
      # Process unknown kwargs
      # ----------------------
      self._process_kwargs(**dict(arg, **kwargs))
  
      # Reset skip_invalid
      # ------------------
      self._skip_invalid = False
  
imports: from plotly.basedatatypes import BaseLayoutHierarchyType
  import copy
label_desc: Use image node_id 58 to create a new Shape object from inherited base classes: _BaseLayoutHierarchyType with example: obj = Shape(arg, editable, fillcolor, fillrule, label, layer, legend, legendgroup, legendgrouptitle, legendrank, legendwidth, line, name, opacity, path, showlegend, templateitemname, type, visible, x0, x1, xanchor, xref, xsizemode, y0, y1, yanchor, yref, ysizemode)