温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Django怎么动态展示Pyecharts图表数据

发布时间:2021-08-22 19:26:51 来源:亿速云 阅读:147 作者:chen 栏目:开发技术

本篇内容主要讲解“Django怎么动态展示Pyecharts图表数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Django怎么动态展示Pyecharts图表数据”吧!

目录
  • Django 模板渲染

    • 1. 新建一个 Django 项目

    • 2. 新建项目 urls 文件

    • 3. 编写 Django 和 pyecharts 代码渲染图表

  • 定时全量更新图表

    • 定时增量更新图表

      本文将介绍如何在 web 框架 Django 中使用可视化工具 Pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法!

      Django 模板渲染

      1. 新建一个 Django 项目

      命令行中输入以下命令

      django-admin startproject pyecharts_django_demo

      创建一个应用程序

      python manage.py startapp demo

      创建完之后,在 Pycharm 中打开该项目,当然你也可以直接在 Pycharm 中创建

      Django怎么动态展示Pyecharts图表数据

      同时在pyecharts_django_demo/settings.py中注册应用程序INSTALLED_APPS中添加应用程序demo

      pyecharts_django_demo/urls.py中新增demo.urls

      Django怎么动态展示Pyecharts图表数据

      2. 新建项目 urls 文件

      编辑demo/urls.py文件,没有就新建一个

      from django.conf.urls import url
      from . import views
       
      urlpatterns = [
          url(r'^pie/$', views.ChartView.as_view(), name='demo'),
          url(r'^index/$', views.IndexView.as_view(), name='demo'),
      ]

      3. 编写 Django 和 pyecharts 代码渲染图表

      由于 json 数据类型的问题,无法将 pyecharts 中的 JSCode 类型的数据转换成 json 数据格式返回到前端页面中使用。

      因此在使用前后端分离的情况下尽量避免使用 JSCode 进行画图。

      将下列代码保存到demo/views.py

      from django.shortcuts import render
       
      # Create your views here.
       
      import json
      from random import randrange
       
      from django.http import HttpResponse
      from rest_framework.views import APIView
       
      from pyecharts.charts import Bar, Pie
      from pyecharts.faker import Faker
      from pyecharts import options as opts
       
       
      # Create your views here.
      def response_as_json(data):
          json_str = json.dumps(data)
          response = HttpResponse(
              json_str,
              content_type="application/json",
          )
          response["Access-Control-Allow-Origin"] = "*"
          return response
       
       
      def json_response(data, code=200):
          data = {
              "code": code,
              "msg": "success",
              "data": data,
          }
          return response_as_json(data)
       
       
      def json_error(error_string="error", code=500, **kwargs):
          data = {
              "code": code,
              "msg": error_string,
              "data": {}
          }
          data.update(kwargs)
          return response_as_json(data)
       
       
      JsonResponse = json_response
      JsonError = json_error
       
       
      def pie_base() -> Pie:
          c = (
              Pie()
                  .add("", [list(z) for z in zip(Faker.choose(), Faker.values())])
                  .set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])
                  .set_global_opts(title_opts=opts.TitleOpts(title="Pie-示例"))
                  .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
                  .dump_options_with_quotes()
          )
          return c
       
      class ChartView(APIView):
          def get(self, request, *args, **kwargs):
              return JsonResponse(json.loads(pie_base()))
       
      class IndexView(APIView):
          def get(self, request, *args, **kwargs):
              return HttpResponse(content=open("./templates/index.html").read())

      在根目录下新建一个templates的文件夹,并在该文件夹下新建一个index.html文件

      Django怎么动态展示Pyecharts图表数据

      index.html

      代码如下:

      <!DOCTYPE html>
      <html>
      <head>
          <meta charset="UTF-8">
          <title>Awesome-pyecharts</title>
          <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
          <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
       
      </head>
      <body>
      <div id="pie" ></div>
      <script>
          var chart = echarts.init(document.getElementById('pie'), 'white', {renderer: 'canvas'});
       
          $(
              function () {
                  fetchData(chart);
              }
          );
       
          function fetchData() {
              $.ajax({
                  type: "GET",
                  url: "http://127.0.0.1:8000/demo/pie",
                  dataType: 'json',
                  success: function (result) {
                      chart.setOption(result.data);
                  }
              });
          }
      </script>
      </body>
      </html>

      运行之后,在浏览器中打开,效果如下:

      Django怎么动态展示Pyecharts图表数据

      定时全量更新图表

      前面讲的是一个静态数据的展示的方法,用 Pyecharts 和 Django 结合最主要是实现一种动态更新数据,增量更新数据等功能!

      定时全量更新主要是前端主动向后端进行数据刷新,定时刷新的核心在于 HTML 的 setInterval 方法。

      那么index.html代码就是下面这样的:

      <!DOCTYPE html>
      <html>
      <head>
          <meta charset="UTF-8">
          <title>Awesome-pyecharts</title>
          <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
          <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
       
      </head>
      <body>
          <div id="bar" ></div>
          <script>
              var chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});
       
              $(
                  function () {
                      fetchData(chart);
                      setInterval(fetchData, 100);
                  }
              );
       
              function fetchData() {
                  $.ajax({
                      type: "GET",
                      url: "http://127.0.0.1:8000/demo/bar",
                      dataType: 'json',
                      success: function (result) {
                          chart.setOption(result.data);
                      }
                  });
              }
          </script>
      </body>
      </html>

      同时在demo/views.py中,增加并修改代码:

      Django怎么动态展示Pyecharts图表数据

      views.py

      demo/urls.py中,增加如下代码:

      运行之后,效果如下:

      Django怎么动态展示Pyecharts图表数据

      贴一张以前做的图(因为我懒),效果和上面一样

      定时增量更新图表

      原理一样,先修改 index.html ,代码如下:

      <!DOCTYPE html>
      <html>
      <head>
          <meta charset="UTF-8">
          <title>Awesome-pyecharts</title>
          <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
          <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
       
      </head>
      <body>
          <div id="bar" ></div>
          <script>
              var chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});
              var old_data = [];
              $(
                  function () {
                      fetchData(chart);
                      setInterval(fetchData, 2000);
                  }
              );
       
              function fetchData() {
                  $.ajax({
                      type: "GET",
                      url: "http://127.0.0.1:8000/demo/line",
                      dataType: "json",
                      success: function (result) {
                          var options = result.data;
                          chart.setOption(options);
                          old_data = chart.getOption().series[0].data;
                      }
                  });
              }
       
              function getDynamicData() {
                  $.ajax({
                      type: "GET",
                      url: "http://127.0.0.1:8000/demo/lineUpdate",
                      dataType: 'json',
                      success: function (result) {
                          var options = result.data;
                          old_data.push([options.name, options.value]);
                          chart.setOption({
                              series: [{
                                  data: old_data
                              }]
                          });
                      }
                  });
              }
       
          </script>
      </body>
      </html>

      细心的你应该可以发现,里面新增了两个请求地址demo/line,demo/lineUpdate

      so,在urlpatterns中增加以下路径的匹配

      url(r'^line/$', views.ChartView.as_view(), name='demo'),
      url(r'^lineUpdate/$', views.ChartView.as_view(), name='demo'),

      最后在views.py中增加以下代码:

      def line_base() -> Line:
          line = (
              Line()
                  .add_xaxis(["{}".format(i) for i in range(10)])
                  .add_yaxis(
                  series_name="",
                  y_axis=[randrange(50, 80) for _ in range(10)],
                  is_smooth=True,
                  label_opts=opts.LabelOpts(is_show=False),
              )
                  .set_global_opts(
                  title_opts=opts.TitleOpts(title="动态数据"),
                  xaxis_opts=opts.AxisOpts(type_="value"),
                  yaxis_opts=opts.AxisOpts(type_="value"),
              )
                  .dump_options_with_quotes()
          )
          return line
       
      class ChartView(APIView):
          def get(self, request, *args, **kwargs):
              return JsonResponse(json.loads(line_base())
      cnt = 9
       
      class ChartUpdateView(APIView):
          def get(self, request, *args, **kwargs):
              global cnt
              cnt = cnt + 1
              return JsonResponse({"name": cnt, "value": randrange(0, 100)})

      运行并打开,效果如下:

      Django怎么动态展示Pyecharts图表数据

      到此,相信大家对“Django怎么动态展示Pyecharts图表数据”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

      向AI问一下细节

      免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

      AI