Skip to content

Instantly share code, notes, and snippets.

@justheuristic
Last active January 30, 2019 17:51
Show Gist options
  • Save justheuristic/f4b6d256be1622e9c9887e6f8f57b5b5 to your computer and use it in GitHub Desktop.
Save justheuristic/f4b6d256be1622e9c9887e6f8f57b5b5 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Foxота\n",
"\n",
"![img](https://media.giphy.com/media/TdMVH60kJvTMI/giphy.gif)\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from foxualizer import draw_foxtable\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"data = np.array([\n",
" [[0.00, 0.00, 0.00], [0.41, 0.20, 0.00], [1.00, 0.79, 0.50]],\n",
" [[0.00, 0.55, 0.75], [0.50, 0.50, 0.10], [0.00, 0.33, 0.00]],\n",
" [[0.20, 0.01, 0.00], [0.30, 0.00, 0.50], [0.44, 0.24, 0.00]],\n",
"])\n",
"\n",
"cmaps = [\n",
" plt.get_cmap('Greens'),\n",
" plt.get_cmap('Purples'),\n",
" lambda x: [1.0, 1.0 - x, 1.0 - x, 1.0],\n",
"]\n",
"# ^-- colormap is any function that takes x \\in [0, 1]\n",
"# and returns RGBA vector with each component also \\in [0, 1]\n",
"# All default colormaps: \n",
"# https://matplotlib.org/examples/color/colormaps_reference.html\n",
"# Custom example:\n",
"# lambda x: [1.0, 1.0 - x, 1.0 - x, 1.0] # white-to-red cmap"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 360x360 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"draw_foxtable(data, cmaps, show_zeros=True, figsize=[5,5], );"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 360x360 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"ax = draw_foxtable(data, cmaps, show_zeros=True, ticks=True, figsize=[5,5], );"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as p
from matplotlib.collections import PatchCollection
from itertools import chain
import descartes, shapely.geometry as sg # install: !pip3 install --user shapely descartes
deg_sin = lambda a: np.sin(a * (2 * np.pi / 360.0))
deg_cos = lambda a: np.cos(a * (2 * np.pi / 360.0))
def draw_sectors(x, y, proportions, colors, captions=None, r=1.0, offset_angle=225):
if captions is None:
captions = [''] * len(proportions)
assert np.min(proportions) >= 0 and len(proportions) == len(colors) == len(captions)
assert np.shape(colors) in {(len(proportions), 3), (len(proportions), 4)}, 'colors must be rgb or rgba'
canonic_arc = lambda angle1, angle2: sorted([(offset_angle - angle1), (offset_angle - angle2)])
denominator = np.sum(proportions) if any(proportions > 0) else 1.0
d_angles = proportions / denominator * 360.0
angle = 0.0
shell = sg.Polygon([[x - r, y - r], [x + r, y - r], [x + r, y + r], [x - r, y + r]])
patches, annotations = [], []
for d_angle, color, text in zip(d_angles, colors, captions):
if d_angle == 0: continue
theta1, theta2 = canonic_arc(angle, angle + d_angle)
shell = sg.Polygon([[x - r, y - r], [x + r, y - r], [x + r, y + r], [x - r, y + r]])
shifted_theta2 = theta2 if theta2 >= theta1 else theta2 + 360
dx, dy = deg_cos((theta1 + shifted_theta2) / 2), deg_sin((theta1 + shifted_theta2) / 2)
if np.allclose(shifted_theta2 - theta1, 360):
wedge = shell
else:
wedge = sg.Polygon([
(x, y),
(x + 2 * r * deg_cos(theta1), y + 2 * r * deg_sin(theta1)),
(x + 2 * r * (deg_cos(theta1)) + dx,
y + 2 * r * (deg_sin(theta1)) + dy),
(x + 2 * r * (deg_cos(theta2)) + dx,
y + 2 * r * (deg_sin(theta2)) + dy),
(x + 2 * r * deg_cos(theta2), y + 2 * r * deg_sin(theta2)),
])
mesh = shell.intersection(wedge)
patches.append(descartes.PolygonPatch(mesh, color=color))
annotations.append(dict(s=text, xy=(mesh.centroid.x, mesh.centroid.y)))
angle += d_angle
return patches, annotations
def draw_foxtable(data, cmaps, show=True, show_zeros=False, colorbars=True,
annotation_params=None, ticks=False, caption_format='{:0.4}',
**kwargs):
"""
:param data: a 3d array [height, width, n_components] of values of each component
Values should be in [0, 1] and at least one value must be positive
:param cmaps: a list[n_components] of colormaps - mappings from values in data to rgba colors
colormap is any function that takes x \in [0, 1]
and returns RGBA vector with each component also \in [0, 1]
All default colormaps:
https://matplotlib.org/examples/color/colormaps_reference.html
Custom example:
lambda x: [1.0, 1.0 - x, 1.0 - x, 1.0] # white-to-red cmap
"""
assert np.min(data) >= 0.0 and np.max(data) <= 1.0 and np.max(data) > 0
assert len(cmaps) == np.shape(data)[-1]
nrow, ncol, n_components = np.shape(data)
i_grid, j_grid = map(np.ravel, np.meshgrid(np.arange(nrow), np.arange(ncol)))
get_colors = lambda values: np.array([cmap(val) for cmap, val in zip(cmaps, values)])
get_proportions = lambda values: np.ones_like(values) if show_zeros else (values > 0)
get_captions = lambda values: [caption_format.format(value) for value in values]
patches, annotations = zip(*chain(*(
iter(zip(*draw_sectors(j, nrow - i - 1, get_proportions(data[i, j]), get_colors(data[i, j]),
captions=get_captions(data[i, j]), r=0.5)))
for i, j in zip(i_grid, j_grid)
)))
fig, ax = plt.subplots(**kwargs)
ax.add_collection(PatchCollection(patches, match_original=True))
for ann in annotations:
ax.annotate(**ann, **dict(ha='center', va='center', **(annotation_params or {})))
if show:
ax.set_ylim(-0.5, nrow - 0.5)
ax.set_xlim(-0.5, ncol - 0.5)
if ticks:
ax.set_xticks(np.arange(ncol))
ax.set_yticks(np.arange(nrow))
ax.set_yticklabels(np.arange(nrow)[::-1])
else:
ax.set_xticks([])
ax.set_yticks([])
plt.show()
return ax
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment