{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4.1 柱状图/条形图"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Faker 数据构造器\n",
    "https://github.com/pyecharts/pyecharts/blob/master/pyecharts/faker.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pyecharts.faker import Faker"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Faker.values()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Faker.clothes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 基本柱状图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 引入相关包\n",
    "from pyecharts import options as opts\n",
    "from pyecharts.charts import Bar"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 普通调用\n",
    "bar1 = Bar()\n",
    "bar1.add_xaxis(Faker.choose())\n",
    "bar1.add_yaxis('组A', Faker.values())\n",
    "bar1.add_yaxis('组B', Faker.values())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "bar1.render_notebook()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 链式调用\n",
    "bar2 = (\n",
    "    Bar()\n",
    "    .add_xaxis(Faker.choose())\n",
    "    .add_yaxis('组A', Faker.values())\n",
    "    .add_yaxis('组B', Faker.values())\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "bar2.render_notebook()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "bar2.render(path='basic_bar.html')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 条形图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 翻转XY轴\n",
    "bar3 = (\n",
    "    Bar()\n",
    "    .add_xaxis(Faker.choose())\n",
    "    .add_yaxis('组A', Faker.values())\n",
    "    .add_yaxis('组B', Faker.values())\n",
    "    .set_series_opts(label_opts=opts.LabelOpts(position='right'))\n",
    "    .reversal_axis()    \n",
    ")\n",
    "\n",
    "bar3.render_notebook()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4.2 其他对比图表"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 堆叠柱状图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 全部堆叠\n",
    "stacked_bar1 = (\n",
    "    Bar()\n",
    "    .add_xaxis(Faker.choose())\n",
    "    .add_yaxis('组A', Faker.values(), stack='stack1')\n",
    "    .add_yaxis('组B', Faker.values(), stack='stack1')\n",
    "    .add_yaxis('组C', Faker.values(), stack='stack1')\n",
    "    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))\n",
    ")\n",
    "\n",
    "stacked_bar1.render_notebook()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 部分堆叠\n",
    "stacked_bar2 = (\n",
    "    Bar()\n",
    "    .add_xaxis(Faker.choose())\n",
    "    .add_yaxis('组A', Faker.values(), stack='stack1')\n",
    "    .add_yaxis('组B', Faker.values(), stack='stack2')\n",
    "    .add_yaxis('组C', Faker.values(), stack='stack2')\n",
    "    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))\n",
    ")\n",
    "\n",
    "stacked_bar2.render_notebook()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 漏斗图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 准备数据\n",
    "x_data = [\"点击\", \"访问\", \"咨询\", \"订单\", \"展现\"]\n",
    "y_data = [90, 50, 30, 10, 100]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for z in zip(x_data, y_data):\n",
    "    print(list(z))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "[list(z) for z in zip(x_data, y_data)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pyecharts.charts import Funnel\n",
    "\n",
    "(\n",
    "    Funnel()\n",
    "    .add(\n",
    "        series_name=\"\",\n",
    "        data_pair=[list(z) for z in zip(x_data, y_data)],\n",
    "    )\n",
    "    .set_global_opts(title_opts=opts.TitleOpts(title=\"漏斗图\"))\n",
    ").render_notebook()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4.3 常用配置项"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 标题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 参数传递方式\n",
    "(\n",
    "    Bar()\n",
    "    .add_xaxis(Faker.choose())\n",
    "    .add_yaxis('组A', Faker.values())\n",
    "    .add_yaxis('组B', Faker.values())\n",
    "    .set_global_opts(\n",
    "        title_opts=opts.TitleOpts(title='主标题', subtitle='副标题')\n",
    "    )\n",
    ").render_notebook()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 字典方式\n",
    "(\n",
    "    Bar()\n",
    "    .add_xaxis(Faker.choose())\n",
    "    .add_yaxis('组A', Faker.values())\n",
    "    .add_yaxis('组B', Faker.values())\n",
    "    .set_global_opts(\n",
    "        title_opts={'text': '主标题', 'subtext': '副标题'}\n",
    "    )\n",
    ").render_notebook()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 常用的全局配置项"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 动画配置项"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "(\n",
    "    Bar(\n",
    "        init_opts=opts.InitOpts(\n",
    "            animation_opts=opts.AnimationOpts(\n",
    "                animation_delay=2000, animation_easing='elasticOut'\n",
    "            )\n",
    "        )\n",
    "    )\n",
    "    .add_xaxis(Faker.choose())\n",
    "    .add_yaxis('组A', Faker.values())\n",
    "    .add_yaxis('组B', Faker.values())\n",
    "    .set_global_opts(\n",
    "        title_opts=opts.TitleOpts(title='主标题', subtitle='副标题')\n",
    "    )\n",
    ").render_notebook()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 区域缩放配置项"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "(\n",
    "    Bar(\n",
    "        init_opts=opts.InitOpts(\n",
    "            animation_opts=opts.AnimationOpts(\n",
    "                animation_delay=1000, animation_easing='elasticOut'\n",
    "            )\n",
    "        )\n",
    "    )\n",
    "    .add_xaxis(Faker.choose())\n",
    "    .add_yaxis('组A', Faker.values())\n",
    "    .add_yaxis('组B', Faker.values())\n",
    "    .set_global_opts(\n",
    "        title_opts=opts.TitleOpts(title='主标题', subtitle='副标题'),\n",
    "#         datazoom_opts=opts.DataZoomOpts(),  # 默认为slide\n",
    "#         datazoom_opts=opts.DataZoomOpts(type_='inside'), # 使用inside\n",
    "#         datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_='inside')] # 同时使用slide和inside\n",
    "        datazoom_opts=opts.DataZoomOpts(orient='vertical'),  # 纵向datazoom\n",
    "    )\n",
    ").render_notebook()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 坐标轴配置项"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "(\n",
    "    Bar(\n",
    "        init_opts=opts.InitOpts(\n",
    "            animation_opts=opts.AnimationOpts(\n",
    "                animation_delay=1000, animation_easing='elasticOut'\n",
    "            )\n",
    "        )\n",
    "    )\n",
    "    .add_xaxis(Faker.choose())\n",
    "    .add_yaxis('组A', Faker.values())\n",
    "    .add_yaxis('组B', Faker.values())\n",
    "    .set_global_opts(\n",
    "        title_opts=opts.TitleOpts(title='主标题', subtitle='副标题'),\n",
    "        xaxis_opts=opts.AxisOpts(name='X轴'),\n",
    "        yaxis_opts=opts.AxisOpts(name='Y轴'),\n",
    "    )\n",
    ").render_notebook()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 工具箱配置项"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "(\n",
    "    Bar(\n",
    "        init_opts=opts.InitOpts(\n",
    "            animation_opts=opts.AnimationOpts(\n",
    "                animation_delay=1000, animation_easing='elasticOut'\n",
    "            )\n",
    "        )\n",
    "    )\n",
    "    .add_xaxis(Faker.choose())\n",
    "    .add_yaxis('组A', Faker.values())\n",
    "    .add_yaxis('组B', Faker.values())\n",
    "    .set_global_opts(\n",
    "        title_opts=opts.TitleOpts(title='主标题', subtitle='副标题'),\n",
    "        xaxis_opts=opts.AxisOpts(name='X轴'),\n",
    "        yaxis_opts=opts.AxisOpts(name='Y轴'),\n",
    "        toolbox_opts=opts.ToolboxOpts(),\n",
    "    )\n",
    ").render_notebook()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 常用的系列配置项"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 标签配置项"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "(\n",
    "    Bar()\n",
    "    .add_xaxis(Faker.choose())\n",
    "    .add_yaxis('组A', Faker.values())\n",
    "    .add_yaxis('组B', Faker.values())\n",
    "    .set_global_opts(\n",
    "        title_opts=opts.TitleOpts(title='主标题', subtitle='副标题'),\n",
    "        xaxis_opts=opts.AxisOpts(\n",
    "            name='X轴',\n",
    "            axislabel_opts=opts.LabelOpts(rotate=-90)\n",
    "        ),\n",
    "        yaxis_opts=opts.AxisOpts(\n",
    "            name='Y轴',\n",
    "            axislabel_opts=opts.LabelOpts(formatter='{value}个')\n",
    "        ),\n",
    "    )\n",
    "    .set_series_opts(\n",
    "        label_opts=opts.LabelOpts(\n",
    "#             is_show=False,\n",
    "            font_size=20,\n",
    "        )\n",
    "    )\n",
    ").render_notebook()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 标记线配置项"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "(\n",
    "    Bar()\n",
    "    .add_xaxis(Faker.choose())\n",
    "    .add_yaxis('组A', Faker.values())\n",
    "    .add_yaxis('组B', Faker.values())\n",
    "    .set_global_opts(\n",
    "        title_opts=opts.TitleOpts(title='主标题', subtitle='副标题'),\n",
    "    )\n",
    "    .set_series_opts(\n",
    "        label_opts=opts.LabelOpts(is_show=False),\n",
    "        markline_opts=opts.MarkLineOpts(\n",
    "            data=[\n",
    "#                 opts.MarkLineItem(type_='min', name='最小值'),\n",
    "#                 opts.MarkLineItem(type_='max', name='最大值'),\n",
    "                opts.MarkLineItem(type_='average', name='平均值'),\n",
    "                opts.MarkLineItem(y=50, name='自定义标记线'),\n",
    "            ]\n",
    "        )\n",
    "    )\n",
    ").render_notebook()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 标记点配置项"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "(\n",
    "    Bar()\n",
    "    .add_xaxis(Faker.choose())\n",
    "    .add_yaxis('组A', Faker.values())\n",
    "    .add_yaxis('组B', Faker.values())\n",
    "    .set_global_opts(\n",
    "        title_opts=opts.TitleOpts(title='主标题', subtitle='副标题'),\n",
    "    )\n",
    "    .set_series_opts(\n",
    "        label_opts=opts.LabelOpts(is_show=False),\n",
    "        markpoint_opts=opts.MarkPointOpts(\n",
    "            data=[\n",
    "                opts.MarkPointItem(type_='min', name='最小值'),\n",
    "                opts.MarkPointItem(type_='max', name='最大值'),\n",
    "                opts.MarkPointItem(type_='average', name='平均值'),\n",
    "            ]\n",
    "        )\n",
    "    )\n",
    ").render_notebook()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "data_anal_env",
   "language": "python",
   "name": "data_anal_env"
  },
  "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.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
