#!/usr/bin/env python # encoding: utf-8 import numpy as np import matplotlib.pyplot as plt from matplotlib.path import Path from matplotlib.spines import Spine from matplotlib.projections.polar import PolarAxes from matplotlib.projections import register_projection plt.style.use('ggplot') def _radar_factory(num_vars): theta = 2*np.pi * np.linspace(0, 1-1./num_vars, num_vars) theta += np.pi/2 def unit_poly_verts(theta): x0, y0, r = [0.5] * 3 verts = [(r*np.cos(t) + x0, r*np.sin(t) + y0) for t in theta] return verts class RadarAxes(PolarAxes): name = 'radar' RESOLUTION = 1 def fill(self, *args, **kwargs): closed = kwargs.pop('closed', True) return super(RadarAxes, self).fill(closed=closed, *args, **kwargs) def plot(self, *args, **kwargs): lines = super(RadarAxes, self).plot(*args, **kwargs) for line in lines: self._close_line(line) def _close_line(self, line): x, y = line.get_data() # FIXME: markers at x[0], y[0] get doubled-up if x[0] != x[-1]: x = np.concatenate((x, [x[0]])) y = np.concatenate((y, [y[0]])) line.set_data(x, y) def set_varlabels(self, labels): self.set_thetagrids(theta * 180/np.pi, labels) def _gen_axes_patch(self): verts = unit_poly_verts(theta) return plt.Polygon(verts, closed=True, edgecolor='k') def _gen_axes_spines(self): spine_type = 'circle' verts = unit_poly_verts(theta) verts.append(verts[0]) path = Path(verts) spine = Spine(self, spine_type, path) spine.set_transform(self.transAxes) return {'polar': spine} register_projection(RadarAxes) return theta def radar_graph(labels = [], values = [], optimum = []): N = len(labels) theta = _radar_factory(N) max_val = max(max(optimum), max(values)) fig = plt.figure(figsize=(3,3)) ax = fig.add_subplot(1, 1, 1, projection='radar') ax.plot(theta, values, color='k') ax.plot(theta, optimum, color='r') ax.set_varlabels(labels) return fig, ax def my_autopct(values): def my_autopct(pct): total = sum(values) val = int(round(pct*total/100.0)) return f'{val}' return my_autopct def pivot_table_to_pie(pv, pies_per_lines = 3): nbr_pies = len(pv.columns) nbr_cols = min(pies_per_lines, nbr_pies) nbr_rows = max(nbr_pies % nbr_cols,1) f, axs = plt.subplots(nbr_rows, nbr_cols, figsize = (4*nbr_cols,4*nbr_rows)) for (c, ax) in zip(pv, axs.flatten()): datas = pv[c] explode = [0.1]*len(datas) pv[c].plot(kind="pie", ax=ax, use_index = False, title = f"{c} (total={datas.sum()})", legend = False, autopct=my_autopct(datas), explode = explode, ) ax.set_ylabel("") for i in range(nbr_pies//nbr_cols, nbr_cols*nbr_rows): axs.flat[i].axis("off") return (f, axs) # ----------------------------- # Reglages pour 'vim' # vim:set autoindent expandtab tabstop=4 shiftwidth=4: # cursor: 16 del