{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2026-04-14T19:08:32.965097557Z",
     "start_time": "2026-04-14T19:08:31.082618587Z"
    }
   },
   "source": [
    "%matplotlib inline\n",
    "import mapel.elections as mapel\n",
    "\n",
    "experiment = mapel.prepare_online_ordinal_experiment()\n",
    "experiment.add_family(culture_id='ic', size=10,\n",
    "                      color='green', marker='x', label='IC')\n",
    "experiment.add_family(culture_id='norm-mallows', size=10,\n",
    "                      params={'normphi': 0.5},\n",
    "                      color='blue', marker='o',\n",
    "                      label='Norm-Mallows')\n",
    "experiment.add_family(culture_id='mallows', size=10,\n",
    "                      params={'phi': 0.5},\n",
    "                      color='red', marker='o',\n",
    "                      label='Mallows')\n",
    "experiment.add_family(culture_id='urn', size=10,\n",
    "                      params={'alpha': 0.05},\n",
    "                      color='yellow', marker='o',\n",
    "                      label='Urn-0.5')\n",
    "experiment.compute_distances(distance_id='emd-positionwise')\n",
    "experiment.embed_2d(embedding_id='mds')\n",
    "experiment.print_map_2d()"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Computing distances: 100%|██████████| 780/780 [00:00<00:00, 1006.87it/s]\n"
     ]
    },
    {
     "ename": "ValueError",
     "evalue": "alpha (3.774658402367415) is outside 0-1 range",
     "output_type": "error",
     "traceback": [
      "\u001B[31m---------------------------------------------------------------------------\u001B[39m",
      "\u001B[31mValueError\u001B[39m                                Traceback (most recent call last)",
      "\u001B[36mCell\u001B[39m\u001B[36m \u001B[39m\u001B[32mIn[21]\u001B[39m\u001B[32m, line 21\u001B[39m\n\u001B[32m     17\u001B[39m                       color=\u001B[33m'yellow'\u001B[39m, marker=\u001B[33m'o'\u001B[39m,\n\u001B[32m     18\u001B[39m                       label=\u001B[33m'Urn-0.5'\u001B[39m)\n\u001B[32m     19\u001B[39m experiment.compute_distances(distance_id=\u001B[33m'emd-positionwise'\u001B[39m)\n\u001B[32m     20\u001B[39m experiment.embed_2d(embedding_id=\u001B[33m'mds'\u001B[39m)\n\u001B[32m---> \u001B[39m\u001B[32m21\u001B[39m experiment.print_map_2d()\n",
      "\u001B[36mFile \u001B[39m\u001B[32m~/PythonProject/.venv/lib/python3.12/site-packages/mapel/core/objects/Experiment.py:178\u001B[39m, in \u001B[36mExperiment.print_map_2d\u001B[39m\u001B[34m(self, **kwargs)\u001B[39m\n\u001B[32m    177\u001B[39m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34mprint_map_2d\u001B[39m(\u001B[38;5;28mself\u001B[39m, **kwargs) -> \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[32m--> \u001B[39m\u001B[32m178\u001B[39m     \u001B[43mpr\u001B[49m\u001B[43m.\u001B[49m\u001B[43mprint_map_2d\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m*\u001B[49m\u001B[43m*\u001B[49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n",
      "\u001B[36mFile \u001B[39m\u001B[32m~/PythonProject/.venv/lib/python3.12/site-packages/mapel/core/printing.py:164\u001B[39m, in \u001B[36mprint_map_2d\u001B[39m\u001B[34m(experiment, return_map, xlabel, legend_pos, title_pos, angle, reverse, update, axis, textual, textual_size, title, bbox_inches, saveas, show, tex, legend, dpi, title_size, figsize, pad_inches, mask)\u001B[39m\n\u001B[32m    157\u001B[39m     plt.axis(\u001B[33m'\u001B[39m\u001B[33moff\u001B[39m\u001B[33m'\u001B[39m)\n\u001B[32m    159\u001B[39m _add_textual(experiment=experiment,\n\u001B[32m    160\u001B[39m              textual=textual,\n\u001B[32m    161\u001B[39m              ax=ax,\n\u001B[32m    162\u001B[39m              size=textual_size)\n\u001B[32m--> \u001B[39m\u001B[32m164\u001B[39m \u001B[43m_basic_coloring\u001B[49m\u001B[43m(\u001B[49m\u001B[43mexperiment\u001B[49m\u001B[43m=\u001B[49m\u001B[43mexperiment\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m    165\u001B[39m \u001B[43m                \u001B[49m\u001B[43max\u001B[49m\u001B[43m=\u001B[49m\u001B[43max\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m    166\u001B[39m \u001B[43m                \u001B[49m\u001B[43mdim\u001B[49m\u001B[43m=\u001B[49m\u001B[32;43m2\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[32m    168\u001B[39m _basic_background(ax=ax,\n\u001B[32m    169\u001B[39m                   legend=legend,\n\u001B[32m    170\u001B[39m                   pad_inches=pad_inches,\n\u001B[32m   (...)\u001B[39m\u001B[32m    178\u001B[39m                   dpi=dpi,\n\u001B[32m    179\u001B[39m                   mask=mask)\n\u001B[32m    181\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m return_map:\n",
      "\u001B[36mFile \u001B[39m\u001B[32m~/PythonProject/.venv/lib/python3.12/site-packages/mapel/core/printing.py:1043\u001B[39m, in \u001B[36m_basic_coloring\u001B[39m\u001B[34m(experiment, ax, dim)\u001B[39m\n\u001B[32m   1035\u001B[39m         ax.scatter(experiment.coordinates_by_families[family.family_id][\u001B[32m0\u001B[39m][i],\n\u001B[32m   1036\u001B[39m                    experiment.coordinates_by_families[family.family_id][\u001B[32m1\u001B[39m][i],\n\u001B[32m   1037\u001B[39m                    color=color,\n\u001B[32m   (...)\u001B[39m\u001B[32m   1040\u001B[39m                    s=ms,\n\u001B[32m   1041\u001B[39m                    marker=marker)\n\u001B[32m   1042\u001B[39m     \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[32m-> \u001B[39m\u001B[32m1043\u001B[39m         \u001B[43max\u001B[49m\u001B[43m.\u001B[49m\u001B[43mscatter\u001B[49m\u001B[43m(\u001B[49m\u001B[43mexperiment\u001B[49m\u001B[43m.\u001B[49m\u001B[43mcoordinates_by_families\u001B[49m\u001B[43m[\u001B[49m\u001B[43mfamily\u001B[49m\u001B[43m.\u001B[49m\u001B[43mfamily_id\u001B[49m\u001B[43m]\u001B[49m\u001B[43m[\u001B[49m\u001B[32;43m0\u001B[39;49m\u001B[43m]\u001B[49m\u001B[43m[\u001B[49m\u001B[43mi\u001B[49m\u001B[43m]\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m   1044\u001B[39m \u001B[43m                   \u001B[49m\u001B[43mexperiment\u001B[49m\u001B[43m.\u001B[49m\u001B[43mcoordinates_by_families\u001B[49m\u001B[43m[\u001B[49m\u001B[43mfamily\u001B[49m\u001B[43m.\u001B[49m\u001B[43mfamily_id\u001B[49m\u001B[43m]\u001B[49m\u001B[43m[\u001B[49m\u001B[32;43m1\u001B[39;49m\u001B[43m]\u001B[49m\u001B[43m[\u001B[49m\u001B[43mi\u001B[49m\u001B[43m]\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m   1045\u001B[39m \u001B[43m                   \u001B[49m\u001B[43mcolor\u001B[49m\u001B[43m=\u001B[49m\u001B[43mcolor\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m   1046\u001B[39m \u001B[43m                   \u001B[49m\u001B[43malpha\u001B[49m\u001B[43m=\u001B[49m\u001B[43malpha\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m   1047\u001B[39m \u001B[43m                   \u001B[49m\u001B[43ms\u001B[49m\u001B[43m=\u001B[49m\u001B[43mms\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m   1048\u001B[39m \u001B[43m                   \u001B[49m\u001B[43mmarker\u001B[49m\u001B[43m=\u001B[49m\u001B[43mmarker\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m   1050\u001B[39m \u001B[38;5;28;01melif\u001B[39;00m dim == \u001B[32m3\u001B[39m:\n\u001B[32m   1051\u001B[39m     \u001B[38;5;28;01mif\u001B[39;00m i == (family.size - \u001B[32m1\u001B[39m):  \u001B[38;5;66;03m# for the legend\u001B[39;00m\n",
      "\u001B[36mFile \u001B[39m\u001B[32m~/PythonProject/.venv/lib/python3.12/site-packages/matplotlib/__init__.py:1476\u001B[39m, in \u001B[36m_preprocess_data.<locals>.inner\u001B[39m\u001B[34m(ax, data, *args, **kwargs)\u001B[39m\n\u001B[32m   1473\u001B[39m \u001B[38;5;129m@functools\u001B[39m.wraps(func)\n\u001B[32m   1474\u001B[39m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34minner\u001B[39m(ax, *args, data=\u001B[38;5;28;01mNone\u001B[39;00m, **kwargs):\n\u001B[32m   1475\u001B[39m     \u001B[38;5;28;01mif\u001B[39;00m data \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[32m-> \u001B[39m\u001B[32m1476\u001B[39m         \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mfunc\u001B[49m\u001B[43m(\u001B[49m\n\u001B[32m   1477\u001B[39m \u001B[43m            \u001B[49m\u001B[43max\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m   1478\u001B[39m \u001B[43m            \u001B[49m\u001B[43m*\u001B[49m\u001B[38;5;28;43mmap\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43msanitize_sequence\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43margs\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m   1479\u001B[39m \u001B[43m            \u001B[49m\u001B[43m*\u001B[49m\u001B[43m*\u001B[49m\u001B[43m{\u001B[49m\u001B[43mk\u001B[49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43msanitize_sequence\u001B[49m\u001B[43m(\u001B[49m\u001B[43mv\u001B[49m\u001B[43m)\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mfor\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43mk\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mv\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;129;43;01min\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43mkwargs\u001B[49m\u001B[43m.\u001B[49m\u001B[43mitems\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[43m}\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m   1481\u001B[39m     bound = new_sig.bind(ax, *args, **kwargs)\n\u001B[32m   1482\u001B[39m     auto_label = (bound.arguments.get(label_namer)\n\u001B[32m   1483\u001B[39m                   \u001B[38;5;129;01mor\u001B[39;00m bound.kwargs.get(label_namer))\n",
      "\u001B[36mFile \u001B[39m\u001B[32m~/PythonProject/.venv/lib/python3.12/site-packages/matplotlib/axes/_axes.py:4876\u001B[39m, in \u001B[36mAxes.scatter\u001B[39m\u001B[34m(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, edgecolors, plotnonfinite, **kwargs)\u001B[39m\n\u001B[32m   4870\u001B[39m         linewidths = [\n\u001B[32m   4871\u001B[39m             lw \u001B[38;5;28;01mif\u001B[39;00m lw \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;28;01melse\u001B[39;00m mpl.rcParams[\u001B[33m'\u001B[39m\u001B[33mlines.linewidth\u001B[39m\u001B[33m'\u001B[39m]\n\u001B[32m   4872\u001B[39m             \u001B[38;5;28;01mfor\u001B[39;00m lw \u001B[38;5;129;01min\u001B[39;00m linewidths]\n\u001B[32m   4874\u001B[39m offsets = np.ma.column_stack([x, y])\n\u001B[32m-> \u001B[39m\u001B[32m4876\u001B[39m collection = \u001B[43mmcoll\u001B[49m\u001B[43m.\u001B[49m\u001B[43mPathCollection\u001B[49m\u001B[43m(\u001B[49m\n\u001B[32m   4877\u001B[39m \u001B[43m    \u001B[49m\u001B[43m(\u001B[49m\u001B[43mpath\u001B[49m\u001B[43m,\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mscales\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m   4878\u001B[39m \u001B[43m    \u001B[49m\u001B[43mfacecolors\u001B[49m\u001B[43m=\u001B[49m\u001B[43mcolors\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m   4879\u001B[39m \u001B[43m    \u001B[49m\u001B[43medgecolors\u001B[49m\u001B[43m=\u001B[49m\u001B[43medgecolors\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m   4880\u001B[39m \u001B[43m    \u001B[49m\u001B[43mlinewidths\u001B[49m\u001B[43m=\u001B[49m\u001B[43mlinewidths\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m   4881\u001B[39m \u001B[43m    \u001B[49m\u001B[43moffsets\u001B[49m\u001B[43m=\u001B[49m\u001B[43moffsets\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m   4882\u001B[39m \u001B[43m    \u001B[49m\u001B[43moffset_transform\u001B[49m\u001B[43m=\u001B[49m\u001B[43mkwargs\u001B[49m\u001B[43m.\u001B[49m\u001B[43mpop\u001B[49m\u001B[43m(\u001B[49m\u001B[33;43m'\u001B[39;49m\u001B[33;43mtransform\u001B[39;49m\u001B[33;43m'\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43mtransData\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m   4883\u001B[39m \u001B[43m    \u001B[49m\u001B[43malpha\u001B[49m\u001B[43m=\u001B[49m\u001B[43malpha\u001B[49m\u001B[43m,\u001B[49m\n\u001B[32m   4884\u001B[39m \u001B[43m\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m   4885\u001B[39m collection.set_transform(mtransforms.IdentityTransform())\n\u001B[32m   4886\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m colors \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n",
      "\u001B[36mFile \u001B[39m\u001B[32m~/PythonProject/.venv/lib/python3.12/site-packages/matplotlib/collections.py:1027\u001B[39m, in \u001B[36mPathCollection.__init__\u001B[39m\u001B[34m(self, paths, sizes, **kwargs)\u001B[39m\n\u001B[32m   1013\u001B[39m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34m__init__\u001B[39m(\u001B[38;5;28mself\u001B[39m, paths, sizes=\u001B[38;5;28;01mNone\u001B[39;00m, **kwargs):\n\u001B[32m   1014\u001B[39m \u001B[38;5;250m    \u001B[39m\u001B[33;03m\"\"\"\u001B[39;00m\n\u001B[32m   1015\u001B[39m \u001B[33;03m    Parameters\u001B[39;00m\n\u001B[32m   1016\u001B[39m \u001B[33;03m    ----------\u001B[39;00m\n\u001B[32m   (...)\u001B[39m\u001B[32m   1024\u001B[39m \u001B[33;03m        Forwarded to `.Collection`.\u001B[39;00m\n\u001B[32m   1025\u001B[39m \u001B[33;03m    \"\"\"\u001B[39;00m\n\u001B[32m-> \u001B[39m\u001B[32m1027\u001B[39m     \u001B[38;5;28;43msuper\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[43m.\u001B[49m\u001B[34;43m__init__\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43m*\u001B[49m\u001B[43m*\u001B[49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m   1028\u001B[39m     \u001B[38;5;28mself\u001B[39m.set_paths(paths)\n\u001B[32m   1029\u001B[39m     \u001B[38;5;28mself\u001B[39m.set_sizes(sizes)\n",
      "\u001B[36mFile \u001B[39m\u001B[32m~/PythonProject/.venv/lib/python3.12/site-packages/matplotlib/collections.py:206\u001B[39m, in \u001B[36mCollection.__init__\u001B[39m\u001B[34m(self, edgecolors, facecolors, linewidths, linestyles, capstyle, joinstyle, antialiaseds, offsets, offset_transform, norm, cmap, pickradius, hatch, urls, zorder, **kwargs)\u001B[39m\n\u001B[32m    203\u001B[39m \u001B[38;5;28mself\u001B[39m._offset_transform = offset_transform\n\u001B[32m    205\u001B[39m \u001B[38;5;28mself\u001B[39m._path_effects = \u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[32m--> \u001B[39m\u001B[32m206\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43m_internal_update\u001B[49m\u001B[43m(\u001B[49m\u001B[43mkwargs\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m    207\u001B[39m \u001B[38;5;28mself\u001B[39m._paths = \u001B[38;5;28;01mNone\u001B[39;00m\n",
      "\u001B[36mFile \u001B[39m\u001B[32m~/PythonProject/.venv/lib/python3.12/site-packages/matplotlib/artist.py:1216\u001B[39m, in \u001B[36mArtist._internal_update\u001B[39m\u001B[34m(self, kwargs)\u001B[39m\n\u001B[32m   1209\u001B[39m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34m_internal_update\u001B[39m(\u001B[38;5;28mself\u001B[39m, kwargs):\n\u001B[32m   1210\u001B[39m \u001B[38;5;250m    \u001B[39m\u001B[33;03m\"\"\"\u001B[39;00m\n\u001B[32m   1211\u001B[39m \u001B[33;03m    Update artist properties without prenormalizing them, but generating\u001B[39;00m\n\u001B[32m   1212\u001B[39m \u001B[33;03m    errors as if calling `set`.\u001B[39;00m\n\u001B[32m   1213\u001B[39m \n\u001B[32m   1214\u001B[39m \u001B[33;03m    The lack of prenormalization is to maintain backcompatibility.\u001B[39;00m\n\u001B[32m   1215\u001B[39m \u001B[33;03m    \"\"\"\u001B[39;00m\n\u001B[32m-> \u001B[39m\u001B[32m1216\u001B[39m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[43m.\u001B[49m\u001B[43m_update_props\u001B[49m\u001B[43m(\u001B[49m\n\u001B[32m   1217\u001B[39m \u001B[43m        \u001B[49m\u001B[43mkwargs\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[33;43m\"\u001B[39;49m\u001B[38;5;132;43;01m{cls.__name__}\u001B[39;49;00m\u001B[33;43m.set() got an unexpected keyword argument \u001B[39;49m\u001B[33;43m\"\u001B[39;49m\n\u001B[32m   1218\u001B[39m \u001B[43m        \u001B[49m\u001B[33;43m\"\u001B[39;49m\u001B[38;5;132;43;01m{prop_name!r}\u001B[39;49;00m\u001B[33;43m\"\u001B[39;49m\u001B[43m)\u001B[49m\n",
      "\u001B[36mFile \u001B[39m\u001B[32m~/PythonProject/.venv/lib/python3.12/site-packages/matplotlib/artist.py:1192\u001B[39m, in \u001B[36mArtist._update_props\u001B[39m\u001B[34m(self, props, errfmt)\u001B[39m\n\u001B[32m   1189\u001B[39m             \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28mcallable\u001B[39m(func):\n\u001B[32m   1190\u001B[39m                 \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mAttributeError\u001B[39;00m(\n\u001B[32m   1191\u001B[39m                     errfmt.format(\u001B[38;5;28mcls\u001B[39m=\u001B[38;5;28mtype\u001B[39m(\u001B[38;5;28mself\u001B[39m), prop_name=k))\n\u001B[32m-> \u001B[39m\u001B[32m1192\u001B[39m             ret.append(\u001B[43mfunc\u001B[49m\u001B[43m(\u001B[49m\u001B[43mv\u001B[49m\u001B[43m)\u001B[49m)\n\u001B[32m   1193\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m ret:\n\u001B[32m   1194\u001B[39m     \u001B[38;5;28mself\u001B[39m.pchanged()\n",
      "\u001B[36mFile \u001B[39m\u001B[32m~/PythonProject/.venv/lib/python3.12/site-packages/matplotlib/collections.py:848\u001B[39m, in \u001B[36mCollection.set_alpha\u001B[39m\u001B[34m(self, alpha)\u001B[39m\n\u001B[32m    836\u001B[39m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[34mset_alpha\u001B[39m(\u001B[38;5;28mself\u001B[39m, alpha):\n\u001B[32m    837\u001B[39m \u001B[38;5;250m    \u001B[39m\u001B[33;03m\"\"\"\u001B[39;00m\n\u001B[32m    838\u001B[39m \u001B[33;03m    Set the transparency of the collection.\u001B[39;00m\n\u001B[32m    839\u001B[39m \n\u001B[32m   (...)\u001B[39m\u001B[32m    846\u001B[39m \u001B[33;03m        supported.\u001B[39;00m\n\u001B[32m    847\u001B[39m \u001B[33;03m    \"\"\"\u001B[39;00m\n\u001B[32m--> \u001B[39m\u001B[32m848\u001B[39m     \u001B[43martist\u001B[49m\u001B[43m.\u001B[49m\u001B[43mArtist\u001B[49m\u001B[43m.\u001B[49m\u001B[43m_set_alpha_for_array\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43malpha\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m    849\u001B[39m     \u001B[38;5;28mself\u001B[39m._set_facecolor(\u001B[38;5;28mself\u001B[39m._original_facecolor)\n\u001B[32m    850\u001B[39m     \u001B[38;5;28mself\u001B[39m._set_edgecolor(\u001B[38;5;28mself\u001B[39m._original_edgecolor)\n",
      "\u001B[36mFile \u001B[39m\u001B[32m~/PythonProject/.venv/lib/python3.12/site-packages/matplotlib/artist.py:1030\u001B[39m, in \u001B[36mArtist._set_alpha_for_array\u001B[39m\u001B[34m(self, alpha)\u001B[39m\n\u001B[32m   1028\u001B[39m     \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mTypeError\u001B[39;00m(\u001B[33m\"\u001B[39m\u001B[33malpha must be numeric or None, not a string\u001B[39m\u001B[33m\"\u001B[39m)\n\u001B[32m   1029\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m np.iterable(alpha):\n\u001B[32m-> \u001B[39m\u001B[32m1030\u001B[39m     \u001B[43mArtist\u001B[49m\u001B[43m.\u001B[49m\u001B[43mset_alpha\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43malpha\u001B[49m\u001B[43m)\u001B[49m\n\u001B[32m   1031\u001B[39m     \u001B[38;5;28;01mreturn\u001B[39;00m\n\u001B[32m   1032\u001B[39m alpha = np.asarray(alpha)\n",
      "\u001B[36mFile \u001B[39m\u001B[32m~/PythonProject/.venv/lib/python3.12/site-packages/matplotlib/artist.py:1011\u001B[39m, in \u001B[36mArtist.set_alpha\u001B[39m\u001B[34m(self, alpha)\u001B[39m\n\u001B[32m   1008\u001B[39m     \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mTypeError\u001B[39;00m(\n\u001B[32m   1009\u001B[39m         \u001B[33mf\u001B[39m\u001B[33m'\u001B[39m\u001B[33malpha must be numeric or None, not \u001B[39m\u001B[38;5;132;01m{\u001B[39;00m\u001B[38;5;28mtype\u001B[39m(alpha)\u001B[38;5;132;01m}\u001B[39;00m\u001B[33m'\u001B[39m)\n\u001B[32m   1010\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m alpha \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;129;01mand\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m (\u001B[32m0\u001B[39m <= alpha <= \u001B[32m1\u001B[39m):\n\u001B[32m-> \u001B[39m\u001B[32m1011\u001B[39m     \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\u001B[33mf\u001B[39m\u001B[33m'\u001B[39m\u001B[33malpha (\u001B[39m\u001B[38;5;132;01m{\u001B[39;00malpha\u001B[38;5;132;01m}\u001B[39;00m\u001B[33m) is outside 0-1 range\u001B[39m\u001B[33m'\u001B[39m)\n\u001B[32m   1012\u001B[39m \u001B[38;5;28;01mif\u001B[39;00m alpha != \u001B[38;5;28mself\u001B[39m._alpha:\n\u001B[32m   1013\u001B[39m     \u001B[38;5;28mself\u001B[39m._alpha = alpha\n",
      "\u001B[31mValueError\u001B[39m: alpha (3.774658402367415) is outside 0-1 range"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 640x640 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    }
   ],
   "execution_count": 21
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-04-14T19:08:21.018222942Z",
     "start_time": "2026-04-14T19:08:20.988600233Z"
    }
   },
   "cell_type": "code",
   "source": "",
   "id": "8f22701a4e6f1d5d",
   "outputs": [],
   "execution_count": 20
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "more resources available at: https://home.agh.edu.pl/~pragma/tutorials/aaai24/\n",
    "\n",
    "\n",
    "code at github: https://github.com/science-for-democracy/mapof"
   ],
   "id": "cdc4c8839b29302e"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
