• 【11】网站搭建:阅读量曲线图


    一、前言

      为了让自己能直观的看出博客阅读量的变化,而不需要到后台观察,所以就使用了Highcharts的基础折线图来帮助实现。其文档地址:Highcharts 演示

      样例效果:
    2018-08-24 08-31-33屏幕截图.png 

      通过阅读API文档,可以实现自己想要的样式,也可以改变线条的颜色。一系列的配置主要有chart: {图表配置},colors: [颜色集合],credits: {版权信息},data: {数据功能模块},drilldown: {钻取},exporting: {导出},labels: {标签},legend: {图例},loading: {加载},navigation: {导航},noData: {没有数据},plotOptions: {数据列配置},responsive: {响应式},series: [{数据列}],subtitle: {副标题},title: {标题},tooltip: {数据提示框},xAxis: [{X 轴}],yAxis: [{Y 轴}],zAxis: {Z 轴}。

      不过这样调试起来比较麻烦,因为每修改一个地方就要去观察图表是否有所改变,不然到时候什么地方出了问题却不知道是哪一步骤错误导致的。幸好Highcharts提供了可视化编辑功能,支持在线调试,最后把所需要的js代码贴到项目中即可,可视化编辑:基础折线图-可视化

    二、Highcharts基本使用

      该图表显示基本是靠js来实现的,HTML结构里只需要定义一个div,id值为container,这个container要与js里的容器名一样。

    <div id="container" style="max-800px;height:400px"></div>

      js代码如下:

    var chart = Highcharts.chart('container', {
        title: {
            text: '2010 ~ 2016 年太阳能行业就业人员发展情况'
        },
        subtitle: {
            text: '数据来源:thesolarfoundation.com'
        },
        yAxis: {
            title: {
                text: '就业人数'
            }
        },
        legend: {
            layout: 'vertical',
            align: 'right',
            verticalAlign: 'middle'
        },
        plotOptions: {
            series: {
                label: {
                    connectorAllowed: false
                },
                pointStart: 2010
            }
        },
        series: [{
            name: '安装,实施人员',
            data: [43934, 52503, 57177, 69658, 97031, 119931, 137133, 154175]
        }, {
            name: '工人',
            data: [24916, 24064, 29742, 29851, 32490, 30282, 38121, 40434]
        }, {
            name: '销售',
            data: [11744, 17722, 16005, 19771, 20185, 24377, 32147, 39387]
        }, {
            name: '项目开发',
            data: [null, null, 7988, 12169, 15112, 22452, 34400, 34227]
        }, {
            name: '其他',
            data: [12908, 5948, 8105, 11248, 8989, 11816, 18274, 18111]
        }],
        responsive: {
            rules: [{
                condition: {
                    maxWidth: 500
                },
                chartOptions: {
                    legend: {
                        layout: 'horizontal',
                        align: 'center',
                        verticalAlign: 'bottom'
                    }
                }
            }]
        }
    });

      可以看到,data是一个列表,事实上xAxis和yAxis (也就是x轴与y轴)也可以接受列表的数据。我要的功能很简单,只需要一个标题,一条曲线,一个日期的x轴和对应的列表数据,那首先就需要拿到日期和阅读量数据的列表。

      定义一个可以返回日期和对应阅读量数据的列表,先以最近七天阅读量变化为例。

    def get_seven_days_read_data(content_type):
        """
        作用:获取七天内的阅读记录
        :param content_type: 数据表的模型类
        :return: 七天内的日期和阅读量
        """
        today = timezone.now().date()
        dates = []
        read_nums = []
        for i in range(7, 0, -1):
            # timedelta表示日期差量
            date = today - datetime.timedelta(days=i-1)
            dates.append(date.strftime('%m/%d'))
            read_detail = ReadDetail.objects.filter(content_type=content_type, date=date)
            result = read_detail.aggregate(read_num_sum=Sum('read_num'))
            # 如果前面不为false就取前面的,如为false则取后面的
            read_nums.append(result['read_num_sum'] or 0)
        return dates, read_nums

      拿到dates和read_nums两个列表以后,就可以通过render函数将它们传入到前端页面。

    <div id="container"></div>
    
    <script>
       // 图表配置
       var options1 = {
           chart: {
               type: 'line' 
           },   //指定图表的类型,默认是折线图(line)
           title: { text: null },     // 标题
           xAxis: {
               categories: {{ seven_dates|safe }},  // x 轴分类
               tickmarkPlacement: 'on',
               title: { text: '过去七日阅读量变化' }
           },
    
           yAxis: {
               title: { text: null }, // y 轴标题
               labels:{ enabled:false },
               gridLineDashStyle: 'ShortDash',  // 刻度线对齐方式
           },
    
           series: [{                              // 数据列
               name: '阅读量',                        // 数据列名
               data: {{ seven_read_nums }}                     // 数据
           }],
    
           plotOptions:{
               line:{
                   dataLabels: {
                       enabled: true,
                       color:'darkblue',
                   }
               }
           },
    
           legend:{ enabled: false },     //消除图例
           credits: { enabled:false },     //消去版权信息
       };
       
        // 图表初始化函数
        var chart = Highcharts.chart('container', options1);
    </script>

      接下来,还有一个全年阅读量,与七天内阅读量变化类似,这就需要对每月的阅读量进行Sum后返回。

    import datetime
    
    def get_year_read_data(content_type):
        """
        作用:获取该年每个月的阅读记录
        :param content_type: 数据表的模型类
        :return: 全年每月的阅读量
        """
        # 获取每个月的阅读记录
        months = []
        read_nums = []
        year = datetime.datetime.now().year
        month = datetime.datetime.now().month
    
        for month in range(1, month+1):
            months.append(str(month) + '月')
            read_month_data = ReadDetail.objects.filter(content_type=content_type, date__year=year, date__month=month)
            result = read_month_data.aggregate(read_num_sum=Sum('read_num'))
            read_nums.append(result['read_num_sum'] or 0)
    
        return months, read_nums, year

      比七天阅读量变化不同的是,多传了一个year到模板中,这是为了使代码能够适应年份的变化而增加的一个参数。

    <div id="container2"></div>
    
    <script>
        var options2 = {
            chart: { type: 'line' },   //指定图表的类型,默认是折线图(line)
                title: { text: null },     // 标题
            xAxis: {
                categories: {{ thirty_dates|safe }},  // x 轴分类
                tickmarkPlacement: 'on',
                title: { text: {{ year }}+'年阅读量变化'}
            },
    
            yAxis: {
                title: { text: null }, // y 轴标题
                labels:{ enabled:false },
                gridLineDashStyle: 'ShortDash',  // 刻度线对齐方式
            },
    
            series: [{                              // 数据列
                name: '阅读量',                        // 数据列名
                data: {{ thirty_read_nums }}                     // 数据
            }],
    
            plotOptions:{
                line:{
                    dataLabels: {
                        enabled: true,
                        color:'darkblue',
                    }
                }
            },
    
            legend:{ enabled: false },     //消除图例
            credits: { enabled:false },     //消去版权信息
        };
    
        // 图表初始化函数
        var chart = Highcharts.chart('container2', options2);
    </script>

    ​  曲线图就制作好了,不过好多细节和自定义的功能还是应该多看看API,我只参透了一点皮毛就觉得意义匪浅。另外还有一个特别注意的地方,必须引入Highcharts的script才可生效,之前被坑过,请留意。

    <script src="https://cdn.hcharts.cn/highcharts/highcharts.js"></script>
    

      原文出处:https://jzfblog.com/detail/94,文章的更新编辑以此链接为准。欢迎关注源站文章!

    作者:蒋振飞
    此内容均来自个人原创以及互联网转载和摘录,仅供学习交流使用,并非商业用途,欢迎转载。
  • 相关阅读:
    怎么利用 ChromeDriver 和 Selenium对 CEF应用进行自动化测试-java实现
    全国省市,4个直辖市geoCoord数据,用于echart gl 3d地图
    怎么利用 ChromeDriver 和 Selenium对 CEF应用进行自动化测试-python实现
    怎么利用 ChromeDriver 和 Selenium对 CEF应用进行自动化测试-java实现
    vs studio 2019 产品密匙
    Machine Learning (一)
    Css 基础(一)
    Echarts学习笔记
    Vue 进阶(实例训练)
    Vue框架
  • 原文地址:https://www.cnblogs.com/djcoder/p/10849334.html
Copyright © 2020-2023  润新知