{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## pyecharts\n", "- [HTML](http://htmlpreview.github.io/?https://github.com/zzsza/TIL/blob/master/python/pyecharts.html) 에서 확인하면 이쁜 그래프도 보입니다!!!\n", "- Baidu에서 데이터 시각화를 위해 만든 오픈소스인 Echarts의 파이썬 버전\n", "- 다양한 그래프 제공\n", "- [공식 문서](http://pyecharts.org/#/en-us/)\n", "- Dynamic\n", "- 단, 옵션의 단추가 중국어\n", "- 그래프를 그릴 때, echarts와 echartql을 로컬에서 찾으려고 함\n", " - 따라서 nbconvert를 사용해 HTML으로 저장한 후, 쉘에서 수정\n", " \n", " ```\n", " sed -i \"\" \"s|/nbextensions/echarts/echarts-gl.min|https://cdn.jsdelivr.net/npm/echarts-gl@1.1.1/dist/echarts-gl.min|g; s|/nbextensions/echarts/echarts.min|https://cdnjs.cloudflare.com/ajax/libs/echarts/4.1.0/echarts.min|g\" 파일이름.ipynb\n", " ```" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pyecharts\n", "import pandas as pd\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "attr = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n", "v1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3]\n", "v2 = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3]\n", "bar = pyecharts.Bar(\"Bar chart\", \"precipitation and evaporation one year\")\n", "bar.add(\"precipitation\", attr, v1, mark_line=[\"average\"], mark_point=[\"max\", \"min\"])\n", "bar.add(\"evaporation\", attr, v2, mark_line=[\"average\"], mark_point=[\"max\", \"min\"])\n", "bar.render()\n", "bar.height = 500\n", "bar.width = 800" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bar" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "attr = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n", "v1 = [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3]\n", "v2 = [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3]\n", "bar = pyecharts.Bar(\"Bar chart\", \"precipitation and evaporation one year\")\n", "bar.use_theme(\"dark\")\n", "bar.add(\"precipitation\", attr, v1, mark_line=[\"average\"], mark_point=[\"max\", \"min\"])\n", "bar.add(\"evaporation\", attr, v2, mark_line=[\"average\"], mark_point=[\"max\", \"min\"])\n", "bar.height = 500\n", "bar.width = 800\n", "bar" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## In pandas" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "title = \"bar chart2\"\n", "index = pd.date_range(\"8/24/2018\", periods=6, freq=\"M\")\n", "df1 = pd.DataFrame(np.random.randn(6), index=index)\n", "df2 = pd.DataFrame(np.random.rand(6), index=index)\n", "\n", "dfvalue1 = [i[0] for i in df1.values]\n", "dfvalue2 = [i[0] for i in df2.values]\n", "_index = [i for i in df1.index.format()]\n", "\n", "bar = pyecharts.Bar(title, \"Profit and loss situation\")\n", "bar.add(\"profit\", _index, dfvalue1)\n", "bar.add(\"loss\", _index, dfvalue2)\n", "bar.height = 500\n", "bar.width = 800\n", "bar" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pyecharts import Bar, Line, Overlap\n", "\n", "attr = ['A','B','C','D','E','F']\n", "v1 = [10, 20, 30, 40, 50, 60]\n", "v2 = [38, 28, 58, 48, 78, 68]\n", "bar = Bar(\"Line Bar\")\n", "bar.add(\"bar\", attr, v1)\n", "line = Line()\n", "line.add(\"line\", attr, v2)\n", "\n", "overlap = Overlap()\n", "overlap.add(bar)\n", "overlap.add(line)\n", "\n", "overlap" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pyecharts import Pie\n", "\n", "attr = ['A','B','C','D','E','F']\n", "v1 = [10, 20, 30, 40, 50, 60]\n", "v2 = [38, 28, 58, 48, 78, 68]\n", "pie = Pie(\"pie chart\", title_pos=\"center\", width=600)\n", "pie.add(\"A\", attr, v1, center=[25, 50], is_random=True, radius=[30, 75], rosetype='radius')\n", "pie.add(\"B\", attr, v2, center=[75, 50], is_randome=True, radius=[30, 75], rosetype='area', is_legend_show=False,\n", " is_label_show=True)\n", "pie" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 가로 그래프" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bar = Bar(\"가로 그래프\")\n", "bar.add(\"A\", attr, v1)\n", "bar.add(\"B\", attr, v2, is_convert=True)\n", "bar.width=800\n", "bar" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 슬라이더" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import random\n", "\n", "attr = [\"{}th\".format(i) for i in range(30)]\n", "v1 = [random.randint(1, 30) for _ in range(30)]\n", "bar = Bar(\"Bar - datazoom - slider \")\n", "bar.add(\"\", attr, v1, is_label_show=True, is_datazoom_show=True)\n", "# bar.render()\n", "bar" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "days = [\"{}th\".format(i) for i in range(30)]\n", "days_v1 = [random.randint(1, 30) for _ in range(30)]\n", "bar = Bar(\"Bar - datazoom - xaxis/yaxis\")\n", "bar.add(\n", " \"\",\n", " days,\n", " days_v1,\n", " is_datazoom_show=True,\n", " datazoom_type=\"slider\",\n", " datazoom_range=[10, 25],\n", " is_datazoom_extra_show=True,\n", " datazoom_extra_type=\"slider\",\n", " datazoom_extra_range=[10, 25],\n", " is_toolbox_show=False,\n", ")\n", "# bar.render()\n", "bar" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3D" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pyecharts import Bar3D\n", "\n", "bar3d = Bar3D(\"3D Graph\", width=1200, height=600)\n", "x_axis = [\n", " \"12a\", \"1a\", \"2a\", \"3a\", \"4a\", \"5a\", \"6a\", \"7a\", \"8a\", \"9a\", \"10a\", \"11a\",\n", " \"12p\", \"1p\", \"2p\", \"3p\", \"4p\", \"5p\", \"6p\", \"7p\", \"8p\", \"9p\", \"10p\", \"11p\"\n", " ]\n", "y_axis = [\n", " \"Saturday\", \"Friday\", \"Thursday\", \"Wednesday\", \"Tuesday\", \"Monday\", \"Sunday\"\n", " ]\n", "data = [\n", " [0, 0, 5], [0, 1, 1], [0, 2, 0], [0, 3, 0], [0, 4, 0], [0, 5, 0],\n", " [0, 6, 0], [0, 7, 0], [0, 8, 0], [0, 9, 0], [0, 10, 0], [0, 11, 2],\n", " [0, 12, 4], [0, 13, 1], [0, 14, 1], [0, 15, 3], [0, 16, 4], [0, 17, 6],\n", " [0, 18, 4], [0, 19, 4], [0, 20, 3], [0, 21, 3], [0, 22, 2], [0, 23, 5],\n", " [1, 0, 7], [1, 1, 0], [1, 2, 0], [1, 3, 0], [1, 4, 0], [1, 5, 0],\n", " [1, 6, 0], [1, 7, 0], [1, 8, 0], [1, 9, 0], [1, 10, 5], [1, 11, 2],\n", " [1, 12, 2], [1, 13, 6], [1, 14, 9], [1, 15, 11], [1, 16, 6], [1, 17, 7],\n", " [1, 18, 8], [1, 19, 12], [1, 20, 5], [1, 21, 5], [1, 22, 7], [1, 23, 2],\n", " [2, 0, 1], [2, 1, 1], [2, 2, 0], [2, 3, 0], [2, 4, 0], [2, 5, 0],\n", " [2, 6, 0], [2, 7, 0], [2, 8, 0], [2, 9, 0], [2, 10, 3], [2, 11, 2],\n", " [2, 12, 1], [2, 13, 9], [2, 14, 8], [2, 15, 10], [2, 16, 6], [2, 17, 5],\n", " [2, 18, 5], [2, 19, 5], [2, 20, 7], [2, 21, 4], [2, 22, 2], [2, 23, 4],\n", " [3, 0, 7], [3, 1, 3], [3, 2, 0], [3, 3, 0], [3, 4, 0], [3, 5, 0],\n", " [3, 6, 0], [3, 7, 0], [3, 8, 1], [3, 9, 0], [3, 10, 5], [3, 11, 4],\n", " [3, 12, 7], [3, 13, 14], [3, 14, 13], [3, 15, 12], [3, 16, 9], [3, 17, 5],\n", " [3, 18, 5], [3, 19, 10], [3, 20, 6], [3, 21, 4], [3, 22, 4], [3, 23, 1],\n", " [4, 0, 1], [4, 1, 3], [4, 2, 0], [4, 3, 0], [4, 4, 0], [4, 5, 1],\n", " [4, 6, 0], [4, 7, 0], [4, 8, 0], [4, 9, 2], [4, 10, 4], [4, 11, 4],\n", " [4, 12, 2], [4, 13, 4], [4, 14, 4], [4, 15, 14], [4, 16, 12], [4, 17, 1],\n", " [4, 18, 8], [4, 19, 5], [4, 20, 3], [4, 21, 7], [4, 22, 3], [4, 23, 0],\n", " [5, 0, 2], [5, 1, 1], [5, 2, 0], [5, 3, 3], [5, 4, 0], [5, 5, 0],\n", " [5, 6, 0], [5, 7, 0], [5, 8, 2], [5, 9, 0], [5, 10, 4], [5, 11, 1],\n", " [5, 12, 5], [5, 13, 10], [5, 14, 5], [5, 15, 7], [5, 16, 11], [5, 17, 6],\n", " [5, 18, 0], [5, 19, 5], [5, 20, 3], [5, 21, 4], [5, 22, 2], [5, 23, 0],\n", " [6, 0, 1], [6, 1, 0], [6, 2, 0], [6, 3, 0], [6, 4, 0], [6, 5, 0],\n", " [6, 6, 0], [6, 7, 0], [6, 8, 0], [6, 9, 0], [6, 10, 1], [6, 11, 0],\n", " [6, 12, 2], [6, 13, 1], [6, 14, 3], [6, 15, 4], [6, 16, 0], [6, 17, 0],\n", " [6, 18, 0], [6, 19, 0], [6, 20, 1], [6, 21, 2], [6, 22, 2], [6, 23, 6]\n", " ]\n", "range_color = ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf',\n", " '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']\n", "bar3d.add(\n", " \"\",\n", " x_axis,\n", " y_axis,\n", " [[d[1], d[0], d[2]] for d in data],\n", " is_visualmap=True,\n", " visual_range=[0, 20],\n", " visual_range_color=range_color,\n", " grid3d_width=200,\n", " grid3d_depth=80,\n", ")\n", "bar3d.width=700\n", "bar3d.height=500\n", "\n", "bar3d" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Boxplot" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pyecharts import Boxplot\n", "\n", "boxplot = Boxplot(\"Box plot\")\n", "x_axis = ['expr1', 'expr2', 'expr3', 'expr4', 'expr5']\n", "y_axis = [\n", " [850, 740, 900, 1070, 930, 850, 950, 980, 980, 880,\n", " 1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960],\n", " [960, 940, 960, 940, 880, 800, 850, 880, 900, 840,\n", " 830, 790, 810, 880, 880, 830, 800, 790, 760, 800],\n", " [880, 880, 880, 860, 720, 720, 620, 860, 970, 950,\n", " 880, 910, 850, 870, 840, 840, 850, 840, 840, 840],\n", " [890, 810, 810, 820, 800, 770, 760, 740, 750, 760,\n", " 910, 920, 890, 860, 880, 720, 840, 850, 850, 780],\n", " [890, 840, 780, 810, 760, 810, 790, 810, 820, 850,\n", " 870, 870, 810, 740, 810, 940, 950, 800, 810, 870]\n", "]\n", "_yaxis = boxplot.prepare_data(y_axis) \n", "boxplot.add(\"boxplot\", x_axis, _yaxis)\n", "boxplot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 퍼널" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pyecharts import Funnel\n", "\n", "attr = [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\"]\n", "value = [20, 40, 60, 80, 100, 120]\n", "funnel = Funnel(\"퍼널 그래프\")\n", "funnel.add(\n", " \"퍼널\",\n", " attr,\n", " value,\n", " is_label_show=True,\n", " label_pos=\"inside\",\n", " label_text_color=\"#fff\",\n", ")\n", "funnel.width=700\n", "funnel.height=500\n", "funnel" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Gauge" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pyecharts import Gauge\n", "\n", "gauge = Gauge(\"Gauge Graph\")\n", "gauge.add(\"이용률\", \"가운데\", 66.66)\n", "gauge" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.6.5" }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }