Skip to content

Commit

Permalink
add preset legends
Browse files Browse the repository at this point in the history
  • Loading branch information
Mr-Milk committed Jun 2, 2022
1 parent 84f9257 commit 2e8b288
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 16 deletions.
3 changes: 2 additions & 1 deletion legendkit/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from ._colorbar import Colorbar, EllipseColorbar
from ._list_legend import ListLegend
from ._preset import CatLegend, SizeLegend
# To register default setting and legend handlers
from ._register import register
from .api import legend
from .handles import SquareItem, RectItem, CircleItem
from .layout import stack, vstack, hstack
from .api import legend

register()
21 changes: 7 additions & 14 deletions legendkit/_list_legend.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ def __init__(self,
legend_handles = []
legend_labels = []

self._has_axes = ax is not None

# If only axes is provided, we will try to get
if (ax is not None) & (legend_items is None) & (handles is None) & (labels is None):
legend_handles, legend_labels = ax.get_legend_handles_labels(handler_map)
Expand All @@ -128,22 +130,13 @@ def __init__(self,
legend_labels.append(label)

if legend_items is None:

# if handles and labels:
# # if got both handles and labels as kwargs, make same length (matplotlib source)
# legend_handles, legend_labels = zip(*zip(handles, labels))
# elif handles is not None and labels is None:
# legend_handles = handles
# legend_labels = [handle.get_label() for handle in handles]
# elif labels is not None and handles is None:
# # Get as many handles as there are labels.
# legend_handles = [handle for handle, label
# in zip(_get_legend_handles([ax], handler_map), labels)]
# else:
# raise TypeError("At least one of the following arguments must be specific, "
# "`ax`, `legend_items`, `handles`, labels`.")
# make matplotlib handles this
legend_handles, legend_labels = handles, labels

# handle location parameters
# we provide extra loc parameters
# ['out left center', 'out ]

frameless_options = dict(
# Dimensions as fraction of font size:
frameon=False,
Expand Down
58 changes: 58 additions & 0 deletions legendkit/_preset.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import numpy as np
from matplotlib.collections import CircleCollection

from legendkit import ListLegend


class CatLegend(ListLegend):
_sizer = {
"small": 0.4,
"medium": 0.7,
"large": 1.0,
}

def __init__(self, colors, labels, size="small", handle=None, **kwargs):
if handle is None:
handle = 'square'

legend_items = [(handle, name, {'color': c}) for c, name in zip(colors, labels)]

side = self._sizer[size]

super().__init__(legend_items=legend_items,
handleheight=side,
handlelength=side,
handletextpad=0.5,
labelspacing=0.2,
**kwargs)


class SizeLegend(ListLegend):
"""A special class use to create legend that represent size"""

def __init__(self, sizes, colors=None, labels=None, num=5, forceint=True, ascending=True, **kwargs):

smin, smax = np.nanmin(sizes), np.nanmax(sizes)
dtype = int if forceint else float
handles_sizes = np.linspace(smin, smax, num=num, dtype=dtype)
if colors is None:
colors = ['black' for _ in range(num)]
if labels is None:
labels = [None for _ in range(num)]

size_handles = []
size_labels = []

for s, label, color in zip(handles_sizes, labels, colors):
size_handles.append(
CircleCollection([s], facecolors=color)
)
if label is None:
label = s
size_labels.append(label)

if not ascending:
size_handles = size_handles[::-1]
size_labels = size_labels[::-1]

super().__init__(handles=size_handles, labels=size_labels, **kwargs)
2 changes: 1 addition & 1 deletion legendkit/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@


def legend(*args, **kwargs):
return ListLegend(*args, **kwargs)
return ListLegend(*args, **kwargs)
1 change: 1 addition & 0 deletions legendkit/handles.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,6 @@ class CircleItem(Patch, ABC):

class LineItem(Line2D, ABC):
"""Create line for legend handles"""

def __init__(self, *args, **kwargs):
super().__init__([], [], *args, **kwargs)

0 comments on commit 2e8b288

Please sign in to comment.