Skip to content

Instantly share code, notes, and snippets.

@fomightez
Last active December 8, 2022 21:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fomightez/405e049fa082cca9b7a0ef0bee904b4f to your computer and use it in GitHub Desktop.
Save fomightez/405e049fa082cca9b7a0ef0bee904b4f to your computer and use it in GitHub Desktop.
For reply to StackOverflow 74683522
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "8ed4f391-9523-4097-800e-880e0de32dae",
"metadata": {},
"source": [
"## For [How do I construct a python function where the input in python code and output is ipython rich output (in HTML)?](https://stackoverflow.com/q/74683522/8508004), based on [Can I capture rich outputs in plain python sessions ?](https://github.com/ipython/ipython/issues/11163#issuecomment-393338313), and [Module: utils.capture](https://ipython.readthedocs.io/en/stable/api/generated/IPython.utils.capture.html)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "74eb9d02-8625-4410-9fff-98128780acba",
"metadata": {},
"outputs": [],
"source": [
"pycode = '''\n",
"from matplotlib import pyplot as plt\n",
"plt.plot([1, 2, 3])\n",
"plt.show()\n",
"'''\n",
"from IPython.utils import io\n",
"with io.capture_output() as captured:\n",
" exec(pycode)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "598e69db-28a2-4cc1-9b3d-e09ac6d7e05d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"IPython.utils.capture.CapturedIO"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(captured)"
]
},
{
"cell_type": "markdown",
"id": "412e4d52-92e0-42d7-821a-9d0a3ea6ddf0",
"metadata": {},
"source": [
"Based on and [Module: utils.capture](https://ipython.readthedocs.io/en/stable/api/generated/IPython.utils.capture.html)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "2b30add3-33f7-4dc9-9711-ae8ea1b998d4",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAoaklEQVR4nO3dd3hUddr/8fdN7zV0CKFKRzCCBQtWQFFR91nUtbu4PrqPblFQLKisdXfVXXURFZVdy7oEFBEFVBQbKLCQhNBC772EnnL//pjD/mYxgQlMMsnk87quuTLz/Z4zc+dk+GRyzuE+5u6IiEj8KhfrAkREpGgp6EVE4pyCXkQkzinoRUTinIJeRCTOVYh1AflJSEjwpKSkWJchIlJqzJkzZ6u7N8hvrkQGfVJSErNnz451GSIipYaZrSpoTrtuRETinIJeRCTOKehFROKcgl5EJM4p6EVE4twxg97MqpjZD2Y238wWmNmj+SxT2cz+aWaZZjbLzJLC5u4Pxheb2cVRrl9ERI4hkk/0B4Hz3L07cDLQz8xOO2KZW4Ed7t4WeA54GsDMOgGDgc5AP+BlMysfpdpFRCQCxwx6D9kTPKwY3I7sbXw58FZwfxxwvplZMP6eux909xVAJtArKpWLiMSRH1duZ9RXy4rkuSPaR29m5c1sHrAZmObus45YpBmwBsDdc4BdQP3w8cDaYCy/1xhiZrPNbPaWLVsK9U2IiJRWew7m8PCH6fxs1Pe8M2s1+w7lRP01Igp6d89195OB5kAvM+sS7ULcfbS7J7t7coMG+f4vXhGRuPLVki1c/NwM/j5zFTefmcQnd59FtUrRb1hQqGd0951mNp3Q/vb0sKl1QAtgrZlVAGoD28LGD2sejImIlFk79h7i8Y8zGD93HW0b1mDcr87glJZ1i+z1IjnrpoGZ1QnuVwUuBBYdsdhE4Mbg/tXAFx66RuFEYHBwVk4roB3wQ5RqFxEpVdydyWkbuPC5r5g4bz2/Pq8tH/9fnyINeYjsE30T4K3gbJlywPvuPsnMHgNmu/tE4HXg72aWCWwndKYN7r7AzN4HMoAc4E53zy2Kb0REpCTbvPsAD32YzpQFm+jarDZjb+lNp6a1iuW1rSReHDw5OdnVvVJE4oG78685axk5KYODOXn85sL23NanFRXKR/f/q5rZHHdPzm+uRLYpFhGJB2u27+P+8Wl8k7mVXkn1eOqqrrRuUKPY61DQi4hEWW6e89Z3K3l2ymLKlzMev6IL1/VKpFw5i0k9CnoRkShauimLoSmpzF29k3NPasATg7rStE7VmNakoBcRiYLs3DxGfbmMv36RSfXK5Xn+5ydz+clNCTUJiC0FvYjICUpbu4t7x81n0cYsLu3WhBGXdSahRuVYl/UfCnoRkeN0IDuX5z5bwqszlpNQozKjrz+Fizo3jnVZP6GgFxE5DjOXb+P+8Wms2LqXa3q1YFj/jtSuWjHWZeVLQS8iUghZB7J56pNFvD1rNYn1qvHObb05o21CrMs6KgW9iEiEpi/azAMT0ti0+wC39WnFby9qXyRNyKKt5FcoIhJj2/ce4rGPFvDBvPW0a1iDl+84gx6JRdufJpoU9CIiBXB3JqVuYMTEBezan83d57fjf/u2oXKF0nWhPAW9iEg+Nu0+wPAJ6Xy2cBPdmtfm7V/2pkPj4mlCFm0KehGRMO7OP39cwx8mLyQ7N4/hAzpy85lJUW9CVpwU9CIigVXb9jIsJY3vl2/jtNb1eOrKbiQlVI91WSdMQS8iZV5unvPGtyv449TFVCxXjicGdWXwqS1i1oQs2hT0IlKmLd6YxX0pqcxfs5PzOzRk5KAuNKkd2yZk0XbMoDezFsBYoBHgwGh3f+GIZe4Frgt7zo5AA3ffbmYrgSwgF8gpqDG+iEhxOpSTx8tfZvLS9ExqVqnIC4NP5rLuJaMJWbRF8ok+B/idu881s5rAHDOb5u4Zhxdw92eBZwHMbCDwG3ffHvYcfd19azQLFxE5XvPW7GTouFQWb8ri8pOb8vClnahfgpqQRdsxg97dNwAbgvtZZrYQaEboOrD5uQZ4N2oViohEyf5Dufx52mJe/2YFDWtW4fUbkzm/Y6NYl1XkCrWP3sySgB7ArALmqwH9gLvChh2YamYOvOLuowtYdwgwBCAxMbEwZYmIHNN3y7YyLCWN1dv3cW3vRIb170CtKiWzCVm0RRz0ZlYDSAHucffdBSw2EPj2iN02fdx9nZk1BKaZ2SJ3n3HkisEvgNEQujh4xN+BiMhR7D6QzZOTF/HuD6tpWb8a7/7yNE5vUz/WZRWriILezCoSCvm33X38URYdzBG7bdx9XfB1s5lNAHoBPwl6EZFo+yxjE8M/SGNL1kGGnN2a31zQnqqVSlf7gmiI5KwbA14HFrr7n4+yXG3gHOAXYWPVgXLBvv3qwEXAYydctYjIUWzbc5BHP8pg4vz1dGhck9HXJ9O9RZ1YlxUzkXyiPxO4Hkgzs3nB2ANAIoC7jwrGBgFT3X1v2LqNgAnB6UoVgHfc/dMo1C0i8hPuzsT56xkxcQF7Dubwmwvac8e5bahUofS2L4iGSM66+QY45oml7v4m8OYRY8uB7sdZm4hIxNbv3M+DH6TzxaLNnNyiDs9c3Y32jWrGuqwSQf8zVkRKtbw8590fV/Pk5EXk5jkPXdqJm85IonyctC+IBgW9iJRaK7buZVhKKrNWbOfMtvV5clA3EutXi3VZJY6CXkRKnZzcPMZ8u4I/TV1CpQrlePqqrvxPcou4bF8QDQp6ESlVFm7YzdCUVFLX7uLCTo0YeUUXGtWqEuuySjQFvYiUCgdzcnnpi0xe/nIZtatW5MVre3BJ1yb6FB8BBb2IlHhzV+9g6LhUlm7ew5U9mvHQpZ2oW71SrMsqNRT0IlJi7TuUwx+nLOGN71bQpFYV3rj5VPqe1DDWZZU6CnoRKZG+zdzKsPGprNm+n+tPa8l9/U6iZhlpQhZtCnoRKVF27c/miY8X8s/Za2iVUJ1/DjmN3q3LVhOyaFPQi0iJMWXBRh76IJ1tew/xq3PacM8F7ahSsew1IYs2Bb2IxNyWrIOMmLiAj9M20LFJLV6/8VS6Nq8d67LihoJeRGLG3Znw73U8NimDfQdz+f1F7bn9nDZULF+2m5BFm4JeRGJi3c79DJ+QxpeLt9AzMdSErG1DNSErCgp6ESlWeXnO27NW8dQni3BgxMBOXH+6mpAVJQW9iBSbZVv2MCwllR9X7uCsdgk8MagrLeqpCVlRU9CLSJHLyc1j9NfLef6zpVSpUI5nr+7G1ac0V/uCYnLMIx5m1sLMpptZhpktMLO781nmXDPbZWbzgtvDYXP9zGyxmWWa2bBofwMiUrItWL+LK17+lmc+Xcx5JzXks9+ew8/UabJYRfKJPgf4nbvPNbOawBwzm+buGUcs97W7Xxo+YGblgZeAC4G1wI9mNjGfdUUkzhzIzuWvXyxl1FfLqVutEn+7rif9uzaJdVllUiSXEtwAbAjuZ5nZQqAZEElY9wIyg0sKYmbvAZdHuK6IlFJzVm3nvnGpLNuyl6t6NuehSztSp5qakMVKofbRm1kS0AOYlc/06WY2H1gP/N7dFxD6hbAmbJm1QO8CnnsIMAQgMTGxMGWJSAmx92AOz05ZzFvfr6Rp7aq8dUsvzmnfINZllXkRB72Z1QBSgHvcffcR03OBlu6+x8wGAB8A7QpTiLuPBkYDJCcne2HWFZHYm7FkC/ePT2P9rv3ccFpL7u3XgRqVdb5HSRDRT8HMKhIK+bfdffyR8+HB7+6TzexlM0sA1gEtwhZtHoyJSJzYue8QIz9eyLg5a2ndoDrv3346pybVi3VZEuaYQW+hQ+OvAwvd/c8FLNMY2OTubma9CJ3Nsw3YCbQzs1aEAn4wcG2UaheRGPskbQMPfbiAHfsOcWffNvz6PDUhK4ki+UR/JnA9kGZm84KxB4BEAHcfBVwN3GFmOcB+YLC7O5BjZncBU4DywJhg372IlGKbsw7wyIcL+CR9I52b1uKtW06lc1M1ISupLJTHJUtycrLPnj071mWIyBHcnXFz1jLy44Xsz87lngva8cuzWqsJWQlgZnPcPTm/OR0pEZGIrNm+jwcmpPH10q2cmlSXp67qRpsGNWJdlkRAQS8iR5WX54z9fiXPTFmMAY9d3plf9G5JOTUhKzUU9CJSoMzNWQxNSWPOqh2c3b4BTwzqQvO6akJW2ijoReQnsnPzGD1jOS98tpRqlcvzp59158qezdSfppRS0IvIf0lft4v7xqWSsWE3l3RtwojLOtOgZuVYlyUnQEEvIkCoCdkLny9l9Izl1KteiVG/OIV+XRrHuiyJAgW9iPDDiu0MS0ll+da9/E9yc4YP6ETtahVjXZZEiYJepAzbczCHpz9ZxN9nrqJ53ar849be9GmXEOuyJMoU9CJl1PTFmxk+Po0Nuw9w85lJ/P6ik6iuJmRxST9VkTJmx95DPD4pg/H/XkfbhjUY96szOKVl3ViXJUVIQS9SRrg7k9M28sjEdHbuy+b/zmvLnee1pXIFNSGLdwp6kTJg0+4DPPRBOlMzNtG1WW3G3tKbTk1rxbosKSYKepE45u68P3sNIz9eyKGcPO7v34Fb+7SigpqQlSkKepE4tXrbPu6fkMq3mdvo1aoeT13ZldZqQlYmKehF4kxunvPmdyv545TFlC9njLyiC9f2SlQTsjIskitMtQDGAo0AB0a7+wtHLHMdMBQwIAu4w93nB3Mrg7FcIKegfskicuKWbsrivpRU/r16J31PasAfBnWlaZ2qsS5LYiyST/Q5wO/cfa6Z1QTmmNk0d88IW2YFcI677zCz/oQu8t07bL6vu2+NXtkiEu5QTh6jvlrGX79YSo3KFXj+5ydz+clN1YRMgAiC3t03ABuC+1lmthBoBmSELfNd2CozCV0EXESKwfw1OxmaksqijVkM7N6URwZ2IqGGmpDJ/1eoffRmlgT0AGYdZbFbgU/CHjsw1cwceMXdRxfw3EOAIQCJiYmFKUukTNp/KJfnP1vCq18vp0HNyrx6QzIXdmoU67KkBIo46M2sBpAC3OPuuwtYpi+hoO8TNtzH3deZWUNgmpktcvcZR64b/AIYDaFrxhbiexApc2Yu38awlFRWbtvHNb1aMKx/R2pXVRMyyV9EQW9mFQmF/NvuPr6AZboBrwH93X3b4XF3Xxd83WxmE4BewE+CXkSOLetANk99soi3Z60msV413rmtN2e0VRMyObpIzrox4HVgobv/uYBlEoHxwPXuviRsvDpQLti3Xx24CHgsKpWLlDFfLNrE8AnpbNp9gNv6tOK3F7WnWiWdIS3HFsm75EzgeiDNzOYFYw8AiQDuPgp4GKgPvBwc5T98GmUjYEIwVgF4x90/jeY3IBLvtu05yGOTMvhw3nraN6rBy9edQY9ENSGTyEVy1s03hM6PP9oytwG35TO+HOh+3NWJlGHuzkepGxgxcQFZB7K5+/x23Nm3LZUqqH2BFI7+7hMpgTbuOsCDH6Tx2cLNdG9em6ev7k2HxmpCJsdHQS9Sgrg77/24hic+Xkh2Xh7DB3Tklj6tKK/2BXICFPQiJcTKrXu5f3wa3y/fxmmt6/HUld1ISqge67IkDijoRWIsN88Z880K/jRtMRXLlePJK7sy+NQWal8gUaOgF4mhxRuzuG/cfOav3cUFHRsy8oquNK5dJdZlSZxR0IvEwKGcPF6ansnLX2ZSs0pF/nJNDwZ2a6JP8VIkFPQixWzemp3cN24+Szbt4fKTm/LIwM7Uq14p1mVJHFPQixSTfYdy+PPUJYz5dgUNa1bh9RuTOb+jmpBJ0VPQixSD7zK3Mmx8Gqu37+O63okM7d+BWlXUhEyKh4JepAjt2p/Nk5MX8t6Pa0iqX433hpzGaa3rx7osKWMU9CJFZFrGJh78II0tWQe5/ezW3HNBe6pWKh/rsqQMUtCLRNnWPQcZMXEBk1I30KFxTV69IZluzevEuiwpwxT0IlHi7nw4bz2PfrSAPQdz+O2F7fnVOW3UhExiTkEvEgXrd+5n+IQ0pi/ewskt6vDM1d1o36hmrMsSART0IickL895+4fVPP3JInLznIcu7cRNZySpCZmUKAp6keO0Yutehqak8sOK7ZzZtj5PDupGYv1qsS5L5CeOufPQzFqY2XQzyzCzBWZ2dz7LmJn9xcwyzSzVzHqGzd1oZkuD243R/gZEiltObh6jvlpGv+dnsHDDbp65qhv/uLW3Ql5KrEg+0ecAv3P3uWZWE5hjZtPcPSNsmf5Au+DWG/gb0NvM6gGPAMmAB+tOdPcdUf0uRIpJxvrdDE1JJW3dLi7s1IiRV3ShUS01IZOSLZJLCW4ANgT3s8xsIdAMCA/6y4Gx7u7ATDOrY2ZNgHOBae6+HcDMpgH9gHej+l2IFLGDObm8+EUmf/tyGXWqVeSla3syoGtjNSGTUqFQ++jNLAnoAcw6YqoZsCbs8dpgrKDx/J57CDAEIDExsTBliRSpOat2MDQllczNexjUoxkPX9qJumpCJqVIxEFvZjWAFOAed98d7ULcfTQwGiA5Odmj/fwihbX3YA5/nLqYN79bSZNaVXjj5lPpe1LDWJclUmgRBb2ZVSQU8m+7+/h8FlkHtAh73DwYW0do9034+JfHU6hIcfp66RbuH5/G2h37ueH0ltzXrwM1KuskNSmdjvnOtdBOyNeBhe7+5wIWmwjcZWbvEToYu8vdN5jZFOAJM6sbLHcRcH8U6hYpErv2ZfOHyRm8P3strRKq8/7tp9OrVb1YlyVyQiL5iHImcD2QZmbzgrEHgEQAdx8FTAYGAJnAPuDmYG67mT0O/Bis99jhA7MiJc2n6Rt56MN0tu89xB3ntuHu89tRpaKakEnpF8lZN98ARz21IDjb5s4C5sYAY46rOpFisCUr1ITs47QNdGxSizE3nkrX5rVjXZZI1Gino5RZ7s74uet4bFIG+w/lcu/FJzHk7NZULK8mZBJfFPRSJq3dsY8HJqQzY8kWTmlZl6ev6kbbhjViXZZIkVDQS5mSl+f8Y9Yqnv5kEQ6MGNiJG05PopyakEkcU9BLmbFsyx6GpaTy48odnNUugScGdaVFPfWnkfinoJe4l52bx6tfL+f5z5ZSpUI5nr26G1ef0lztC6TMUNBLXEtft4uhKaksWL+bfp0b89gVnWlYU03IpGxR0EtcOpCdy18+X8orM5ZTt1ol/nZdT/p3bRLrskRiQkEvcWf2yu3cl5LK8i17ufqU5jx4SUfqVFMTMim7FPQSN/YczOHZTxcxduYqmtauythbenF2+waxLksk5hT0Ehe+WrKFB8ansX7Xfm48PYl7Lz6J6mpCJgIo6KWU27nvEI9PWkjK3LW0blCdf91+OslJakImEk5BL6XW5LQNPPxhOjv2ZXNn3zb8+jw1IRPJj4JeSp3Nuw/w8IcL+HTBRjo3rcVbt/Sic1M1IRMpiIJeSg13519z1jJyUgYHcvIY2q8DvzyrFRXUhEzkqBT0Uiqs2b6PByak8fXSrZyaVJenrupGmwZqQiYSCQW9lGi5ec7Y71fy7JTFGPD45Z25rndLNSETKYRILiU4BrgU2OzuXfKZvxe4Luz5OgINgqtLrQSygFwgx92To1W4xL/MzVncNy6Vuat3ck77BvxhUBea11UTMpHCiuQT/ZvAi8DY/Cbd/VngWQAzGwj85ojLBfZ1960nWKeUIdm5ebzy1TL+8nkm1SqX58//051BPZqpCZnIcYrkUoIzzCwpwue7Bnj3hCqSMi1t7S7uHTefRRuzuKRbE0YM7EyDmpVjXZZIqRa1ffRmVg3oB9wVNuzAVDNz4BV3H32U9YcAQwASExOjVZaUEgeyc3n+s6W8+vVy6lWvxCvXn8LFnRvHuiyRuBDNg7EDgW+P2G3Tx93XmVlDYJqZLXL3GfmtHPwSGA2QnJzsUaxLSrhZy7cxbHwaK7bu5efJLXhgQEdqV6sY67JE4kY0g34wR+y2cfd1wdfNZjYB6AXkG/RS9mQdyOaZTxfz95mraF63Kv+4tTd92iXEuiyRuBOVoDez2sA5wC/CxqoD5dw9K7h/EfBYNF5PSr/pizYzfEIaG3Yf4JYzW/H7i9tTrZLO9hUpCpGcXvkucC6QYGZrgUeAigDuPipYbBAw1d33hq3aCJgQnClRAXjH3T+NXulSGm3fe4jHJ2Uw4d/raNewBuN+dQantKwb67JE4lokZ91cE8EybxI6DTN8bDnQ/XgLk/ji7nyctoFHPlzArv3Z/N95bbnzvLZUrqAmZCJFTX8rS5HbtPsAD36QzrSMTXRtVpt/3Nabjk1qxboskTJDQS9Fxt15f/YaRn68kEM5edzfvwO39lETMpHipqCXIrF62z6GjU/lu2Xb6NWqHk9f1Y1WCdVjXZZImaSgl6jKzXPe+HYFf5q6hPLljJFXdOHaXolqQiYSQwp6iZolm0JNyOat2cl5HRoy8oouNK1TNdZliZR5Cno5YYdy8vjbl8t4cfpSalSuwAuDT+ay7k3VhEykhFDQywmZv2YnQ1NSWbQxi4HdmzJiYCfq11ATMpGSREEvx2X/oVye+2wJr329nAY1K/PqDclc2KlRrMsSkXwo6KXQvl+2jfvHp7Jy2z6u6dWC+wd0pFYVNSETKakU9BKx3QeyeeqTRbwzazWJ9arxzm29OaOtmpCJlHQKeonI5ws3MXxCOpuzDvDLs1rx2wtPomoltS8QKQ0U9HJU2/Yc5NGPMpg4fz0nNarJqOtP4eQWdWJdlogUgoJe8uXuTJy/nkc/yiDrQDb3XNCO/z23LZUqqH2BSGmjoJef2LBrPw9OSOfzRZvp3qIOz1zVjZMa14x1WSJynBT08h95ec57P67hyckLyc7L48FLOnLzma0or/YFIqXaMf8ON7MxZrbZzNILmD/XzHaZ2bzg9nDYXD8zW2xmmWY2LJqFS3St3LqXa1+byQMT0ujSrDZT7jmb285qrZAXiQORfKJ/E3gRGHuUZb5290vDB8ysPPAScCGwFvjRzCa6e8Zx1ipFICc3jzFBE7JK5cvx1JVd+fmpLdS+QCSORHKFqRlmlnQcz90LyAyuNIWZvQdcDijoS4hFG3czdFwq89fu4oKODRl5RVca164S67JEJMqitY/+dDObD6wHfu/uC4BmwJqwZdYCvQt6AjMbAgwBSExMjFJZkp+DObm8NH0ZL0/PpHbVivz1mh5c2q2JPsWLxKloBP1coKW77zGzAcAHQLvCPom7jwZGAyQnJ3sU6pJ8/Hv1DoampLJk0x6uOLkpDw/sTL3qlWJdlogUoRMOenffHXZ/spm9bGYJwDqgRdiizYMxiYF9h3L409QljPl2BY1rVWHMTcmc10FNyETKghMOejNrDGxydzezXoTO5NkG7ATamVkrQgE/GLj2RF9PCu/bzK0MG5/Kmu37ua53IsP6d6CmmpCJlBnHDHozexc4F0gws7XAI0BFAHcfBVwN3GFmOcB+YLC7O5BjZncBU4DywJhg370Uk137s3ly8kLe+3ENSfWr8d6Q0zitdf1YlyUixcxCmVyyJCcn++zZs2NdRqk2dcFGHvwgna17DvLLs1vzmwvaU6WimpCJxCszm+PuyfnN6X/Gxpmtew4yYuICJqVuoEPjmrx2YzLdmteJdVkiEkMK+jjh7nwwbx2PfpTBvoO5/O7C9tx+Ths1IRMRBX08WL9zP8MnpDF98RZ6JIaakLVrpCZkIhKioC/F8vKct39YzVOTF5Ln8PClnbjxjCT1pxGR/6KgL6WWb9nDsJQ0fli5nT5tE3jyyq60qFct1mWJSAmkoC9lcnLzeO2bFTw3bQmVKpTjmau68bPk5mpfICIFUtCXIhnrd3NfynzS1+3mok6NePyKLjSqpSZkInJ0CvpS4GBOLi9+kcnfvlxGnWoVeenangzo2lif4kUkIgr6Em7Oqu0MTUkjc/MeruzZjIcu6URdNSETkUJQ0JdQew/m8OyUxbz1/Uqa1q7KmzefyrknNYx1WSJSCinoS6Cvl27h/vFprN2xnxtOb8l9/TpQo7J+VCJyfJQeJciufdmM/DiDf81ZS+uE6rx/++n0alUv1mWJSCmnoC8hPk3fyEMfprN97yHuOLcNd5/fTk3IRCQqFPQxtjnrACMmLmBy2kY6NanFGzedSpdmtWNdlojEEQV9jLg7KXPX8fikDPZn53LvxScx5OzWVCyvJmQiEl0K+hhYu2MfD0xIZ8aSLZzSsi5PX9WNtg1rxLosEYlTkVxhagxwKbDZ3bvkM38dMBQwIAu4w93nB3Mrg7FcIKegpvhlRV6e8/eZq3j600UAPHpZZ64/rSXl1IRMRIpQJJ/o3wReBMYWML8COMfdd5hZf2A00Dtsvq+7bz2hKuPAsi17GDouldmrdnBWuwSeGKQmZCJSPI4Z9O4+w8ySjjL/XdjDmUDzKNQVN7Jz8xg9YzkvfL6UqhXL88efdeeqns3UvkBEik2099HfCnwS9tiBqWbmwCvuPrqgFc1sCDAEIDExMcplxUb6ul0MTUllwfrdDOjamBGXdaZhTTUhE5HiFbWgN7O+hIK+T9hwH3dfZ2YNgWlmtsjdZ+S3fvBLYDSELg4erbpi4UB2Ln/5fCmvzFhO3WqVGPWLnvTr0iTWZYlIGRWVoDezbsBrQH9333Z43N3XBV83m9kEoBeQb9DHix9XbmfouFSWb93Lz05pzoOXdKJ2tYqxLktEyrATDnozSwTGA9e7+5Kw8epAOXfPCu5fBDx2oq9XUu05mMMzny5i7PeraFanKmNv6cXZ7RvEuiwRkYhOr3wXOBdIMLO1wCNARQB3HwU8DNQHXg4OMB4+jbIRMCEYqwC84+6fFsH3EHNfLdnCA+PTWL9rPzedkcS9F59EdTUhE5ESIpKzbq45xvxtwG35jC8Huh9/aSXfzn2HeGxSBuPnrqNNg+r86/bTSU5SEzIRKVn0sfM4uDufpG/k4Q/T2bkvm7v6tuWu89qqCZmIlEgK+kLavPsAD32YzpQFm+jSrBZv3dKLzk3VhExESi4FfYTcnX/NWcvISRkcyMljaL8O/PKsVlRQEzIRKeEU9BFYs30f949P45vMrfRKqsdTV3WldQM1IROR0kFBfxS5ec7Y71fyzKeLKWfw+OWdua63mpCJSOmioC9A5uYs7huXytzVOzmnfQOeuLIrzepUjXVZIiKFpqA/QnZuHqO+XMZfv8ikWuXyPPfz7lxxspqQiUjppaAPk7Z2F/eOm8+ijVlc0q0Jj17WmYQalWNdlojICVHQE2pC9txnS3h1xnISalTmletP4eLOjWNdlohIVJT5oJ+1fBvDxqexYutefp7cggcu6UjtqmpCJiLxo8wGfdaBbJ7+dBH/mLmaFvWq8vZtvTmzbUKsyxIRiboyGfTTF21m+IQ0Nuw+wK19WvG7i9pTrVKZ3BQiUgaUqXTbvvcQj0/KYMK/19GuYQ1S7jiDnol1Y12WiEiRKhNB7+5MSt3AiIkL2LU/m/87vx139m1D5QpqQiYi8S/ug37T7gMMn5DOZws30a15bf5xW286NqkV67JERIpN3Aa9u/PPH9fwh8kLOZSTxwMDOnDLmWpCJiJlT0SpZ2ZjzGyzmaUXMG9m9hczyzSzVDPrGTZ3o5ktDW43Rqvwo1m9bR/XvTaLYePT6NSkFlPuOZshZ7dRyItImRTpJ/o3gReBsQXM9wfaBbfewN+A3mZWj9ClB5MBB+aY2UR333EiRRckN89549sV/HHqYiqUK8cfBnXhmlMT1YRMRMq0iILe3WeYWdJRFrkcGOvuDsw0szpm1oTQtWanuft2ADObBvQD3j2hqvOxa182N77xA/PW7OS8Dg35w6AuNKmtJmQiItHaR98MWBP2eG0wVtD4T5jZEGAIQGJiYqELqFW1Ai3rV+PmM5O4rHtTNSETEQmUmIOx7j4aGA2QnJzshV3fzHhhcI+o1yUiUtpF6+jkOqBF2OPmwVhB4yIiUkyiFfQTgRuCs29OA3a5+wZgCnCRmdU1s7rARcGYiIgUk4h23ZjZu4QOrCaY2VpCZ9JUBHD3UcBkYACQCewDbg7mtpvZ48CPwVM9dvjArIiIFI9Iz7q55hjzDtxZwNwYYEzhSxMRkWjQ/yASEYlzCnoRkTinoBcRiXMKehGROGeh46gli5ltAVYd5+oJwNYolhMtqqtwVFfhqK7Cice6Wrp7g/wmSmTQnwgzm+3uybGu40iqq3BUV+GorsIpa3Vp142ISJxT0IuIxLl4DPrRsS6gAKqrcFRX4aiuwilTdcXdPnoREflv8fiJXkREwijoRUTiXKkJejPrZ2aLgwuQD8tnvrKZ/TOYnxV+6UMzuz8YX2xmFxdzXb81s4zgoumfm1nLsLlcM5sX3CYWc103mdmWsNe/LWyuyC7oHkFdz4XVtMTMdobNFeX2GmNmm80svYB5M7O/BHWnmlnPsLmi3F7Hquu6oJ40M/vOzLqHza0MxueZ2exirutcM9sV9vN6OGzuqO+BIq7r3rCa0oP3VL1grii3Vwszmx5kwQIzuzufZYruPebuJf4GlAeWAa2BSsB8oNMRy/wvMCq4Pxj4Z3C/U7B8ZaBV8Dzli7GuvkC14P4dh+sKHu+J4fa6CXgxn3XrAcuDr3WD+3WLq64jlv81MKaot1fw3GcDPYH0AuYHAJ8ABpwGzCrq7RVhXWccfj2g/+G6gscrgYQYba9zgUkn+h6Idl1HLDsQ+KKYtlcToGdwvyawJJ9/k0X2Histn+h7AZnuvtzdDwHvEbogebjLgbeC++OA883MgvH33P2gu68g1DO/V3HV5e7T3X1f8HAmoatsFbVItldBLia4oLu77wAOX9A9FnVdQxFcSD4/7j4DONq1Ei4HxnrITKCOmTWhaLfXMety9++C14Xie39Fsr0KciLvzWjXVZzvrw3uPje4nwUs5KfXzy6y91hpCfpILjL+n2XcPQfYBdSPcN2irCvcrYR+Yx9Wxcxmm9lMM7siSjUVpq6rgj8Rx5nZ4Us+lojtFeziagV8ETZcVNsrEgXVXpTbq7COfH85MNXM5pjZkBjUc7qZzTezT8ysczBWIraXmVUjFJYpYcPFsr0stFu5BzDriKkie4+VmIuDxzsz+wWQDJwTNtzS3deZWWvgCzNLc/dlxVTSR8C77n7QzG4n9NfQecX02pEYDIxz99ywsVhurxLNzPoSCvo+YcN9gu3VEJhmZouCT7zFYS6hn9ceMxsAfAC0K6bXjsRA4Fv/7yveFfn2MrMahH653OPuu6P53EdTWj7RR3KR8f8sY2YVgNrAtgjXLcq6MLMLgOHAZe5+8PC4u68Lvi4HviT0W75Y6nL3bWG1vAacEum6RVlXmMEc8Wd1EW6vSBRUe1Fur4iYWTdCP8PL3X3b4fGw7bUZmED0dlkek7vvdvc9wf3JQEUzS6AEbK/A0d5fRbK9zKwioZB/293H57NI0b3HiuLAQ7RvhP7yWE7oT/nDB3A6H7HMnfz3wdj3g/ud+e+DscuJ3sHYSOrqQejgU7sjxusClYP7CcBSonRQKsK6moTdHwTM9P9/4GdFUF/d4H694qorWK4DoQNjVhzbK+w1kij44OIl/PeBsh+KentFWFcioeNOZxwxXh2oGXb/O6BfMdbV+PDPj1Bgrg62XUTvgaKqK5ivTWg/fvXi2l7B9z4WeP4oyxTZeyxqG7eob4SOSC8hFJrDg7HHCH1KBqgC/Ct40/8AtA5bd3iw3mKgfzHX9RmwCZgX3CYG42cAacEbPQ24tZjrehJYELz+dKBD2Lq3BNsxE7i5OOsKHo8AnjpivaLeXu8CG4BsQvtAbwV+BfwqmDfgpaDuNCC5mLbXsep6DdgR9v6aHYy3DrbV/ODnPLyY67or7P01k7BfRPm9B4qrrmCZmwidoBG+XlFvrz6EjgGkhv2sBhTXe0wtEERE4lxp2UcvIiLHSUEvIhLnFPQiInFOQS8iEucU9CIicU5BLyIS5xT0IiJx7v8B1/9nSSThrR4AAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"execution_count": 3,
"metadata": {
"needs_background": "light"
},
"output_type": "execute_result"
}
],
"source": [
"captured.outputs[0]"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "5075b41d-326a-4af8-a416-f263965ca087",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"IPython.utils.capture.RichOutput"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(captured.outputs[0])"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "5bc066d3-09c3-4172-bd35-02cf645ad531",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"captured.show()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "5ae74424-5bec-4a6c-8587-d035c79c9585",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"captured()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "97b8c45d-2cd6-4144-8d6b-9698bec934be",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"from IPython.display import display\n",
"for o in captured.outputs:\n",
" display(o)"
]
},
{
"cell_type": "markdown",
"id": "48a2c790-00c5-401c-aea7-0475b2b3e1b8",
"metadata": {},
"source": [
"## Want a figure?"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "fd743f9f-8678-41a5-a47b-7f7d0258482a",
"metadata": {},
"outputs": [],
"source": [
"pycode = '''\n",
"from matplotlib import pyplot as plt\n",
"plt.plot([1, 2, 3])\n",
"plt.savefig('my_plot.png')\n",
"plt.show()\n",
"'''\n",
"from IPython.utils import io\n",
"with io.capture_output() as captured:\n",
" exec(pycode)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "94c2d016-c79d-49e2-9720-b2762c08a1f2",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAEgCAYAAADVKCZpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAp30lEQVR4nO3deXhU9fn+8fcDhH3f1xBW2REMm1LFHRRLUfut1t1a1NZfaxcF97WK2mpt1VKqqHy/Lm0JKIqIWLG4omAhCWELYQ3IFiBhC1me3x8Ze01TQJbMOTPJ/bquXEw+58xwczJwc2ZOnpi7IyIikmiqhR1ARETkeKjAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIdUIO0CsNG/e3FNSUsKOISKSUBYtWrTd3VuEneNoVNoCS0lJYeHChWHHEBFJKGa2LuwMR0svIYqISEJSgYmISEJSgYmISEIKrMDMrLaZfWFmS8xsqZk9cIh9apnZX80s28wWmFlK1LY7IusrzOz8oHKLiEh8CvIMrBA4y937AycDI81saLl9fgTsdPeuwFPAYwBm1gu4DOgNjASeM7PqQQUXEZH4E1iBeZk9kU+TIh9ebrcxwMuR29OAs83MIuuvu3uhu68BsoHBAcQWEZE4Feh7YGZW3cwWA1uBue6+oNwu7YANAO5eDOwGmkWvR2yMrImISERpqTPjXxspLC4JO0ogAv0+MHcvAU42s8bADDPr4+6ZFfX4ZjYOGAeQnJxcUQ8rIhL31mzfy4S0dBasyaOwqJTLBlf+fwNDuQrR3XcB8yh7PytaLtABwMxqAI2AHdHrEe0ja+Ufd7K7p7p7aosWCfGN5CIiJ6S4pJTJ81cz8vfzydqUz8SL+/KDQR2+/Y6VQGBnYGbWAihy911mVgc4l8hFGlFmAtcAnwGXAh+4u5vZTOBVM3sSaAt0A74IKruISDxatjmf8WnppG/czTk9W/Hw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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.display import Image\n",
"Image(\"my_plot.png\")"
]
},
{
"cell_type": "markdown",
"id": "d338a202-09ec-4787-a86a-f4ac4951540e",
"metadata": {},
"source": [
"So adding in the saving the plot as an image in the original use of matplotlib works.\n",
"\n",
"If you include a line assigning the plot to a Matplotlib figure object before you make the plot, you can also decide after-the-fact to save it as an image."
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "404da024-ed98-415f-a01f-4e372830c174",
"metadata": {},
"outputs": [],
"source": [
"pycode = '''\n",
"from matplotlib import pyplot as plt\n",
"fig = plt.figure()\n",
"plt.plot([1, 2, 3])\n",
"plt.show()\n",
"'''\n",
"from IPython.utils import io\n",
"with io.capture_output() as captured:\n",
" exec(pycode)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "216bf725-82f2-4eb0-b240-e45957ce6844",
"metadata": {},
"outputs": [],
"source": [
"fig.savefig(\"after_the_fact_save.png\")"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "c81f4b8e-814f-4718-9b2d-806a596e3fad",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAEgCAYAAADVKCZpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAAp30lEQVR4nO3deXhU9fn+8fcDhH3f1xBW2REMm1LFHRRLUfut1t1a1NZfaxcF97WK2mpt1VKqqHy/Lm0JKIqIWLG4omAhCWELYQ3IFiBhC1me3x8Ze01TQJbMOTPJ/bquXEw+58xwczJwc2ZOnpi7IyIikmiqhR1ARETkeKjAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIdUIO0CsNG/e3FNSUsKOISKSUBYtWrTd3VuEneNoVNoCS0lJYeHChWHHEBFJKGa2LuwMR0svIYqISEJSgYmISEJSgYmISEIKrMDMrLaZfWFmS8xsqZk9cIh9apnZX80s28wWmFlK1LY7IusrzOz8oHKLiEh8CvIMrBA4y937AycDI81saLl9fgTsdPeuwFPAYwBm1gu4DOgNjASeM7PqQQUXEZH4E1iBeZk9kU+TIh9ebrcxwMuR29OAs83MIuuvu3uhu68BsoHBAcQWEZE4Feh7YGZW3cwWA1uBue6+oNwu7YANAO5eDOwGmkWvR2yMrImISERpqTPjXxspLC4JO0ogAv0+MHcvAU42s8bADDPr4+6ZFfX4ZjYOGAeQnJxcUQ8rIhL31mzfy4S0dBasyaOwqJTLBlf+fwNDuQrR3XcB8yh7PytaLtABwMxqAI2AHdHrEe0ja+Ufd7K7p7p7aosWCfGN5CIiJ6S4pJTJ81cz8vfzydqUz8SL+/KDQR2+/Y6VQGBnYGbWAihy911mVgc4l8hFGlFmAtcAnwGXAh+4u5vZTOBVM3sSaAt0A74IKruISDxatjmf8WnppG/czTk9W/Hw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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.display import Image\n",
"Image(\"after_the_fact_save.png\")"
]
},
{
"cell_type": "markdown",
"id": "a37d9507-900b-4996-aa8a-8e34f3e45928",
"metadata": {},
"source": [
"So adding in the saving the plot as an image via matplotlib works. \n",
"\n",
"But **can you save the 'RichOuput' from Matplotlib**, `captured.outputs[0]` in this case, to an image, too? So you can keep the matplotlib handling simpler and decide after-the-fact if you want the image and get it progammatically. (Because when in JupyterLab, you have the option to right-click on the plot and choose 'Create New View for Ouput' and then right-clicking on that in the 'Output View' and choosing to 'Save Image As..' to collect an image file by hand.)"
]
},
{
"cell_type": "markdown",
"id": "1a7e3ac0-179b-47a9-ac01-172f6123ce14",
"metadata": {},
"source": [
"Based on [here](https://github.com/ipython/ipython/issues/11163#issuecomment-393995207), I didn't think that is easy to do. And I was going to suggest digging into how [nbgather](https://github.com/microsoft/gather) works, sugged [here](https://discourse.jupyter.org/t/is-there-a-way-to-save-the-output-of-a-cell/2489/2?u=fomightez) may provide a way; howver, it didn't seem straightforward right now.\n",
"\n",
"However, I found two options based on search of 'jupyter %%capture send to image file'. First based on [a reply to 'Exporting a single jupyter cell output'](https://github.com/jupyter/notebook/issues/3039#issuecomment-583860159), where use of '%%capture to save the png output' is discussed.\n",
"\n",
"So I tried:\n",
"\n",
"```python\n",
"with open('from_richoutputs.png', 'wb') as f:\n",
" f.write(captured.outputs[0].data['image/png'])\n",
"```\n",
"\n",
"However, that gives 'TypeError: a bytes-like object is required, not 'str'' because it turns out that seems written for something already outputing `.png`, I think. Even though the pseudocode doesn't work that way.\n",
"So similar with [the other promising idea](https://discourse.jupyter.org/t/cell-magic-to-save-image-output-as-a-png-file/11906/2) that turns out to be useful only when the RichOutput was a `.png`. And so I'm back to thinking not easy with matplotlib and be at least be happy one route works. (The [page with the other promising idea](https://discourse.jupyter.org/t/cell-magic-to-save-image-output-as-a-png-file/11906/2) also includes metnion of nbinteract/scrapbook and maybe that is appropriate here?)"
]
},
{
"cell_type": "markdown",
"id": "849dc6f8-123a-4db2-907d-4cdd819b2989",
"metadata": {},
"source": [
"## Can you make the plot HTML code?\n",
"\n",
"### nbconvert of a notebook with just that code and output to get HTML\n",
"\n",
"If you are working in Jupyter than one option to get HTML version of the plot would be to use nbconvert to make the HTML, see [here](https://nbconvert.readthedocs.io/en/latest/usage.html). Example:\n",
"\n",
"```shell\n",
"jupyter nbconvert --to html so74683522.ipynb\n",
"```\n",
"\n",
"The produced HTML will contain code needed to make the plot. \n",
"You can imagine just making a notebook where the only cell is what produces the plot to make it easy to find the pertinent code. \n",
"In fact, let's demonstrate that by making a notebook that will only have the following single cell, with no output yet:\n",
"\n",
"```python\n",
"pycode = '''\n",
"from matplotlib import pyplot as plt\n",
"plt.plot([1, 2, 3])\n",
"plt.show()\n",
"'''\n",
"exec(pycode)\n",
"```\n",
"\n",
"To do that, I'll us nbformat to make a Jupyter notebook `.ipynb` with that code as a single cell in it by running the next cell:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "0b4e8196-6213-4f5d-ae79-6f94dee87bee",
"metadata": {},
"outputs": [],
"source": [
"# based on https://stackoverflow.com/a/62105736/8508004 (setting metadata to python based on https://github.com/ParaToolsInc/taucmdr/blob/70daea6e775903a04d3008f4500c0ea60970e023/packages/taucmdr/analysis/analysis.py)\n",
"from nbformat import v4 as nbf\n",
"import nbformat\n",
"code_source = \"pycode = '''\\nfrom matplotlib import pyplot as plt\\nplt.plot([1, 2, 3])\\nplt.show()\\n'''\\nexec(pycode)\"\n",
"new_ntbk = nbf.new_notebook()\n",
"cells = [nbf.new_code_cell(code_source)]\n",
"new_ntbk['cells'] = cells\n",
"new_ntbk['metadata']['kernelspec'] = nbformat.NotebookNode()\n",
"new_ntbk['metadata']['kernelspec']['name'] = 'python3'\n",
"new_ntbk['metadata']['kernelspec']['language'] = 'python'\n",
"new_ntbk['metadata']['kernelspec']['display_name'] = 'Python 3 (ipykernel)'\n",
"nbformat.write(new_ntbk, \"single_cell_exec_without_output_via_nbf.ipynb\")"
]
},
{
"cell_type": "markdown",
"id": "49bf838b-1ffc-40a6-951e-0143f2bae1f8",
"metadata": {},
"source": [
"We can see that is all that is there:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "aa7bdd5c-5d4a-4354-aaea-5aad7550aa9c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"cells\": [\n",
" {\n",
" \"cell_type\": \"code\",\n",
" \"execution_count\": null,\n",
" \"id\": \"3c761258\",\n",
" \"metadata\": {},\n",
" \"outputs\": [],\n",
" \"source\": [\n",
" \"pycode = '''\\n\",\n",
" \"from matplotlib import pyplot as plt\\n\",\n",
" \"plt.plot([1, 2, 3])\\n\",\n",
" \"plt.show()\\n\",\n",
" \"'''\\n\",\n",
" \"exec(pycode)\"\n",
" ]\n",
" }\n",
" ],\n",
" \"metadata\": {\n",
" \"kernelspec\": {\n",
" \"display_name\": \"Python 3 (ipykernel)\",\n",
" \"language\": \"python\",\n",
" \"name\": \"python3\"\n",
" }\n",
" },\n",
" \"nbformat\": 4,\n",
" \"nbformat_minor\": 5\n",
"}\n"
]
}
],
"source": [
"cat single_cell_exec_without_output_via_nbf.ipynb"
]
},
{
"cell_type": "markdown",
"id": "8906a858-f70a-49df-bf26-153121c5cd4f",
"metadata": {},
"source": [
"That's it. Just contains that small block of code we made above. Let's excute it"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "1503859c-fecf-489d-b71b-aab09fcf3af6",
"metadata": {},
"outputs": [],
"source": [
"# based on https://nbconvert.readthedocs.io/en/latest/execute_api.html#executing-notebooks-using-the-python-api-interface\n",
"notebook_filename = \"single_cell_exec_without_output_via_nbf.ipynb\"\n",
"import nbformat\n",
"from nbconvert.preprocessors import ExecutePreprocessor\n",
"with open(notebook_filename) as f:\n",
" nb = nbformat.read(f, as_version=4)\n",
"ExecutePreprocessor().preprocess(nb, {'metadata': {'path': './'}})\n",
"with open('executed_notebook.ipynb', 'w', encoding='utf-8') as f:\n",
" nbformat.write(nb, f)"
]
},
{
"cell_type": "markdown",
"id": "9d2ada5a-960d-4d5a-a49c-12883901b804",
"metadata": {},
"source": [
"That will execute the notebook. Now to get the HTML we'll convert it and specify we don't want the input cell source in the result, see [here](https://stackoverflow.com/a/58524517/8508004) for more about the `--no-input` flag to leave out the code cells from the produced HTML."
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "2b4a9fae-3ce0-40d2-9303-060beea2e1f1",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[NbConvertApp] Converting notebook executed_notebook.ipynb to html\n",
"[NbConvertApp] Writing 587936 bytes to executed_notebook.html\n"
]
}
],
"source": [
"!jupyter nbconvert --no-input --to html executed_notebook.ipynb"
]
},
{
"cell_type": "markdown",
"id": "86fe7699-e859-4b9e-bab8-111eb374ad54",
"metadata": {},
"source": [
"Let's view the first few lines of HTML code produced. "
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "bd1642ed-fbec-4fd2-b250-0f313a6a9e50",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<!DOCTYPE html>\n",
"<html>\n",
"<head><meta charset=\"utf-8\" />\n",
"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n",
"\n",
"<title>executed_notebook</title><script src=\"https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js\"></script>\n",
"\n",
"\n",
"\n",
"\n"
]
}
],
"source": [
"!head executed_notebook.html"
]
},
{
"cell_type": "markdown",
"id": "f2e46b8c-f562-4962-b279-c28de181fe2e",
"metadata": {},
"source": [
"Replace `!head` part of the command above with `cat` and re-run it to see it all. There's a lot and so I just wanted to show the top to demonstrate it indeed produced an HTML file. You should be able to take the code and embed it elsewhere. In fact, if you really examine it you'll see it has an image of the plot embedded as base64. You can deduce how to embed only that elsewhere from examples below.\n",
"\n",
"To view the HTML as HTML, in JupyterLab you can just double-click on the HTML icon in the file browser pane to the left. You'll note there is just a plot.\n",
"\n",
"#### Make a image of the plot after-the-fact and converting that to HTML\n",
"\n",
"Also, using the figure, you can create a Base64 version of the plot image to embed in HTML, see [here](https://stackoverflow.com/a/51533307/8508004).\n",
"In fact let's see that demonstrated in this notebook, based on a variation [here](https://stackoverflow.com/a/36993713/8508004), in reply to [Imbed [sic] matplotlib figure into iPython HTML](https://stackoverflow.com/q/36991600/8508004). Plus, updating that to Python 3 using [here](https://discourse.matplotlib.org/t/savefig-and-stringio-error-on-python3/18894/3) and [here](https://stackoverflow.com/a/62498083/8508004)."
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "68be21da-d10f-49af-bcc1-9e28bdd8f393",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<h1 style='color:purple'>Hello, this is all HTML in this output block:</h1><hr/><img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbAAAAEgCAYAAADVKCZpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90\n",
"bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsT\n",
"AAALEwEAmpwYAAAp30lEQVR4nO3deXhU9fn+8fcDhH3f1xBW2REMm1LFHRRLUfut1t1a1NZfaxcF\n",
"97WK2mpt1VKqqHy/Lm0JKIqIWLG4omAhCWELYQ3IFiBhC1me3x8Ze01TQJbMOTPJ/bquXEw+58xw\n",
"czJwc2ZOnpi7IyIikmiqhR1ARETkeKjAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQk\n",
"IanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanA\n",
"REQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQk\n",
"IanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIanAREQkIdUIO0CsNG/e\n",
"3FNSUsKOISKSUBYtWrTd3VuEneNoVNoCS0lJYeHChWHHEBFJKGa2LuwMR0svIYqISEJSgYmISEJS\n",
"gYmISEIKrMDMrLaZfWFmS8xsqZk9cIh9apnZX80s28wWmFlK1LY7IusrzOz8oHKLiEh8CvIMrBA4\n",
"y937AycDI81saLl9fgTsdPeuwFPAYwBm1gu4DOgNjASeM7PqQQUXEZH4E1iBeZk9kU+TIh9ebrcx\n",
"wMuR29OAs83MIuuvu3uhu68BsoHBAcQWEZE4Feh7YGZW3cwWA1uBue6+oNwu7YANAO5eDOwGmkWv\n",
"R2yMrImISERpqTPjXxspLC4JO0ogAv0+MHcvAU42s8bADDPr4+6ZFfX4ZjYOGAeQnJxcUQ8rIhL3\n",
"1mzfy4S0dBasyaOwqJTLBlf+fwNDuQrR3XcB8yh7PytaLtABwMxqAI2AHdHrEe0ja+Ufd7K7p7p7\n",
"aosWCfGN5CIiJ6S4pJTJ81cz8vfzydqUz8SL+/KDQR2+/Y6VQGBnYGbWAihy911mVgc4l8hFGlFm\n",
"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\n",
"&#10;\"><hr>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.core.display import HTML\n",
"import binascii\n",
"#from io import StringIO\n",
"from io import BytesIO\n",
"import base64\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# open IO object\n",
"#sio = StringIO()\n",
"sio = BytesIO()\n",
"\n",
"pycode = '''\n",
"from matplotlib import pyplot as plt\n",
"fig = plt.figure()\n",
"plt.plot([1, 2, 3])\n",
"plt.show()\n",
"'''\n",
"from IPython.utils import io\n",
"with io.capture_output() as captured:\n",
" exec(pycode)\n",
"\n",
"# print raw canvas data to IO object\n",
"#fig.canvas.print_png(sio)\n",
"fig.savefig(sio, format=\"png\")\n",
"\n",
"# convert raw binary data to base64\n",
"# I use this to embed in an img tag\n",
"#img_data = binascii.b2a_base64(sio.getvalue())\n",
"img_data = base64.encodebytes(sio.getvalue()).decode()\n",
"\n",
"# keep img tag outter html in its own variable\n",
"img_html = '<img src=\"data:image/png;base64,{}&#10;\">'.format(img_data)\n",
"\n",
"HTML(\"<h1 style='color:purple'>Hello, this is all HTML in this output block:</h1><hr/>\"+img_html+\"<hr>\")"
]
},
{
"cell_type": "markdown",
"id": "7b9cdf5e-093b-4dd8-895a-08ba2138945a",
"metadata": {},
"source": [
"Making a figure object, the `fig = plt.figure()` step, was introduced in the section above.\n",
"\n",
"#### Use the Matplotlib figure object to go to embeddable HTML\n",
"\n",
"However, the OP was seeking to be away from Jupyter and IPython. Can you make HTML from matplotlib objects?\n",
"\n",
"Using [mpld3](https://mpld3.github.io/quickstart.html) you can. That package has an `fig_to_html()` method. \n",
"Let's install that here:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "c7413808-ecf2-4b51-b341-01dfb6221fa4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting mpld3\n",
" Downloading mpld3-0.5.8-py3-none-any.whl (201 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m201.0/201.0 KB\u001b[0m \u001b[31m1.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
"\u001b[?25hRequirement already satisfied: matplotlib in /srv/conda/envs/notebook/lib/python3.7/site-packages (from mpld3) (3.5.2)\n",
"Requirement already satisfied: jinja2 in /srv/conda/envs/notebook/lib/python3.7/site-packages (from mpld3) (3.1.1)\n",
"Requirement already satisfied: MarkupSafe>=2.0 in /srv/conda/envs/notebook/lib/python3.7/site-packages (from jinja2->mpld3) (2.1.1)\n",
"Requirement already satisfied: pillow>=6.2.0 in /srv/conda/envs/notebook/lib/python3.7/site-packages (from matplotlib->mpld3) (9.2.0)\n",
"Requirement already satisfied: pyparsing>=2.2.1 in /srv/conda/envs/notebook/lib/python3.7/site-packages (from matplotlib->mpld3) (3.0.7)\n",
"Requirement already satisfied: fonttools>=4.22.0 in /srv/conda/envs/notebook/lib/python3.7/site-packages (from matplotlib->mpld3) (4.34.4)\n",
"Requirement already satisfied: kiwisolver>=1.0.1 in /srv/conda/envs/notebook/lib/python3.7/site-packages (from matplotlib->mpld3) (1.4.4)\n",
"Requirement already satisfied: packaging>=20.0 in /srv/conda/envs/notebook/lib/python3.7/site-packages (from matplotlib->mpld3) (21.3)\n",
"Requirement already satisfied: python-dateutil>=2.7 in /srv/conda/envs/notebook/lib/python3.7/site-packages (from matplotlib->mpld3) (2.8.2)\n",
"Requirement already satisfied: cycler>=0.10 in /srv/conda/envs/notebook/lib/python3.7/site-packages (from matplotlib->mpld3) (0.11.0)\n",
"Requirement already satisfied: numpy>=1.17 in /srv/conda/envs/notebook/lib/python3.7/site-packages (from matplotlib->mpld3) (1.21.6)\n",
"Requirement already satisfied: typing-extensions in /srv/conda/envs/notebook/lib/python3.7/site-packages (from kiwisolver>=1.0.1->matplotlib->mpld3) (4.1.1)\n",
"Requirement already satisfied: six>=1.5 in /srv/conda/envs/notebook/lib/python3.7/site-packages (from python-dateutil>=2.7->matplotlib->mpld3) (1.16.0)\n",
"Installing collected packages: mpld3\n",
"Successfully installed mpld3-0.5.8\n",
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"%pip install mpld3"
]
},
{
"cell_type": "markdown",
"id": "03e0590c-efa7-4fce-b909-11f55f6f0a43",
"metadata": {},
"source": [
"Let's connect mpld3 use to this process to make an HTML version of the plot:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "614a604e-f778-41dc-b256-b6efdedbb93c",
"metadata": {},
"outputs": [],
"source": [
"pycode = '''\n",
"from matplotlib import pyplot as plt\n",
"fig = plt.figure()\n",
"plt.plot([1, 2, 3])\n",
"plt.show()\n",
"'''\n",
"from IPython.utils import io\n",
"with io.capture_output() as captured:\n",
" exec(pycode)\n",
"\n",
"import mpld3\n",
"html_string= mpld3.fig_to_html(fig)"
]
},
{
"cell_type": "markdown",
"id": "395b6628-c727-4f5c-a550-b6fdb48555c6",
"metadata": {},
"source": [
"How to make a figure object was covered in the section above. Besides, using that, we've just import `mpl` and used the `fig_to_html()` method using the Matplotlib figure object.\n",
"\n",
"That should have produced HTML; let's examine it to see:"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "274f61d0-c446-4ea9-b1b9-23353607bae6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"\n",
"<style>\n",
"\n",
"</style>\n",
"\n",
"<div id=\"fig_el1201399120396793769970057120\"></div>\n",
"<script>\n",
"function mpld3_load_lib(url, callback){\n",
" var s = document.createElement('script');\n",
" s.src = url;\n",
" s.async = true;\n",
" s.onreadystatechange = s.onload = callback;\n",
" s.onerror = function(){console.warn(\"failed to load library \" + url);};\n",
" document.getElementsByTagName(\"head\")[0].appendChild(s);\n",
"}\n",
"\n",
"if(typeof(mpld3) !== \"undefined\" && mpld3._mpld3IsLoaded){\n",
" // already loaded: just create the figure\n",
" !function(mpld3){\n",
" \n",
" mpld3.draw_figure(\"fig_el1201399120396793769970057120\", {\"width\": 432.0, \"height\": 288.0, \"axes\": [{\"bbox\": [0.125, 0.125, 0.775, 0.755], \"xlim\": [-0.1, 2.1], \"ylim\": [0.9, 3.1], \"xdomain\": [-0.1, 2.1], \"ydomain\": [0.9, 3.1], \"xscale\": \"linear\", \"yscale\": \"linear\", \"axes\": [{\"position\": \"bottom\", \"nticks\": 11, \"tickvalues\": null, \"tickformat_formatter\": \"\", \"tickformat\": null, \"scale\": \"linear\", \"fontsize\": 10.0, \"grid\": {\"gridOn\": false}, \"visible\": true}, {\"position\": \"left\", \"nticks\": 11, \"tickvalues\": null, \"tickformat_formatter\": \"\", \"tickformat\": null, \"scale\": \"linear\", \"fontsize\": 10.0, \"grid\": {\"gridOn\": false}, \"visible\": true}], \"axesbg\": \"#FFFFFF\", \"axesbgalpha\": null, \"zoomable\": true, \"id\": \"el120139912318424592\", \"lines\": [{\"data\": \"data01\", \"xindex\": 0, \"yindex\": 1, \"coordinates\": \"data\", \"id\": \"el120139912318079696\", \"color\": \"#1F77B4\", \"linewidth\": 1.5, \"dasharray\": \"none\", \"alpha\": 1, \"zorder\": 2, \"drawstyle\": \"default\"}], \"paths\": [], \"markers\": [], \"texts\": [], \"collections\": [], \"images\": [], \"sharex\": [], \"sharey\": []}], \"data\": {\"data01\": [[0.0, 1.0], [1.0, 2.0], [2.0, 3.0]]}, \"id\": \"el120139912039679376\", \"plugins\": [{\"type\": \"reset\"}, {\"type\": \"zoom\", \"button\": true, \"enabled\": false}, {\"type\": \"boxzoom\", \"button\": true, \"enabled\": false}]});\n",
" }(mpld3);\n",
"}else if(typeof define === \"function\" && define.amd){\n",
" // require.js is available: use it to load d3/mpld3\n",
" require.config({paths: {d3: \"https://d3js.org/d3.v5\"}});\n",
" require([\"d3\"], function(d3){\n",
" window.d3 = d3;\n",
" mpld3_load_lib(\"https://mpld3.github.io/js/mpld3.v0.5.8.js\", function(){\n",
" \n",
" mpld3.draw_figure(\"fig_el1201399120396793769970057120\", {\"width\": 432.0, \"height\": 288.0, \"axes\": [{\"bbox\": [0.125, 0.125, 0.775, 0.755], \"xlim\": [-0.1, 2.1], \"ylim\": [0.9, 3.1], \"xdomain\": [-0.1, 2.1], \"ydomain\": [0.9, 3.1], \"xscale\": \"linear\", \"yscale\": \"linear\", \"axes\": [{\"position\": \"bottom\", \"nticks\": 11, \"tickvalues\": null, \"tickformat_formatter\": \"\", \"tickformat\": null, \"scale\": \"linear\", \"fontsize\": 10.0, \"grid\": {\"gridOn\": false}, \"visible\": true}, {\"position\": \"left\", \"nticks\": 11, \"tickvalues\": null, \"tickformat_formatter\": \"\", \"tickformat\": null, \"scale\": \"linear\", \"fontsize\": 10.0, \"grid\": {\"gridOn\": false}, \"visible\": true}], \"axesbg\": \"#FFFFFF\", \"axesbgalpha\": null, \"zoomable\": true, \"id\": \"el120139912318424592\", \"lines\": [{\"data\": \"data01\", \"xindex\": 0, \"yindex\": 1, \"coordinates\": \"data\", \"id\": \"el120139912318079696\", \"color\": \"#1F77B4\", \"linewidth\": 1.5, \"dasharray\": \"none\", \"alpha\": 1, \"zorder\": 2, \"drawstyle\": \"default\"}], \"paths\": [], \"markers\": [], \"texts\": [], \"collections\": [], \"images\": [], \"sharex\": [], \"sharey\": []}], \"data\": {\"data01\": [[0.0, 1.0], [1.0, 2.0], [2.0, 3.0]]}, \"id\": \"el120139912039679376\", \"plugins\": [{\"type\": \"reset\"}, {\"type\": \"zoom\", \"button\": true, \"enabled\": false}, {\"type\": \"boxzoom\", \"button\": true, \"enabled\": false}]});\n",
" });\n",
" });\n",
"}else{\n",
" // require.js not available: dynamically load d3 & mpld3\n",
" mpld3_load_lib(\"https://d3js.org/d3.v5.js\", function(){\n",
" mpld3_load_lib(\"https://mpld3.github.io/js/mpld3.v0.5.8.js\", function(){\n",
" \n",
" mpld3.draw_figure(\"fig_el1201399120396793769970057120\", {\"width\": 432.0, \"height\": 288.0, \"axes\": [{\"bbox\": [0.125, 0.125, 0.775, 0.755], \"xlim\": [-0.1, 2.1], \"ylim\": [0.9, 3.1], \"xdomain\": [-0.1, 2.1], \"ydomain\": [0.9, 3.1], \"xscale\": \"linear\", \"yscale\": \"linear\", \"axes\": [{\"position\": \"bottom\", \"nticks\": 11, \"tickvalues\": null, \"tickformat_formatter\": \"\", \"tickformat\": null, \"scale\": \"linear\", \"fontsize\": 10.0, \"grid\": {\"gridOn\": false}, \"visible\": true}, {\"position\": \"left\", \"nticks\": 11, \"tickvalues\": null, \"tickformat_formatter\": \"\", \"tickformat\": null, \"scale\": \"linear\", \"fontsize\": 10.0, \"grid\": {\"gridOn\": false}, \"visible\": true}], \"axesbg\": \"#FFFFFF\", \"axesbgalpha\": null, \"zoomable\": true, \"id\": \"el120139912318424592\", \"lines\": [{\"data\": \"data01\", \"xindex\": 0, \"yindex\": 1, \"coordinates\": \"data\", \"id\": \"el120139912318079696\", \"color\": \"#1F77B4\", \"linewidth\": 1.5, \"dasharray\": \"none\", \"alpha\": 1, \"zorder\": 2, \"drawstyle\": \"default\"}], \"paths\": [], \"markers\": [], \"texts\": [], \"collections\": [], \"images\": [], \"sharex\": [], \"sharey\": []}], \"data\": {\"data01\": [[0.0, 1.0], [1.0, 2.0], [2.0, 3.0]]}, \"id\": \"el120139912039679376\", \"plugins\": [{\"type\": \"reset\"}, {\"type\": \"zoom\", \"button\": true, \"enabled\": false}, {\"type\": \"boxzoom\", \"button\": true, \"enabled\": false}]});\n",
" })\n",
" });\n",
"}\n",
"</script>\n"
]
}
],
"source": [
"print(html_string)"
]
},
{
"cell_type": "markdown",
"id": "16052ceb-e8b4-4faa-99c8-a46428a9b757",
"metadata": {},
"source": [
"Does it work? Because I'm demonstrating this in a Jupyter notebook and it has the ability to render HTML, I should be able to see."
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "11318747-8bfd-4f0d-a988-2a6407c0ee35",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"<style>\n",
"\n",
"</style>\n",
"\n",
"<div id=\"fig_el1201399120396793769970057120\"></div>\n",
"<script>\n",
"function mpld3_load_lib(url, callback){\n",
" var s = document.createElement('script');\n",
" s.src = url;\n",
" s.async = true;\n",
" s.onreadystatechange = s.onload = callback;\n",
" s.onerror = function(){console.warn(\"failed to load library \" + url);};\n",
" document.getElementsByTagName(\"head\")[0].appendChild(s);\n",
"}\n",
"\n",
"if(typeof(mpld3) !== \"undefined\" && mpld3._mpld3IsLoaded){\n",
" // already loaded: just create the figure\n",
" !function(mpld3){\n",
" \n",
" mpld3.draw_figure(\"fig_el1201399120396793769970057120\", {\"width\": 432.0, \"height\": 288.0, \"axes\": [{\"bbox\": [0.125, 0.125, 0.775, 0.755], \"xlim\": [-0.1, 2.1], \"ylim\": [0.9, 3.1], \"xdomain\": [-0.1, 2.1], \"ydomain\": [0.9, 3.1], \"xscale\": \"linear\", \"yscale\": \"linear\", \"axes\": [{\"position\": \"bottom\", \"nticks\": 11, \"tickvalues\": null, \"tickformat_formatter\": \"\", \"tickformat\": null, \"scale\": \"linear\", \"fontsize\": 10.0, \"grid\": {\"gridOn\": false}, \"visible\": true}, {\"position\": \"left\", \"nticks\": 11, \"tickvalues\": null, \"tickformat_formatter\": \"\", \"tickformat\": null, \"scale\": \"linear\", \"fontsize\": 10.0, \"grid\": {\"gridOn\": false}, \"visible\": true}], \"axesbg\": \"#FFFFFF\", \"axesbgalpha\": null, \"zoomable\": true, \"id\": \"el120139912318424592\", \"lines\": [{\"data\": \"data01\", \"xindex\": 0, \"yindex\": 1, \"coordinates\": \"data\", \"id\": \"el120139912318079696\", \"color\": \"#1F77B4\", \"linewidth\": 1.5, \"dasharray\": \"none\", \"alpha\": 1, \"zorder\": 2, \"drawstyle\": \"default\"}], \"paths\": [], \"markers\": [], \"texts\": [], \"collections\": [], \"images\": [], \"sharex\": [], \"sharey\": []}], \"data\": {\"data01\": [[0.0, 1.0], [1.0, 2.0], [2.0, 3.0]]}, \"id\": \"el120139912039679376\", \"plugins\": [{\"type\": \"reset\"}, {\"type\": \"zoom\", \"button\": true, \"enabled\": false}, {\"type\": \"boxzoom\", \"button\": true, \"enabled\": false}]});\n",
" }(mpld3);\n",
"}else if(typeof define === \"function\" && define.amd){\n",
" // require.js is available: use it to load d3/mpld3\n",
" require.config({paths: {d3: \"https://d3js.org/d3.v5\"}});\n",
" require([\"d3\"], function(d3){\n",
" window.d3 = d3;\n",
" mpld3_load_lib(\"https://mpld3.github.io/js/mpld3.v0.5.8.js\", function(){\n",
" \n",
" mpld3.draw_figure(\"fig_el1201399120396793769970057120\", {\"width\": 432.0, \"height\": 288.0, \"axes\": [{\"bbox\": [0.125, 0.125, 0.775, 0.755], \"xlim\": [-0.1, 2.1], \"ylim\": [0.9, 3.1], \"xdomain\": [-0.1, 2.1], \"ydomain\": [0.9, 3.1], \"xscale\": \"linear\", \"yscale\": \"linear\", \"axes\": [{\"position\": \"bottom\", \"nticks\": 11, \"tickvalues\": null, \"tickformat_formatter\": \"\", \"tickformat\": null, \"scale\": \"linear\", \"fontsize\": 10.0, \"grid\": {\"gridOn\": false}, \"visible\": true}, {\"position\": \"left\", \"nticks\": 11, \"tickvalues\": null, \"tickformat_formatter\": \"\", \"tickformat\": null, \"scale\": \"linear\", \"fontsize\": 10.0, \"grid\": {\"gridOn\": false}, \"visible\": true}], \"axesbg\": \"#FFFFFF\", \"axesbgalpha\": null, \"zoomable\": true, \"id\": \"el120139912318424592\", \"lines\": [{\"data\": \"data01\", \"xindex\": 0, \"yindex\": 1, \"coordinates\": \"data\", \"id\": \"el120139912318079696\", \"color\": \"#1F77B4\", \"linewidth\": 1.5, \"dasharray\": \"none\", \"alpha\": 1, \"zorder\": 2, \"drawstyle\": \"default\"}], \"paths\": [], \"markers\": [], \"texts\": [], \"collections\": [], \"images\": [], \"sharex\": [], \"sharey\": []}], \"data\": {\"data01\": [[0.0, 1.0], [1.0, 2.0], [2.0, 3.0]]}, \"id\": \"el120139912039679376\", \"plugins\": [{\"type\": \"reset\"}, {\"type\": \"zoom\", \"button\": true, \"enabled\": false}, {\"type\": \"boxzoom\", \"button\": true, \"enabled\": false}]});\n",
" });\n",
" });\n",
"}else{\n",
" // require.js not available: dynamically load d3 & mpld3\n",
" mpld3_load_lib(\"https://d3js.org/d3.v5.js\", function(){\n",
" mpld3_load_lib(\"https://mpld3.github.io/js/mpld3.v0.5.8.js\", function(){\n",
" \n",
" mpld3.draw_figure(\"fig_el1201399120396793769970057120\", {\"width\": 432.0, \"height\": 288.0, \"axes\": [{\"bbox\": [0.125, 0.125, 0.775, 0.755], \"xlim\": [-0.1, 2.1], \"ylim\": [0.9, 3.1], \"xdomain\": [-0.1, 2.1], \"ydomain\": [0.9, 3.1], \"xscale\": \"linear\", \"yscale\": \"linear\", \"axes\": [{\"position\": \"bottom\", \"nticks\": 11, \"tickvalues\": null, \"tickformat_formatter\": \"\", \"tickformat\": null, \"scale\": \"linear\", \"fontsize\": 10.0, \"grid\": {\"gridOn\": false}, \"visible\": true}, {\"position\": \"left\", \"nticks\": 11, \"tickvalues\": null, \"tickformat_formatter\": \"\", \"tickformat\": null, \"scale\": \"linear\", \"fontsize\": 10.0, \"grid\": {\"gridOn\": false}, \"visible\": true}], \"axesbg\": \"#FFFFFF\", \"axesbgalpha\": null, \"zoomable\": true, \"id\": \"el120139912318424592\", \"lines\": [{\"data\": \"data01\", \"xindex\": 0, \"yindex\": 1, \"coordinates\": \"data\", \"id\": \"el120139912318079696\", \"color\": \"#1F77B4\", \"linewidth\": 1.5, \"dasharray\": \"none\", \"alpha\": 1, \"zorder\": 2, \"drawstyle\": \"default\"}], \"paths\": [], \"markers\": [], \"texts\": [], \"collections\": [], \"images\": [], \"sharex\": [], \"sharey\": []}], \"data\": {\"data01\": [[0.0, 1.0], [1.0, 2.0], [2.0, 3.0]]}, \"id\": \"el120139912039679376\", \"plugins\": [{\"type\": \"reset\"}, {\"type\": \"zoom\", \"button\": true, \"enabled\": false}, {\"type\": \"boxzoom\", \"button\": true, \"enabled\": false}]});\n",
" })\n",
" });\n",
"}\n",
"</script>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.core.display import HTML\n",
"HTML(html_string)"
]
},
{
"cell_type": "markdown",
"id": "3eecbcd9-483c-4883-a93c-9f5736220e56",
"metadata": {},
"source": [
"The D3 version shows the same infomation as the original plot. The aesthetics are slightly different. Importantly, it is HTML generated via Python that the OP wanted with not too much addition or change to the original code block posted.\n",
"\n",
"Interestingly, the D3 plots have additional abilities you can access in the bottom right corner so that these are interactive. In fact, as highlighted [in this notebook here](https://nbviewer.org/gist/aflaxman/8780140), which I learned of [here](https://stackoverflow.com/q/36085869/8508004), you can use additional plugins from mpld3, to set the zoom settings at the outset and add a reset button."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment