利用 Django 動態展示 Pyecharts 圖表資料的幾種方法
本文將介紹如何在 web 框架 Django 中使用視覺化工具 Pyecharts, 看完本教程你將掌握幾種動態展示視覺化資料的方法!
Django 模板渲染
1. 新建一個 Django 專案
命令列中輸入以下命令
django-admin startproject pyecharts_django_demo
建立一個應用程式
python manage.py startapp demo
很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!
QQ群:1156465813
建立完之後,在 Pycharm 中開啟該專案,當然你也可以直接在 Pycharm 中建立
同時在 pyecharts_django_demo/settings.py
中註冊應用程式INSTALLED_APPS
中新增應用程式 demo
在 pyecharts_django_demo/urls.py
中新增 demo.urls
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())
4. 編寫畫圖的 HTML 程式碼
在根目錄下新建一個 templates
的資料夾,並在該資料夾下新建一個 index.html
檔案
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" style="width:1000px; height:600px;"></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>
執行之後,在瀏覽器中開啟,效果如下:
定時全量更新圖表
前面講的是一個靜態資料的展示的方法,用 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" style="width:1600px; height:800px;"></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
中,增加並修改程式碼:
views.py
demo/urls.py
中,增加如下程式碼:
urlpatterns = [
url(r'^pie/$', views.ChartView.as_view(), name='demo'),
url(r'^bar/$', views.ChartView.as_view(), name='demo'),
url(r'^index/$', views.IndexView.as_view(), name='demo'),
]
執行之後,效果如下:
貼一張以前做的圖(因為我懶),效果和上面一樣
定時增量更新圖表
原理一樣,先修改 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" style="width:1600px; height:800px;"></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)})
執行並開啟,效果如下:
需要完整原始碼的可以加入我的Python學習圈子領取。
在這裡還是要推薦下我自己建的Python開發學習群:1156465813,群裡都是學Python開發的,如果你正在學習Python ,歡迎你加入,大家都是軟體開發黨,不定期分享乾貨(只有Python軟體開發相關的),包括我自己整理的一份2020最新的Python進階資料和高階開發教程,歡迎進階中和進想深入Python的小夥伴!
相關文章
- 互動方式,Smartbi儀表盤還支援動態的資料展示
- 盤點 Django 展示視覺化圖表的多種方式(建議收藏)Django視覺化
- mysql資料庫連表查詢的幾種方法MySql資料庫
- jQuery動態生成html元素的幾種方法jQueryHTML
- Swift 幾種動態判斷類的方法Swift
- flask+pyecharts繪製的圖表增加互動FlaskEcharts
- 大資料分析的幾種方法大資料
- ubuntu下圖形程式自啟動的幾種方法Ubuntu
- 圖表外掛Highcharts的動態化賦值,實現圖表資料的動態化設定顯示賦值
- sqlplus連線資料庫的幾種方法SQL資料庫
- tomcat日誌集中採集、分析與展示的幾種方法Tomcat
- python刪掉資料表幾列的方法Python
- 使用 JS 來動態操作 css ,你知道幾種方法?JSCSS
- Django結合Echarts在前端展示資料DjangoEcharts前端
- Django 構建模板form表單的兩種方法DjangoORM
- 幾種集合的幾種方法
- 瀏覽器儲存資料的幾種方法瀏覽器
- JS資料型別判斷的幾種方法JS資料型別
- C++ 與 QML 之間進行資料互動的幾種方法C++
- PS 摳圖幾種典型方法
- C語言動態庫libxxx.so的幾種使用方法C語言
- 幾種有效的清除浮動的方法
- 利用FreeSql.Generator自動根據資料庫表動態生成實體類SQL資料庫
- 判斷js中的資料型別的幾種方法JS資料型別
- 利用Python爬取新冠肺炎疫情實時資料,Pyecharts畫2019-nCoV疫情地圖PythonEcharts地圖
- 兩種動態建立表格的方法
- 如何讓資料動起來?Python動態圖表製作一覽。Python
- SAP ABAP 系統進行資料庫表查詢的幾種常用方法的試讀版資料庫
- 加快Spring Boot啟動的幾種方法 | baeldungSpring Boot
- 利用CSS改變圖片顏色的100種方法!CSS
- 利用CSS改變圖片顏色的多種方法!CSS
- Mysql多欄位大表的幾種優化方法MySql優化
- Laravel 表單驗證器的幾種使用方法Laravel
- MySQL資料庫定時備份的幾種實現方法MySql資料庫
- pyecharts生成圖片Echarts
- (十七)關於動態代理,你能說出動態代理的幾種方式?
- ArcEngine 開啟AutoCAD檔案的幾種方法與讀取CAD資料的方法
- hive 動態分割槽插入資料表Hive