django Echarts画柱状推移图

1. 首先确定要画什么样的图,在Echarts官网找好案例

2.根据图确认需要准备的数据,从后台准备数据传递给模板

3.模板渲染,使用Echarts组件功能完成自己想要的内容

中间遇到几个坑:

1. by月份统计客户来访次数,数据库中存入的是Date格式,如何转换月份? XXX.strftime("%Y") 这样就可以以单独获取年月日

2.如何从数据库中By月份拿数据? 参考下面这一句,先mapping年,再来是月,再来是你想要做的事

models.VisitCusInfo.objects.filter(auditDate__year=row[0:4],auditDate__month=row[5:7],visitCompany__companyName=com).values("visitCompany__companyName").count()

3.后台写好数据传入前台js时报错,是因为模板渲染了,需要加入 {{ |safe }}

OK,先看结果:

后台代码,里面有很详细的注释:

from django.shortcuts import render,HttpResponse
from app1 import models
from datetime import datetime,date,timedelta

def columnsChart(request):
    #统计所有来访公司来访次数的by month推移图(柱状堆叠图)
    #要画图第一步,获取行名和列名
    #列名: 获取visitCus中 所有来访公司的名字
    #行名: 获取所有数据库中的月份
    #数据:获取所有来访公司在数据库表中的count

    #首先获取列名:所有公司名称
    companys = models.VisitCusInfo.objects.values("visitCompany__companyName").distinct()
    cols=[]
    for company in companys:
        if company["visitCompany__companyName"] not in cols:
            cols.append(company["visitCompany__companyName"])
    print(cols)
    #再来获取行名及数据
    dates = models.VisitCusInfo.objects.values("auditDate") #by客户稽核时间
    #对获取到的时间格式整理成by month,只获取月份
    rows = []
    for row in dates:
        month = row['auditDate'].strftime("%Y-%m")
        if month not in rows:
            rows.append(month)
    rows.sort()
    print(rows)
    #by月份 by公司获取每个公司访问次数
    #Echarts官网source参考: 获取legend
    # legend: {
    #     data:['直接访问','邮件营销','联盟广告','视频广告','搜索引擎','百度','谷歌','必应','其他']
    # },
    legend_data=cols
    #获取x轴数据,Echarts官网示例
    # xAxis : [
    #     {
    #         type : 'category',
    #         data : ['周一','周二','周三','周四','周五','周六','周日']
    #     }
    x_data = rows
    #获取数据内容,Echarts官网示例:
    # series : [
    #     {
    #         name:'直接访问',
    #         type:'bar',
    #         stack: '广告',
    #         data:[320, 332, 301, 334, 390, 330, 320]
    #     },
    #     {
    #         name:'邮件营销',
    #         type:'bar',
    #         stack: '广告',
    #         data:[120, 132, 101, 134, 90, 230, 210]
    #     },
    series=[]
    #rows存的是日期,cols存的是公司名

    for com in cols:

        serie = {"name":com,"type":"bar","stack":"访问次数","data":None}
        series_data = []
        for row in rows:
            cnt = models.VisitCusInfo.objects.filter(auditDate__year=row[0:4],auditDate__month=row[5:7],visitCompany__companyName=com).values("visitCompany__companyName").count()
            series_data.append(cnt)
        serie["data"]=series_data
        series.append(serie)
    #柱子宽度可以在这里设置,注意必须加在最后一个 'bar' 系列上才会生效,并且是对此坐标系中所有 'bar' 系列生效。
    series[-1]['barWidth']="40%"
    print(series)

    return render(request,"charts/visitChart.html",{"series":series,"x_data":x_data,"legend_data":legend_data})

 

再上前台代码:

{#<!DOCTYPE html>#}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>visitCharts</title>
    <script src="/static/js/echarts.js"></script>
    <style>
        #chart1{
            width: 1000px;
            height: 400px;
        }

    </style>
</head>
<body>
    <div id="chart1"></div>
</body>
<script>
    // 基于准备好的dom,初始化echarts实例
    var myChart = echarts.init(document.getElementById('chart1'));
    //app.title = '堆叠柱状图';

    option = {
        tooltip : {
            trigger: 'axis',
            axisPointer : {            // 坐标轴指示器,坐标轴触发有效
                type : 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
            }
        },
        legend: {
            //data:['直接访问','邮件营销','联盟广告','视频广告','搜索引擎','百度','谷歌','必应','其他']
            data:{{ legend_data|safe }}
        },
        grid: {
            left: '3%',
            right: '4%',
            bottom: '3%',
            containLabel: true
        },
        xAxis : [
            {
                type : 'category',
                data:{{ x_data|safe }}
                //data : ['周一','周二','周三','周四','周五','周六','周日']
            }
        ],
        yAxis : [
            {
                type : 'value',
                max: 5
            }
        ],
        series:{{ series|safe }},
        dataZoom: [
            {   // 这个dataZoom组件,默认控制x轴。
                type: 'slider', // 这个 dataZoom 组件是 slider 型 dataZoom 组件
                start: 20,      // 左边在 10% 的位置。
                end: 100         // 右边在 60% 的位置。
            },
               {   // 这个dataZoom组件,默认控制x轴。
                type: 'inside', // 这个 dataZoom 组件是 inside 型 dataZoom 组件
                start: 20,      // 左边在 10% 的位置。
                end: 100         // 右边在 60% 的位置。
            }
        ],
    };

    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option);
</script>
</html>

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Django 中使用 ECharts,需要先在前端页面引入 ECharts 的 JavaScript 库。可以在 HTML 页面中使用 script 标签引入 ECharts 的 JavaScript 库,或者使用模块化的方式引入库。 在 Django 中读取 MySQL 数据库中的数据,可以使用 Django 提供的 ORM 框架进行操作。下面是一个简单的示例代码,演示如何在 Django 中读取 MySQL 数据库中的数据并将其作为 ECharts 的柱展示出来: 1. 安装必要的依赖库 首先需要安装 pymysql 库,它是 Python 中一个用于连接 MySQL 数据库的库。可以使用以下命令安装: ``` pip install pymysql ``` 2. 在 Django 项目中配置数据库 在 Django 项目的 settings.py 文件中配置 MySQL 数据库的连接信息: ``` DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '数据库名', 'USER': '用户名', 'PASSWORD': '密码', 'HOST': '数据库地址', 'PORT': '端口号', } } ``` 3. 在 Django 中读取 MySQL 数据库中的数据 在 Django 中使用 ORM 框架查询 MySQL 数据库中的数据,可以在视函数中进行操作。示例代码如下: ``` from django.shortcuts import render from django.db import connection def echarts_demo(request): with connection.cursor() as cursor: cursor.execute("SELECT name, sales FROM sales_data") rows = cursor.fetchall() data = [] for row in rows: data.append({'name': row[0], 'sales': row[1]}) return render(request, 'echarts_demo.html', {'data': data}) ``` 在这个示例中,假设 MySQL 数据库中有一个名为 sales_data 的表,其中包含了两个字段:name 和 sales。通过使用 Django ORM 框架,可以执行 SQL 查询语句并获取查询结果。然后将查询结果转化为一个列表,每个元素是一个字典,包含了 name 和 sales 两个键值对。最后将这个列表传递给 HTML 模板。 4. 在 HTML 页面中使用 ECharts 展示柱 在 HTML 模板中,可以使用 ECharts 的 JavaScript 库展示柱。示例代码如下: ``` <html> <head> <title>ECharts Demo</title> <script src="https://cdn.jsdelivr.net/npm/echarts@4.9.0/dist/echarts.min.js"></script> </head> <body> <div id="chart" style="width: 600px;height:400px;"></div> <script> var data = {{ data|safe }}; var chart = echarts.init(document.getElementById('chart')); chart.setOption({ xAxis: { type: 'category', data: data.map(item => item.name), }, yAxis: { type: 'value', }, series: [{ data: data.map(item => item.sales), type: 'bar', }] }); </script> </body> </html> ``` 在这个示例中,首先引入了 ECharts 的 JavaScript 库。然后在 div 标签中创建了一个容器,用于展示柱。接下来使用 JavaScript 代码从 Django 传递过来的数据中提取出 name 和 sales 的数组,并将它们作为 xAxis 和 series 的数据。最后使用 ECharts 的 setOption 方法将数据渲染成柱。 以上就是在 Django 中将 MySQL 数据库中的数据引入 ECharts 作出柱的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值