Source code for plotnine.geoms.geom_errorbarh
from __future__ import annotations
import typing
import numpy as np
import pandas as pd
from ..doctools import document
from ..utils import copy_missing_columns, resolution
from .geom import geom
from .geom_path import geom_path
from .geom_segment import geom_segment
if typing.TYPE_CHECKING:
from typing import Any
from plotnine.iapi import panel_view
from plotnine.typing import Axes, Coord
[docs]@document
class geom_errorbarh(geom):
"""
Horizontal interval represented as an errorbar
{usage}
Parameters
----------
{common_parameters}
height : float or None, optional (default: 0.5)
Bar height. If :py:`None`, the height is set to
`90%` of the resolution of the data.
"""
DEFAULT_AES = {
"alpha": 1,
"color": "black",
"linetype": "solid",
"size": 0.5,
}
REQUIRED_AES = {"y", "xmin", "xmax"}
DEFAULT_PARAMS = {
"stat": "identity",
"position": "identity",
"na_rm": False,
"height": 0.5,
}
draw_legend = staticmethod(geom_path.draw_legend)
def setup_data(self, data: pd.DataFrame) -> pd.DataFrame:
if "height" not in data:
if self.params["height"]:
data["height"] = self.params["height"]
else:
data["height"] = resolution(data["y"], False) * 0.9
data["ymin"] = data["y"] - data["height"] / 2
data["ymax"] = data["y"] + data["height"] / 2
del data["height"]
return data
@staticmethod
def draw_group(
data: pd.DataFrame,
panel_params: panel_view,
coord: Coord,
ax: Axes,
**params: Any,
):
f = np.hstack
# create (two vertical bars) + horizontal bar
bars = pd.DataFrame(
{
"y": f([data["ymin"], data["ymin"], data["y"]]),
"yend": f([data["ymax"], data["ymax"], data["y"]]),
"x": f([data["xmin"], data["xmax"], data["xmin"]]),
"xend": f([data["xmin"], data["xmax"], data["xmax"]]),
}
)
copy_missing_columns(bars, data)
geom_segment.draw_group(bars, panel_params, coord, ax, **params)