【11】网站搭建:阅读量曲线图
一、前言
为了让自己能直观的看出博客阅读量的变化,而不需要到后台观察,所以就使用了Highcharts的基础折线图来帮助实现。其文档地址:Highcharts 演示。
样例效果:
通过阅读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里的容器名一样。
1 | < div id="container" style="max-width:800px;height:400px"></ div > |
js代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | 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轴和对应的列表数据,那首先就需要拿到日期和阅读量数据的列表。
定义一个可以返回日期和对应阅读量数据的列表,先以最近七天阅读量变化为例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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函数将它们传入到前端页面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | <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后返回。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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到模板中,这是为了使代码能够适应年份的变化而增加的一个参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <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才可生效,之前被坑过,请留意。
1 | <script src= "https://cdn.hcharts.cn/highcharts/highcharts.js" ></script> |
原文出处:https://jzfblog.com/detail/94,文章的更新编辑以此链接为准。欢迎关注源站文章!
【推荐】FlashTable:表单开发界的极速跑车,让你的开发效率一路狂飙
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 领域模型应用
· 记一次 ADL 导致的 C++ 代码编译错误
· MySQL查询执行顺序:一张图看懂SQL是如何工作的
· 为什么PostgreSQL不自动缓存执行计划?
· 于是转身独立开发者
· Cursor 1.2重磅更新,这个痛点终于被解决了!
· 从被喷“假开源”到登顶 GitHub 热榜,这个开源项目上演王者归来!
· C#/.NET/.NET Core优秀项目和框架2025年6月简报
· 上周热点回顾(6.30-7.6)
· .NET AI 模板