{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" }, "toc": { "toc_cell": false, "toc_number_sections": true, "toc_threshold": 6, "toc_window_display": false }, "colab": { "name": "kl_py_plotly.ipynb", "provenance": [], "collapsed_sections": [], "include_colab_link": true } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "hBbdVnBFq8iW", "colab_type": "text" }, "source": [ "

\n", " \n", " \n", "

\n", "\n", "\n", "

\n", "\n", "\n", "\n", "# Python alapok (Plotly)\n", "\n", "\n", "\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": { "id": "BeXqeD_Sq8iX", "colab_type": "text" }, "source": [ "# Ábrakészítés a plotly modul segítségével\n", "\n", "Az ábrakészítéshez természetesen az eddig használt [matplotlib](http://matplotlib.org/) modul mellett számos másik függvénycsomag is létezik. A lent röviden bemutatott [plotly](https://plot.ly/) modul előnye, hogy az alapbeállításokat használva is [elegáns és interaktív](https://plot.ly/feed/) ábrákat tudunk készíteni.\n", "\n", "A plotly szintaxisa az eddigiektől azonban némiképp eltér, ennek a rövid bemutatására törekszünk néhány példán keresztül." ] }, { "cell_type": "markdown", "metadata": { "id": "K82G7FiRq8iY", "colab_type": "text" }, "source": [ "## A plotly offline és online üzemmódja\n", "\n", "A plotly alapvetően egy webes felület, melyen egy ingyenes regisztráció és bejelentkezés után mindenkinek lehetősége nyílik adatok feltöltésére, azok feldolgozására interaktív ábrák formájában, majd a legyártott ábrák megosztására. Ez a módszer jelentősen megkönnyítheti egy csoporton belül a kollaborációt, hiszen a csoporttagok nemcsak az ábrákhoz férnek hozzá, hanem magukhoz az adatokhoz és az ábrákat legyártó kódrészletekhez is. Így ha valaki csak a vonalak színét szeretné egy ábrán megváltoztatni, nem kell e-mailben megkérnie az ábra eredeti gyártóját, hogy ezt tegye meg, hanem a kód átírásával saját maga is megoldhatja.\n", "\n", "Néha azonban a vizsgált adatok természetüknél fogva nem tölthetők fel egy publikus tárhelyre, a privát tárhely használatához pedig Pro accountra van szükség, ami értelemszerűen nem ingyenes. Gyakran előfordul olyan probléma is, hogy a feldolgozni kívánt adatfájlok annyira nagyok, hogy feltöltésük (illetve bármilyen mozgatásuk) nem praktikus. Ilyen és ehhez hasonló esetekben szükség lenne egy \"lokális\" ábrakészítő opcióra, mellyel nem az adatok mennek a plotlyhoz, hanem a plotly jön az adatokhoz. Ennek a megoldására készült a [Plotly Offline](https://plot.ly/python/offline/) verziója, mellyel az ábrák és adatok nem egy központi szerveren tárolódnak, hanem a lokális gépen, illetve notebookban. A lenti példákban ezt az offline verziót használjuk.\n", "\n", "(A plotly ábrák generálása emellett nemcsak a mostanra megszokott Python nyelven lehetséges, hanem akár R-ben vagy JavaScriptben is. Ezekről az alábbiakban nem ejtünk szót.)" ] }, { "cell_type": "markdown", "metadata": { "id": "tdw0YxAIq8iY", "colab_type": "text" }, "source": [ "### A plotly modul importálása és az offline verzió függvényeinek betöltése" ] }, { "cell_type": "code", "metadata": { "id": "OXJ9xohgq8iZ", "colab_type": "code", "colab": {}, "outputId": "c1c0d62e-9dae-44de-8785-a36a04b401f2" }, "source": [ "from plotly import *\n", "from plotly.offline import *\n", "init_notebook_mode()" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "AvPXhMiMq8ic", "colab_type": "text" }, "source": [ "### Egyéb hasznos, már ismert modulok importálása" ] }, { "cell_type": "code", "metadata": { "id": "2vQ3pE5Eq8id", "colab_type": "code", "colab": {} }, "source": [ "import numpy as np" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "e-aWCLMMq8if", "colab_type": "text" }, "source": [ "## Egyszerű ábra készítése" ] }, { "cell_type": "markdown", "metadata": { "id": "QGOqDJs5q8if", "colab_type": "text" }, "source": [ "### Adatok gyártása\n", "\n", "Mint ahogy a matplotlib modulnál is láttuk, minden ábra generálásához elsőként az adatok betöltésére vagy legyártására van szükség. Nézzük a szokásos példánkat: ábrázoljuk a sin(x) függvényt 0 és 2π között." ] }, { "cell_type": "code", "metadata": { "id": "b4t0OtQ3q8ig", "colab_type": "code", "colab": {} }, "source": [ "x_pontok = np.linspace(0,2*np.pi,10)\n", "y_pontok = np.sin(x_pontok)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "GiwrYMznq8ii", "colab_type": "text" }, "source": [ "### Az ábra elkészítése\n", "\n", "A plotly kicsit másképp viselkedik, mint amit a matplotlib-nél láttunk. Itt egy ábrát alapvetően különféle objektumokkal és egymásba ágyazott `dict`-ekkel definiálhatunk. Az ábra minden egyes jellemzőjéhez (pl. színek, rács, az adatok, stb.) tartozik egy kulcs-érték páros.\n", "\n", "Ezeket a jellemzőket a plotly két kategóriába sorolja, a `trace`-ekbe és a `layout`-ba. A `trace`-ek olyan objektumok, melyek egy adatsort írnak le az ábrán, például egy Scatter vagy egy Heatmap objektum. Egy ábrán természetesen több `trace` is lehet, ha például kétféle adatsort is ábrázolni szeretnénk. A `trace`-ek emellett ábrákon belül is kombinálhatók, egyetlen ábrán megjeleníthetünk elszórt mérési pontokat és oszlopdiagramot is. A `layout` jellemzők pedig az ábra egészére vonatkozó formázási utasítások, például az ábra címe, a háttér színe, a tengelyfeliratok, illetve további annotációk (szövegek).\n", "\n", "Az ábrakészítésben a [plotly dokumentációja](https://plot.ly/python/reference/) sok segítséget ad.\n", "\n", "---\n", "\n", "\n", "**1. `Trace`-ek legyártása**\n", "\n", "Egy ábra definiálásakor tehát elsőként az adatokból le kell gyártanunk a megfelelő `trace`-eket. A konkrét példában egy olyan ábrát szeretnénk, ahol a fenti `y_pontok` array az `x_pontok` array függvényében van ábrázolva, és a pontok folytonos vonallal vannak összekötve. Ezt az alábbi utasítással tehetjük meg:" ] }, { "cell_type": "code", "metadata": { "id": "xcTGd_-3q8ij", "colab_type": "code", "colab": {}, "outputId": "0531be07-c18a-4543-f9a6-c6f7dd7fefc9" }, "source": [ "trace_sin_gorbe = graph_objs.Scatter(x=x_pontok, y=y_pontok, mode='lines')\n", "trace_sin_gorbe" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "{'mode': 'lines',\n", " 'type': 'scatter',\n", " 'x': array([ 0. , 0.6981317 , 1.3962634 , 2.0943951 , 2.7925268 ,\n", " 3.4906585 , 4.1887902 , 4.88692191, 5.58505361, 6.28318531]),\n", " 'y': array([ 0.00000000e+00, 6.42787610e-01, 9.84807753e-01,\n", " 8.66025404e-01, 3.42020143e-01, -3.42020143e-01,\n", " -8.66025404e-01, -9.84807753e-01, -6.42787610e-01,\n", " -2.44929360e-16])}" ] }, "metadata": { "tags": [] }, "execution_count": 4 } ] }, { "cell_type": "markdown", "metadata": { "id": "izdJSw5Gq8im", "colab_type": "text" }, "source": [ "Itt tehát legyártottunk egy \"gráf objektumot\", mely most éppen `Scatter` típusú. A kiíratásból láthatjuk, hogy bár ezt mint egy objektumot definiáltuk, valójában egy olyan `dict`, melyben a `'type'` kulcshoz a `'scatter'` érték tartozik. Tehát tulajdonképpen az alábbi módszer is működne a fenti `trace` definiálására, az objektumként való megadás csak a kényelmünket szolgálja." ] }, { "cell_type": "code", "metadata": { "id": "Wugaoc21q8im", "colab_type": "code", "colab": {} }, "source": [ "trace_sin_gorbe = {'mode': 'lines',\n", " 'type' : 'scatter',\n", " 'x': x_pontok,\n", " 'y': y_pontok}" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "Jh8Ex4aEq8io", "colab_type": "text" }, "source": [ "Arra viszont figyeljünk, hogy ha a `dict`-ként való megadást választjuk, akkor a kulcs-érték párokat kettősponttal válasszuk el, a gráf objektumként való megadás esetén pedig egyenlőségjellel.\n", "\n", "A `mode` kulcshoz írt `'lines'` azt jelenti, hogy az adatpontokat vonallal szeretnénk az ábrán összekötni. Ha csak be szeretnénk szórni a pontokat az ábrára, akkor ide írjuk a `'markers'` kifejezést.\n", "\n", "Végül tegyük be az `adatok_sin_gorbe` listába a legyártott `trace` objektumokat. Mivel ebben a példában csak egyetlen `trace`-re volt szükség, így ez elhagyható lenne, de több `trace` esetén az összeset célszerű egy listába összefűzni:" ] }, { "cell_type": "code", "metadata": { "id": "hbZW29HHq8ip", "colab_type": "code", "colab": {} }, "source": [ "adatok_sin_gorbe = [trace_sin_gorbe]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "N4Q33NA1q8iq", "colab_type": "text" }, "source": [ "---\n", "\n", "**2. A `layout` definiálása**\n", "\n", "Adjunk az ábránknak címet, a tengelyekre pedig rakjunk tengelyfeliratot. Ezt a `Layout` objektum specifikálásával tehetjük meg az alábbiak szerint:" ] }, { "cell_type": "code", "metadata": { "id": "Hfd0lct1q8ir", "colab_type": "code", "colab": {}, "outputId": "1b8cdfd8-964e-495e-d8c4-9dfd9d878ff7" }, "source": [ "layout_sin_gorbe = graph_objs.Layout(title='Ez az ábra címe',\n", " xaxis=graph_objs.XAxis(title='x'), \n", " yaxis=graph_objs.YAxis(title='sin(x)'))\n", "layout_sin_gorbe" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "{'title': 'Ez az ábra címe',\n", " 'xaxis': {'title': 'x'},\n", " 'yaxis': {'title': 'sin(x)'}}" ] }, "metadata": { "tags": [] }, "execution_count": 7 } ] }, { "cell_type": "markdown", "metadata": { "id": "aKo-9Jtuq8it", "colab_type": "text" }, "source": [ "A `Layout` objektum `xaxis` változója egy `XAxis` objektum, melyben már a `title` változó értéke közvetlenül megadható. Hasonlóan járunk az `yaxis` változó esetén is. Látjuk azonban, hogy csakúgy mint a `trace` esetén, ezek az objektumok itt is helyettesíthetők egymásba ágyazott `dict`-ekkel:" ] }, { "cell_type": "code", "metadata": { "id": "N_rBqstuq8it", "colab_type": "code", "colab": {} }, "source": [ "layout_sin_gorbe = {'title': 'Ez az ábra címe',\n", " 'xaxis': {'title': 'x'},\n", " 'yaxis': {'title': 'sin(x)'}}" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "yMjqKPLCq8iv", "colab_type": "text" }, "source": [ "---\n", "\n", "**3. A `Figure` objektum legyártása**\n", "\n", "Miután az összes szükséges objektum elkészült (az adatokhoz a megfelelő `trace`-ek, az ábra formázásához pedig a `Layout`), ezeket összefűzve definiálhatjuk a `Figure` objektumot:" ] }, { "cell_type": "code", "metadata": { "id": "DwgDFJTzq8iw", "colab_type": "code", "colab": {}, "outputId": "2a10a268-f27e-4c4f-cc73-36369e25ea1c" }, "source": [ "figure_sin_gorbe = graph_objs.Figure(data=adatok_sin_gorbe, layout=layout_sin_gorbe)\n", "figure_sin_gorbe" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "{'data': [{'mode': 'lines',\n", " 'type': 'scatter',\n", " 'x': array([ 0. , 0.6981317 , 1.3962634 , 2.0943951 , 2.7925268 ,\n", " 3.4906585 , 4.1887902 , 4.88692191, 5.58505361, 6.28318531]),\n", " 'y': array([ 0.00000000e+00, 6.42787610e-01, 9.84807753e-01,\n", " 8.66025404e-01, 3.42020143e-01, -3.42020143e-01,\n", " -8.66025404e-01, -9.84807753e-01, -6.42787610e-01,\n", " -2.44929360e-16])}],\n", " 'layout': {'title': 'Ez az ábra címe',\n", " 'xaxis': {'title': 'x'},\n", " 'yaxis': {'title': 'sin(x)'}}}" ] }, "metadata": { "tags": [] }, "execution_count": 9 } ] }, { "cell_type": "markdown", "metadata": { "id": "NJNH89V9q8i0", "colab_type": "text" }, "source": [ "A fentiekhez hasonlóan ez is \"csak\" egy egymásba ágyazott `dict` objektum lesz, melyet a hagyományos úton is definiálhattunk volna.\n", "\n", "---\n", "\n", "**4. Az ábra kirajzoltatása**\n", "\n", "Az így elkészített `Figure` objektum már ábrázolható:" ] }, { "cell_type": "code", "metadata": { "id": "PGp4Nr_-q8i0", "colab_type": "code", "colab": {}, "outputId": "5e1ecd0c-83ff-499c-ff4f-062fc4d84a73" }, "source": [ "iplot(figure_sin_gorbe)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "SVfLRI44q8i2", "colab_type": "text" }, "source": [ "---\n", "\n", "**Összefoglalva: **\n", "\n", "A fentiek talán bonyolultnak tűnnek, de valójában néhány sorban el tudjuk készíteni a fenti ábrát. Láthattuk, hogy a gráfobjektumok definiálása mindig a `graph_objs` almodul használatával történik. Érdemes tehát az egész almodul összes függvényét importálni, így többé nem kell kiírnunk a `graph_objs.` részletet.\n", "\n", "A fenti ábra persze nagyon \"szögletes\" egy valódi sin-görbének, de ezen könnyen segíthetünk: növeljük meg a mintavételezési pontok számát és ábrázoljuk újra, most azonban a cos-görbével együtt. Ekkor már két `trace` objektumot kell gyártanunk." ] }, { "cell_type": "code", "metadata": { "id": "FR7SGzw3q8i3", "colab_type": "code", "colab": {} }, "source": [ "from plotly.graph_objs import *" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "U_mLXMv7q8i4", "colab_type": "code", "colab": {}, "outputId": "317cc54c-a981-4660-a723-d065b047f9e1" }, "source": [ "x_pontok_uj = np.linspace(0,2*np.pi,50)\n", "y_pontok_sin = np.sin(x_pontok_uj)\n", "y_pontok_cos = np.cos(x_pontok_uj)\n", "trace_sin_gorbe = Scatter(x=x_pontok_uj, y=y_pontok_sin, mode='lines')\n", "trace_cos_gorbe = Scatter(x=x_pontok_uj, y=y_pontok_cos, mode='lines')\n", "adatok = [trace_sin_gorbe, trace_cos_gorbe]\n", "layout_sin_gorbe = Layout(title='Ez az új ábra címe',\n", " xaxis=XAxis(title='x'), \n", " yaxis=YAxis(title='sin(x), cos(x)'))\n", "figure_uj = Figure(data=adatok, layout=layout_sin_gorbe)\n", "iplot(figure_uj)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "MFy46KDJq8i6", "colab_type": "text" }, "source": [ "Milyen szép sima görbéket kaptunk! Ellenőrizzük, hogy ez valóban így van-e! Próbáljunk az ábra jobb felső sarkában lévő gombokkal ráközelíteni egy-egy csúcsra. Látható, hogy ilyen skálán még ezek a görbék is szögletesek.\n", "\n", "A plotly nagy előnye az ilyen jellegű interaktív nézegetési lehetőség. Ha egy ábrán nagyon sok mérési pont van, akkor csak kellően ráközelítve tudjuk őket megkülönböztetni egymástól. A jobb oldalon a `trace 0` és `trace 1` feliratok melletti vonalakra kattintva az aktuális görbe az ábráról ideiglenesen eltűntethető, majd ismételt kattintással újra megjeleníthető." ] }, { "cell_type": "markdown", "metadata": { "id": "83fgeOMNq8i6", "colab_type": "text" }, "source": [ "## Oszlopdiagram készítése" ] }, { "cell_type": "markdown", "metadata": { "id": "WOBpd9DPq8i7", "colab_type": "text" }, "source": [ "Ha a fenti ábrát nem vonalakkal szeretnénk elkészíteni, hanem mondjuk a cos függvényt oszlopdiagrammal, csak a `trace` típusán kell változtatnunk:" ] }, { "cell_type": "code", "metadata": { "id": "3yrd5PZXq8i7", "colab_type": "code", "colab": {}, "outputId": "ea8876f5-f9ad-4110-af48-fa56b3499848" }, "source": [ "trace_sin_gorbe = Scatter(x=x_pontok_uj, y=y_pontok_sin, mode='lines')\n", "trace_cos_gorbe = Bar(x=x_pontok_uj, y=y_pontok_cos)\n", "adatok = [trace_sin_gorbe, trace_cos_gorbe]\n", "layout_sin_gorbe = Layout(title='Ez az oszlopos ábra címe',\n", " xaxis=XAxis(title='x'), \n", " yaxis=YAxis(title='sin(x), cos(x)'))\n", "figure_oszlop = Figure(data=adatok, layout=layout_sin_gorbe)\n", "iplot(figure_oszlop)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "ldxgikWQq8i9", "colab_type": "text" }, "source": [ "## 3D-s ábra készítése\n", "\n", "A következő háromdimenziós ábrához az ábrázolni kívánt pontok koordinátáit a `plotly_3D.txt` szövegfájlban találjuk. Az adatok [innen](https://github.com/PointCloudLibrary/data/blob/master/tutorials/ism_train_horse.pcd) származnak, hasonló ábrák készítéséhez hasznos adatfájlok [itt](https://github.com/PointCloudLibrary/data/blob/master/tutorials) találhatók. \n", "\n", "Az adatfájlban az első oszlop az x, a második az y, a harmadik pedig a z koordináta. Elsőként olvassuk be az adatokat. Ehhez a loadtxt függvényt használjuk, mely a numpy modulban található." ] }, { "cell_type": "code", "metadata": { "id": "xF2_CxU7q8i-", "colab_type": "code", "colab": {} }, "source": [ "data_file = np.loadtxt('data/plotly_3D.txt')\n", "x_tengely = data_file[:,0]\n", "y_tengely = data_file[:,1]\n", "z_tengely = data_file[:,2]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "NkJfdt0yq8i_", "colab_type": "text" }, "source": [ "Ezek után már csak az ábrázolás van hátra. Most nem az eddig használt `Scatter` objektumra van szükség, hanem ennek a 3D-s változatára, a `Scatter3d`-re." ] }, { "cell_type": "code", "metadata": { "id": "FMW04Yncq8jA", "colab_type": "code", "colab": {}, "outputId": "13a93f90-d6ed-4734-d7eb-ebc8bbacfd56" }, "source": [ "trace_3D = Scatter3d(x=x_tengely, y=y_tengely, z=z_tengely, mode='markers', marker = dict(size=2))\n", "adatok_3D = [trace_3D]\n", "layout_3D = Layout(width=900,height=500,scene=dict(aspectmode='manual', aspectratio = dict(x=0.2, y=1, z=2/3)))\n", "fig_3D = Figure(data=adatok_3D, layout=layout_3D)\n", "iplot(fig_3D)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "RC29oz-qq8jD", "colab_type": "text" }, "source": [ "Nagyítsuk, forgassuk kedvünkre az ábrát. Próbáljuk meg kitalálni, hogy mit jelenthet a `Layout` objektumon belül szereplő `aspectratio` kulcsszó." ] }, { "cell_type": "markdown", "metadata": { "id": "D84zuXVpq8jE", "colab_type": "text" }, "source": [ "## ☠ Színes kör\n", "\n", "Ábrázoljunk scatter pontokkal egy $r=3$ egység sugarú kört, a pontok színét aszerint választva, hogy melyik síknegyedben van a pont.\n", "\n", "A kör ábrázolásához elsőként le kell gyártani azokat az $(x,y)$ koordinátapárokat, melyek majd a kört kirajzolják. Ennek a legegyszerűbb módja az alábbi paraméterezés:\n", "\n", "$$x = r\\cos(\\phi)$$\n", "$$y = r\\sin(\\phi)$$\n", "\n", "Ahol $\\phi$ az x-tengelytől mért szög. Így a $\\phi$ értékeit egyenletesen megválasztva a $(0,2\\pi)$ intervallumon, az $x$ és $y$ értékeit tartalmazó array-ek a fentiek szerint adódnak:" ] }, { "cell_type": "code", "metadata": { "id": "7DHZ0uUaq8jE", "colab_type": "code", "colab": {} }, "source": [ "r = 3\n", "phi = np.linspace(0,2*np.pi,1000)\n", "x = r*np.cos(phi)\n", "y = r*np.sin(phi)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "6FNzAHqNq8jG", "colab_type": "text" }, "source": [ "Attól függően, hogy az adott $x$ és $y$ milyen előjelű, 4-féle kategóriába sorolhatók a pontok. (Másként fogalmazva attól függően, hogy a pont melyik síknegyedbe esik.) A tengelyeket mindig a tőlük az óramutató járásával megegyező irányba eső síknegyedhez soroljuk.\n", "\n", "Hogy ezeket különböző színnel tudjuk ábrázolni, egy lehetséges megoldás, hogy négy különböző `trace` objektumot generálunk az alábbiak szerint:" ] }, { "cell_type": "code", "metadata": { "id": "F-HEurEiq8jH", "colab_type": "code", "colab": {}, "outputId": "0a63ffc1-a540-4bcb-d961-084cea93a7eb" }, "source": [ "trace_1 = Scatter(x=x[(x<0) * (y<0)], y=y[(x<0) * (y<0)], mode='lines', marker=dict(color='red'))\n", "trace_2 = Scatter(x=x[(x>=0) * (y<0)], y=y[(x>=0) * (y<0)], mode='lines', marker=dict(color='blue'))\n", "trace_3 = Scatter(x=x[(x<0) * (y>=0)], y=y[(x<0) * (y>=0)], mode='lines', marker=dict(color='green'))\n", "trace_4 = Scatter(x=x[(x>=0) * (y>=0)], y=y[(x>=0) * (y>=0)], mode='lines', marker=dict(color='orange'))\n", "data = [trace_1, trace_2, trace_3, trace_4]\n", "layout = Layout(title='Ez egy színes kör', width=500, height=500)\n", "fig = Figure(data=data, layout=layout)\n", "iplot(fig)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] } ] }