{"id":419,"date":"2013-05-30T17:13:16","date_gmt":"2013-05-30T16:13:16","guid":{"rendered":"http:\/\/numbercrunch.de\/blog\/?p=419"},"modified":"2023-01-18T23:37:32","modified_gmt":"2023-01-18T22:37:32","slug":"visualizing-streamlines","status":"publish","type":"post","link":"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/","title":{"rendered":"Visualizing streamlines"},"content":{"rendered":"<p style=\"text-align: justify;\">In <a href=\"http:\/\/numbercrunch.de\/blog\/2013\/05\/visualizing-vector-fields\/\">Visualizing vector fields<\/a> I showed how to plot vector fields using Python and Matplotlib. Streamlines are a concept that is closely related to vector fields. Mathematically speaking streamlines are\u00a0continuous lines whose tangent at each point is given by a vector field. Each line, and therefore also streamlines, can be parametrized by some parameter $t$. A streamline $\\vec{r}(t)$ fulfils the equation\\begin{equation}<br \/>\n\\frac{\\mathrm{d}\\vec{r}(t)}{\\mathrm{d}t} = g(t)\\vec{E}(\\vec{r}(t))\\,,<br \/>\n\\end{equation}<br \/>\nwhere $\\vec{E}(\\vec{r}(t))$ is the vector field and $g(t)$ some scaling function. The scaling functions is arbitrary but must not be zero. It basically determines how fast one moves along the streamline as a function of the parameter $t$. It is often convenient to set\\begin{equation}<br \/>\ng(t)=\\frac{1}{|\\vec{E}(\\vec{r}(t))|}\\,.<br \/>\n\\end{equation}<\/p>\n<p style=\"text-align: justify;\">Since version 1.2.0 the Python package Matplotlib comes with a <a href=\"http:\/\/matplotlib.org\/api\/pyplot_api.html#matplotlib.pyplot.streamplot\">streamplot<\/a>\u00a0 function for quick and easy visualizing two-dimensional streamlines. Coming back the example of an electric dipole from\u00a0<a href=\"http:\/\/numbercrunch.de\/blog\/2013\/05\/visualizing-vector-fields\/\">Visualizing vector fields<\/a> the following Python code plots the streamlines of an electric dipole. Compared to the previous post on the plotting vector fields this code is somewhat more generic. First some charges are specified and afterwards the total electric field is calculated by summing over the electric field of the individual charges.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">#!\/usr\/bin\/env python\n\n# import useful modules\nimport matplotlib \nfrom numpy import *\nfrom pylab import *\nfrom scipy.integrate import ode\n\n# use LaTeX, choose nice some looking fonts and tweak some settings\nmatplotlib.rc('font', family='serif')\nmatplotlib.rc('font', size=16)\nmatplotlib.rc('legend', fontsize=16)\nmatplotlib.rc('legend', numpoints=1)\nmatplotlib.rc('legend', handlelength=1.5)\nmatplotlib.rc('legend', frameon=False)\nmatplotlib.rc('xtick.major', pad=7)\nmatplotlib.rc('xtick.minor', pad=7)\nmatplotlib.rc('text', usetex=True)\nmatplotlib.rc('text.latex', \n              preamble=[r'\\usepackage[T1]{fontenc}',\n                        r'\\usepackage{amsmath}',\n                        r'\\usepackage{txfonts}',\n                        r'\\usepackage{textcomp}'])\n\nclass charge:\n    def __init__(self, q, pos):\n        self.q=q\n        self.pos=pos\n\ndef E_point_charge(q, a, x, y):\n    return q*(x-a[0])\/((x-a[0])**2+(y-a[1])**2)**(1.5), \\\n        q*(y-a[1])\/((x-a[0])**2+(y-a[1])**2)**(1.5)\n\ndef E_total(x, y, charges):\n    Ex, Ey=0, 0\n    for C in charges:\n        E=E_point_charge(C.q, C.pos, x, y)\n        Ex=Ex+E[0]\n        Ey=Ey+E[1]\n    return [ Ex, Ey ]\n\nclose('all')\nfigure(figsize=(6, 4.5))\n\n# charges and positions\ncharges=[ charge(1, [-1, 0]), charge(-1, [1, 0]) ]\n\n# plot field lines\nx0, x1=-2, 2\ny0, y1=-1.5, 1.5\nx=linspace(x0, x1, 64)\ny=linspace(y0, y1, 64)\nx, y=meshgrid(x, y)\nEx, Ey=E_total(x, y, charges)\nstreamplot(x, y, Ex, Ey, color='k')\n\n# plot point charges\nfor C in charges:\n    if C.q&gt;0:\n        plot(C.pos[0], C.pos[1], 'bo', ms=8*sqrt(C.q))\n    if C.q&lt;0:\n        plot(C.pos[0], C.pos[1], 'ro', ms=8*sqrt(-C.q))\n\nxlabel('$x$')\nylabel('$y$')\ngca().set_xlim(x0, x1)\ngca().set_ylim(y0, y1)\nshow()\naxis('image')\nsavefig('visualization_streamlines_1.png')<\/pre>\n<figure id=\"attachment_427\" aria-describedby=\"caption-attachment-427\" style=\"width: 459px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/numbercrunch.de\/blog\/wp-content\/uploads\/2013\/05\/visualization_streamlines_1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-427\" src=\"\/\/numbercrunch.de\/blog\/wp-content\/uploads\/2013\/05\/visualization_streamlines_1.png\" alt=\"Streamlines of an electric dipole visualized using Matplotlib's streamplot function.\" width=\"459\" height=\"347\" srcset=\"https:\/\/www.numbercrunch.de\/blog\/wp-content\/uploads\/2013\/05\/visualization_streamlines_1.png 459w, https:\/\/www.numbercrunch.de\/blog\/wp-content\/uploads\/2013\/05\/visualization_streamlines_1-300x226.png 300w\" sizes=\"(max-width: 459px) 100vw, 459px\" \/><\/a><figcaption id=\"caption-attachment-427\" class=\"wp-caption-text\">Streamlines of an electric dipole visualized using Matplotlib&#8217;s streamplot function.<\/figcaption><\/figure>\n<p style=\"text-align: justify;\">Matplotlib&#8217;s <code>streamplot<\/code> function is very generic and easy to use. However it does not know anything about specific characteristics of the vector field to plot. For example, it is not able to take into account that streamlines of electric fields always start and end at the charges. Therefore, the following code plots streamlines by solving the streamlines&#8217; ordinary differential equations. We always start close in the vicinity of the electric charges and extend each streamline until it has reached another charge or has left the plotting area.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">#!\/usr\/bin\/env python\n\n# import usefull modules\nimport matplotlib \nfrom numpy import *\nfrom pylab import *\nfrom scipy.integrate import ode\n\n# use LaTeX, choose nice some looking fonts and tweak some settings\nmatplotlib.rc('font', family='serif')\nmatplotlib.rc('font', size=16)\nmatplotlib.rc('legend', fontsize=16)\nmatplotlib.rc('legend', numpoints=1)\nmatplotlib.rc('legend', handlelength=1.5)\nmatplotlib.rc('legend', frameon=False)\nmatplotlib.rc('xtick.major', pad=7)\nmatplotlib.rc('xtick.minor', pad=7)\nmatplotlib.rc('text', usetex=True)\nmatplotlib.rc('text.latex', \n              preamble=[r'\\usepackage[T1]{fontenc}',\n                        r'\\usepackage{amsmath}',\n                        r'\\usepackage{txfonts}',\n                        r'\\usepackage{textcomp}'])\n\nclass charge:\n    def __init__(self, q, pos):\n        self.q=q\n        self.pos=pos\n\ndef E_point_charge(q, a, x, y):\n    return q*(x-a[0])\/((x-a[0])**2+(y-a[1])**2)**(1.5), \\\n        q*(y-a[1])\/((x-a[0])**2+(y-a[1])**2)**(1.5)\n\ndef E_total(x, y, charges):\n    Ex, Ey=0, 0\n    for C in charges:\n        E=E_point_charge(C.q, C.pos, x, y)\n        Ex=Ex+E[0]\n        Ey=Ey+E[1]\n    return [ Ex, Ey ]\n\ndef E_dir(t, y, charges):\n    Ex, Ey=E_total(y[0], y[1], charges)\n    n=sqrt(Ex**2+Ey*Ey)\n    return [Ex\/n, Ey\/n]\n\nclose('all')\nfigure(figsize=(6, 4.5))\n\n# charges and positions\ncharges=[ charge(1, [-1, 0]), charge(-1, [1, 0]) ]\n\n# plot field lines\nx0, x1=-2, 2\ny0, y1=-1.5, 1.5\nR=0.01\n# loop over all charges\nfor C in charges:\n    # plot field lines starting in current charge\n    dt=0.8*R\n    if C.q&lt;0:\n        dt=-dt\n    # loop over field lines starting in different directions \n    # around current charge\n    for alpha in linspace(0, 2*pi*15\/16, 16):\n        r=ode(E_dir)\n        r.set_integrator('vode')\n        r.set_f_params(charges)\n        x=[ C.pos[0] + cos(alpha)*R ]\n        y=[ C.pos[1] + sin(alpha)*R ]\n        r.set_initial_value([x[0], y[0]], 0)\n        while r.successful():\n            r.integrate(r.t+dt)\n            x.append(r.y[0])\n            y.append(r.y[1])\n            hit_charge=False\n            # check if field line left drwaing area or ends in some charge\n            for C2 in charges:\n                if sqrt((r.y[0]-C2.pos[0])**2+(r.y[1]-C2.pos[1])**2)&lt;R:\n                    hit_charge=True\n            if hit_charge or (not (x0&lt;r.y[0] and r.y[0]&lt;x1)) or \\\n                    (not (y0&lt;r.y[1] and r.y[1]&lt;y1)):\n                break\n        plot(x, y, '-k')\n\n# plot point charges\nfor C in charges:\n    if C.q&gt;0:\n        plot(C.pos[0], C.pos[1], 'bo', ms=8*sqrt(C.q))\n    if C.q&lt;0:\n        plot(C.pos[0], C.pos[1], 'ro', ms=8*sqrt(-C.q))\n\nxlabel('$x$')\nylabel('$y$')\ngca().set_xlim(x0, x1)\ngca().set_ylim(y0, y1)\nshow()\naxis('image')\nsavefig('visualization_streamlines_2.png')<\/pre>\n<table style=\"border-collapse: collapse; width: 100%; height: 393px;\">\n<tbody>\n<tr style=\"height: 370px;\">\n<td style=\"width: 100%; height: 370px;\"><a href=\"http:\/\/numbercrunch.de\/blog\/wp-content\/uploads\/2013\/05\/visualization_streamlines_2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-428 aligncenter\" src=\"\/\/numbercrunch.de\/blog\/wp-content\/uploads\/2013\/05\/visualization_streamlines_2.png\" alt=\"Streamlines\" width=\"459\" height=\"347\" srcset=\"https:\/\/www.numbercrunch.de\/blog\/wp-content\/uploads\/2013\/05\/visualization_streamlines_2.png 459w, https:\/\/www.numbercrunch.de\/blog\/wp-content\/uploads\/2013\/05\/visualization_streamlines_2-300x226.png 300w\" sizes=\"(max-width: 459px) 100vw, 459px\" \/><\/a><\/td>\n<\/tr>\n<tr style=\"height: 23px;\">\n<td style=\"width: 100%; height: 23px; border-style: hidden; text-align: center;\">Streamlines of an electric dipole visualized by solving the streamlines&#8217; differential equations.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>In Visualizing vector fields I showed how to plot vector fields using Python and Matplotlib. Streamlines are a concept that is closely related to vector fields. Mathematically speaking streamlines are\u00a0continuous lines whose tangent at each point is given by a vector field. Each line, and therefore also streamlines, can be parametrized by some parameter $t$.&hellip; <a href=\"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Visualizing streamlines<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[],"class_list":["post-419","post","type-post","status-publish","format-standard","hentry","category-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Visualizing streamlines - Number Crunch<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Visualizing streamlines - Number Crunch\" \/>\n<meta property=\"og:description\" content=\"In Visualizing vector fields I showed how to plot vector fields using Python and Matplotlib. Streamlines are a concept that is closely related to vector fields. Mathematically speaking streamlines are\u00a0continuous lines whose tangent at each point is given by a vector field. Each line, and therefore also streamlines, can be parametrized by some parameter $t$.&hellip; Continue reading Visualizing streamlines\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/\" \/>\n<meta property=\"og:site_name\" content=\"Number Crunch\" \/>\n<meta property=\"article:published_time\" content=\"2013-05-30T16:13:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-01-18T22:37:32+00:00\" \/>\n<meta name=\"author\" content=\"Heiko Bauke\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Heiko Bauke\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/\"},\"author\":{\"name\":\"Heiko Bauke\",\"@id\":\"https:\/\/www.numbercrunch.de\/blog\/#\/schema\/person\/e73eab65b1721dd0c3d408edb887e413\"},\"headline\":\"Visualizing streamlines\",\"datePublished\":\"2013-05-30T16:13:16+00:00\",\"dateModified\":\"2023-01-18T22:37:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/\"},\"wordCount\":344,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.numbercrunch.de\/blog\/#\/schema\/person\/e73eab65b1721dd0c3d408edb887e413\"},\"articleSection\":[\"Python\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/\",\"url\":\"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/\",\"name\":\"Visualizing streamlines - Number Crunch\",\"isPartOf\":{\"@id\":\"https:\/\/www.numbercrunch.de\/blog\/#website\"},\"datePublished\":\"2013-05-30T16:13:16+00:00\",\"dateModified\":\"2023-01-18T22:37:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.numbercrunch.de\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Visualizing streamlines\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.numbercrunch.de\/blog\/#website\",\"url\":\"https:\/\/www.numbercrunch.de\/blog\/\",\"name\":\"Number Crunch\",\"description\":\"A computational science blog.\",\"publisher\":{\"@id\":\"https:\/\/www.numbercrunch.de\/blog\/#\/schema\/person\/e73eab65b1721dd0c3d408edb887e413\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.numbercrunch.de\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.numbercrunch.de\/blog\/#\/schema\/person\/e73eab65b1721dd0c3d408edb887e413\",\"name\":\"Heiko Bauke\",\"logo\":{\"@id\":\"https:\/\/www.numbercrunch.de\/blog\/#\/schema\/person\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Visualizing streamlines - Number Crunch","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/","og_locale":"en_US","og_type":"article","og_title":"Visualizing streamlines - Number Crunch","og_description":"In Visualizing vector fields I showed how to plot vector fields using Python and Matplotlib. Streamlines are a concept that is closely related to vector fields. Mathematically speaking streamlines are\u00a0continuous lines whose tangent at each point is given by a vector field. Each line, and therefore also streamlines, can be parametrized by some parameter $t$.&hellip; Continue reading Visualizing streamlines","og_url":"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/","og_site_name":"Number Crunch","article_published_time":"2013-05-30T16:13:16+00:00","article_modified_time":"2023-01-18T22:37:32+00:00","author":"Heiko Bauke","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Heiko Bauke","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/#article","isPartOf":{"@id":"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/"},"author":{"name":"Heiko Bauke","@id":"https:\/\/www.numbercrunch.de\/blog\/#\/schema\/person\/e73eab65b1721dd0c3d408edb887e413"},"headline":"Visualizing streamlines","datePublished":"2013-05-30T16:13:16+00:00","dateModified":"2023-01-18T22:37:32+00:00","mainEntityOfPage":{"@id":"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/"},"wordCount":344,"commentCount":1,"publisher":{"@id":"https:\/\/www.numbercrunch.de\/blog\/#\/schema\/person\/e73eab65b1721dd0c3d408edb887e413"},"articleSection":["Python"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/","url":"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/","name":"Visualizing streamlines - Number Crunch","isPartOf":{"@id":"https:\/\/www.numbercrunch.de\/blog\/#website"},"datePublished":"2013-05-30T16:13:16+00:00","dateModified":"2023-01-18T22:37:32+00:00","breadcrumb":{"@id":"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.numbercrunch.de\/blog\/2013\/05\/visualizing-streamlines\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.numbercrunch.de\/blog\/"},{"@type":"ListItem","position":2,"name":"Visualizing streamlines"}]},{"@type":"WebSite","@id":"https:\/\/www.numbercrunch.de\/blog\/#website","url":"https:\/\/www.numbercrunch.de\/blog\/","name":"Number Crunch","description":"A computational science blog.","publisher":{"@id":"https:\/\/www.numbercrunch.de\/blog\/#\/schema\/person\/e73eab65b1721dd0c3d408edb887e413"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.numbercrunch.de\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.numbercrunch.de\/blog\/#\/schema\/person\/e73eab65b1721dd0c3d408edb887e413","name":"Heiko Bauke","logo":{"@id":"https:\/\/www.numbercrunch.de\/blog\/#\/schema\/person\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.numbercrunch.de\/blog\/wp-json\/wp\/v2\/posts\/419"}],"collection":[{"href":"https:\/\/www.numbercrunch.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.numbercrunch.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.numbercrunch.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.numbercrunch.de\/blog\/wp-json\/wp\/v2\/comments?post=419"}],"version-history":[{"count":10,"href":"https:\/\/www.numbercrunch.de\/blog\/wp-json\/wp\/v2\/posts\/419\/revisions"}],"predecessor-version":[{"id":995,"href":"https:\/\/www.numbercrunch.de\/blog\/wp-json\/wp\/v2\/posts\/419\/revisions\/995"}],"wp:attachment":[{"href":"https:\/\/www.numbercrunch.de\/blog\/wp-json\/wp\/v2\/media?parent=419"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.numbercrunch.de\/blog\/wp-json\/wp\/v2\/categories?post=419"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.numbercrunch.de\/blog\/wp-json\/wp\/v2\/tags?post=419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}