#----------------------------------------------------------------------------- # Copyright (c) 2012 - 2021, Anaconda, Inc., and Bokeh Contributors. # All rights reserved. # # The full license is in the file LICENSE.txt, distributed with this software. #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Boilerplate #----------------------------------------------------------------------------- from __future__ import annotations import logging # isort:skip log = logging.getLogger(__name__) #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- # Standard library imports from typing import TYPE_CHECKING, Any # Bokeh imports from ..models import glyphs from ._decorators import glyph_method, marker_method if TYPE_CHECKING: from ..models.canvas import CoordinateMapping from ..models.plots import Plot from ..models.renderers import GlyphRenderer #----------------------------------------------------------------------------- # Globals and constants #----------------------------------------------------------------------------- __all__ = ( "GlyphAPI", ) #----------------------------------------------------------------------------- # General API #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Dev API #----------------------------------------------------------------------------- class GlyphAPI: """ """ @property def plot(self) -> Plot | None: return self._parent @property def coordinates(self) -> CoordinateMapping | None: return self._coordinates def __init__(self, parent: Plot | None = None, coordinates: CoordinateMapping | None = None) -> None: self._parent = parent self._coordinates = coordinates @glyph_method(glyphs.AnnularWedge) def annular_wedge(self, **kwargs): pass @glyph_method(glyphs.Annulus) def annulus(self, **kwargs): """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.annulus(x=[1, 2, 3], y=[1, 2, 3], color="#7FC97F", inner_radius=0.2, outer_radius=0.5) show(plot) """ @glyph_method(glyphs.Arc) def arc(self, *args: Any, **kwargs: Any) -> GlyphRenderer: pass @marker_method() def asterisk(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.asterisk(x=[1,2,3], y=[1,2,3], size=20, color="#F0027F") show(plot) """ @glyph_method(glyphs.Bezier) def bezier(self, *args: Any, **kwargs: Any) -> GlyphRenderer: pass @glyph_method(glyphs.Circle) def circle(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ .. note:: Only one of ``size`` or ``radius`` should be provided. Note that ``radius`` defaults to |data units|. Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.circle(x=[1, 2, 3], y=[1, 2, 3], size=20) show(plot) """ @marker_method() def circle_cross(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.circle_cross(x=[1,2,3], y=[4,5,6], size=20, color="#FB8072", fill_alpha=0.2, line_width=2) show(plot) """ @marker_method() def circle_dot(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.circle_dot(x=[1,2,3], y=[4,5,6], size=20, color="#FB8072", fill_color=None) show(plot) """ @marker_method() def circle_x(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.circle_x(x=[1, 2, 3], y=[1, 2, 3], size=20, color="#DD1C77", fill_alpha=0.2) show(plot) """ @marker_method() def circle_y(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.circle_y(x=[1, 2, 3], y=[1, 2, 3], size=20, color="#DD1C77", fill_alpha=0.2) show(plot) """ @marker_method() def cross(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.cross(x=[1, 2, 3], y=[1, 2, 3], size=20, color="#E6550D", line_width=2) show(plot) """ @marker_method() def dash(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.dash(x=[1, 2, 3], y=[1, 2, 3], size=[10,20,25], color="#99D594", line_width=2) show(plot) """ @marker_method() def diamond(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.diamond(x=[1, 2, 3], y=[1, 2, 3], size=20, color="#1C9099", line_width=2) show(plot) """ @marker_method() def diamond_cross(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.diamond_cross(x=[1, 2, 3], y=[1, 2, 3], size=20, color="#386CB0", fill_color=None, line_width=2) show(plot) """ @marker_method() def diamond_dot(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.diamond_dot(x=[1, 2, 3], y=[1, 2, 3], size=20, color="#386CB0", fill_color=None) show(plot) """ @marker_method() def dot(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.dot(x=[1, 2, 3], y=[1, 2, 3], size=20, color="#386CB0") show(plot) """ @glyph_method(glyphs.HArea) def harea(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.harea(x1=[0, 0, 0], x2=[1, 4, 2], y=[1, 2, 3], fill_color="#99D594") show(plot) """ @glyph_method(glyphs.HBar) def hbar(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.hbar(y=[1, 2, 3], height=0.5, left=0, right=[1,2,3], color="#CAB2D6") show(plot) """ @glyph_method(glyphs.Ellipse) def ellipse(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.ellipse(x=[1, 2, 3], y=[1, 2, 3], width=30, height=20, color="#386CB0", fill_color=None, line_width=2) show(plot) """ @marker_method() def hex(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.hex(x=[1, 2, 3], y=[1, 2, 3], size=[10,20,30], color="#74ADD1") show(plot) """ @marker_method() def hex_dot(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.hex_dot(x=[1, 2, 3], y=[1, 2, 3], size=[10,20,30], color="#74ADD1", fill_color=None) show(plot) """ @glyph_method(glyphs.HexTile) def hex_tile(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300, match_aspect=True) plot.hex_tile(r=[0, 0, 1], q=[1, 2, 2], fill_color="#74ADD1") show(plot) """ @glyph_method(glyphs.Image) def image(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ .. note:: If both ``palette`` and ``color_mapper`` are passed, a ``ValueError`` exception will be raised. If neither is passed, then the ``Greys9`` palette will be used as a default. """ @glyph_method(glyphs.ImageRGBA) def image_rgba(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ .. note:: The ``image_rgba`` method accepts images as a two-dimensional array of RGBA values (encoded as 32-bit integers). """ @glyph_method(glyphs.ImageURL) def image_url(self, *args: Any, **kwargs: Any) -> GlyphRenderer: pass @marker_method() def inverted_triangle(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.inverted_triangle(x=[1, 2, 3], y=[1, 2, 3], size=20, color="#DE2D26") show(plot) """ @glyph_method(glyphs.Line) def line(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show p = figure(title="line", width=300, height=300) p.line(x=[1, 2, 3, 4, 5], y=[6, 7, 2, 4, 5]) show(p) """ @glyph_method(glyphs.MultiLine) def multi_line(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ .. note:: For this glyph, the data is not simply an array of scalars, it is an "array of arrays". Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show p = figure(width=300, height=300) p.multi_line(xs=[[1, 2, 3], [2, 3, 4]], ys=[[6, 7, 2], [4, 5, 7]], color=['red','green']) show(p) """ @glyph_method(glyphs.MultiPolygons) def multi_polygons(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ .. note:: For this glyph, the data is not simply an array of scalars, it is a nested array. Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show p = figure(width=300, height=300) p.multi_polygons(xs=[[[[1, 1, 2, 2]]], [[[1, 1, 3], [1.5, 1.5, 2]]]], ys=[[[[4, 3, 3, 4]]], [[[1, 3, 1], [1.5, 2, 1.5]]]], color=['red', 'green']) show(p) """ @glyph_method(glyphs.Oval) def oval(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.oval(x=[1, 2, 3], y=[1, 2, 3], width=0.2, height=0.4, angle=-0.7, color="#1D91C0") show(plot) """ @glyph_method(glyphs.Patch) def patch(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show p = figure(width=300, height=300) p.patch(x=[1, 2, 3, 2], y=[6, 7, 2, 2], color="#99d8c9") show(p) """ @glyph_method(glyphs.Patches) def patches(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ .. note:: For this glyph, the data is not simply an array of scalars, it is an "array of arrays". Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show p = figure(width=300, height=300) p.patches(xs=[[1,2,3],[4,5,6,5]], ys=[[1,2,1],[4,5,5,4]], color=["#43a2ca", "#a8ddb5"]) show(p) """ @marker_method() def plus(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.plus(x=[1, 2, 3], y=[1, 2, 3], size=20, color="#DE2D26") show(plot) """ @glyph_method(glyphs.Quad) def quad(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.quad(top=[2, 3, 4], bottom=[1, 2, 3], left=[1, 2, 3], right=[1.2, 2.5, 3.7], color="#B3DE69") show(plot) """ @glyph_method(glyphs.Quadratic) def quadratic(self, *args: Any, **kwargs: Any) -> GlyphRenderer: pass @glyph_method(glyphs.Ray) def ray(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.ray(x=[1, 2, 3], y=[1, 2, 3], length=45, angle=-0.7, color="#FB8072", line_width=2) show(plot) """ @glyph_method(glyphs.Rect) def rect(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.rect(x=[1, 2, 3], y=[1, 2, 3], width=10, height=20, color="#CAB2D6", width_units="screen", height_units="screen") show(plot) """ @glyph_method(glyphs.Step) def step(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.step(x=[1, 2, 3, 4, 5], y=[1, 2, 3, 2, 5], color="#FB8072") show(plot) """ @glyph_method(glyphs.Segment) def segment(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.segment(x0=[1, 2, 3], y0=[1, 2, 3], x1=[1, 2, 3], y1=[1.2, 2.5, 3.7], color="#F4A582", line_width=3) show(plot) """ @marker_method() def square(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.square(x=[1, 2, 3], y=[1, 2, 3], size=[10,20,30], color="#74ADD1") show(plot) """ @marker_method() def square_cross(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.square_cross(x=[1, 2, 3], y=[1, 2, 3], size=[10,20,25], color="#7FC97F",fill_color=None, line_width=2) show(plot) """ @marker_method() def square_dot(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.square_dot(x=[1, 2, 3], y=[1, 2, 3], size=[10,20,25], color="#7FC97F", fill_color=None) show(plot) """ @marker_method() def square_pin(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.square_pin(x=[1, 2, 3], y=[1, 2, 3], size=[10,20,25], color="#7FC97F",fill_color=None, line_width=2) show(plot) """ @marker_method() def square_x(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.square_x(x=[1, 2, 3], y=[1, 2, 3], size=[10,20,25], color="#FDAE6B",fill_color=None, line_width=2) show(plot) """ @marker_method() def star(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.star(x=[1, 2, 3], y=[1, 2, 3], size=20, color="#1C9099", line_width=2) show(plot) """ @marker_method() def star_dot(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.star_dot(x=[1, 2, 3], y=[1, 2, 3], size=20, color="#386CB0", fill_color=None, line_width=2) show(plot) """ @glyph_method(glyphs.Text) def text(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ .. note:: The location and angle of the text relative to the ``x``, ``y`` coordinates is indicated by the alignment and baseline text properties. """ @marker_method() def triangle(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.triangle(x=[1, 2, 3], y=[1, 2, 3], size=[10,20,25], color="#99D594", line_width=2) show(plot) """ @marker_method() def triangle_dot(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.triangle_dot(x=[1, 2, 3], y=[1, 2, 3], size=[10,20,25], color="#99D594", fill_color=None) show(plot) """ @marker_method() def triangle_pin(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.triangle_pin(x=[1, 2, 3], y=[1, 2, 3], size=[10,20,25], color="#99D594", line_width=2) show(plot) """ @glyph_method(glyphs.VArea) def varea(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.varea(x=[1, 2, 3], y1=[0, 0, 0], y2=[1, 4, 2], fill_color="#99D594") show(plot) """ @glyph_method(glyphs.VBar) def vbar(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.vbar(x=[1, 2, 3], width=0.5, bottom=0, top=[1,2,3], color="#CAB2D6") show(plot) """ @glyph_method(glyphs.Wedge) def wedge(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.wedge(x=[1, 2, 3], y=[1, 2, 3], radius=15, start_angle=0.6, end_angle=4.1, radius_units="screen", color="#2b8cbe") show(plot) """ @marker_method() def x(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.x(x=[1, 2, 3], y=[1, 2, 3], size=[10, 20, 25], color="#fa9fb5") show(plot) """ @marker_method() def y(self, *args: Any, **kwargs: Any) -> GlyphRenderer: """ Examples: .. code-block:: python from bokeh.plotting import figure, output_file, show plot = figure(width=300, height=300) plot.y(x=[1, 2, 3], y=[1, 2, 3], size=20, color="#DE2D26") show(plot) """ # ------------------------------------------------------------------------- @glyph_method(glyphs.Scatter) def _scatter(self, *args: Any, **kwargs: Any) -> GlyphRenderer: pass def scatter(self, *args: Any, **kwargs: Any) -> GlyphRenderer: ''' Creates a scatter plot of the given x and y items. Args: x (str or seq[float]) : values or field names of center x coordinates y (str or seq[float]) : values or field names of center y coordinates size (str or list[float]) : values or field names of sizes in |screen units| marker (str, or list[str]): values or field names of marker types color (color value, optional): shorthand to set both fill and line color source (:class:`~bokeh.models.sources.ColumnDataSource`) : a user-supplied data source. An attempt will be made to convert the object to :class:`~bokeh.models.sources.ColumnDataSource` if needed. If none is supplied, one is created for the user automatically. **kwargs: |line properties| and |fill properties| Examples: >>> p.scatter([1,2,3],[4,5,6], marker="square", fill_color="red") >>> p.scatter("data1", "data2", marker="mtype", source=data_source, ...) .. note:: When passing ``marker="circle"`` it is also possible to supply a ``radius`` value in |data units|. When configuring marker type from a data source column, *all* markers including circles may only be configured with ``size`` in |screen units|. ''' marker_type = kwargs.pop("marker", "circle") if isinstance(marker_type, str) and marker_type in _MARKER_SHORTCUTS: marker_type = _MARKER_SHORTCUTS[marker_type] # The original scatter implementation allowed circle scatters to set a # radius. We will leave this here for compatibility but note that it # only works when the marker type is "circle" (and not referencing a # data source column). Consider deprecating in the future. if marker_type == "circle" and "radius" in kwargs: return self.circle(*args, **kwargs) else: return self._scatter(*args, marker=marker_type, **kwargs) _MARKER_SHORTCUTS = { "*" : "asterisk", "+" : "cross", "o" : "circle", "o+" : "circle_cross", "o." : "circle_dot", "ox" : "circle_x", "oy" : "circle_y", "-" : "dash", "." : "dot", "v" : "inverted_triangle", "^" : "triangle", "^." : "triangle_dot", } #----------------------------------------------------------------------------- # Private API #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Code #-----------------------------------------------------------------------------