ECharts实现WordPress评论统计图

之前使用Google Charts在本站创建过统计图(方法见以下文章),不知是什么原因最近发现各种统计图都不显示,以为是不小心动了某个代码,于是重新修改了一次,问题依旧。想着可能是代码冲突或者GG被qiang的原因。本着有问题必须解决的态度,想到了EChart。

WordPress评论统计图

在网络上经常会见到各种博客网站评论留言墙,但统计图表却比较少见。前段时间无意在网友“牧羊人”那里见到这个,发现非常酷,于是弄过来用上了。

Google Charts: https://developers.google.cn/charts
其实几年前大神【伍子蛇】就提过建议,只是当时技术太菜了,不敢折腾太复杂的东西。 ::wb:wl::

伍子蛇2020-06-20 09:05:25

这方法不好,建议封装一个Echat,在文章页也可以调用图表,用到的库要自己下到本地,不要调用墙外的东西,那可不用起来蛋疼。可以来看看我在文章中用的图表http://d-d.design/?p=10211

简介

ECharts是一个强大而且易于使用的数据可视化库,适用于各种项目和应用场景。ECharts(一个基于JavaScript的,以交互为特色的数据可视化图表库),它由百度开发并维护,被广泛用于构建数据可视化界面。ECharts提供了丰富的图表类型和样式,包括折线图、柱状图、饼图、散点图等,而且支持动态更新和交互操作,使得用户可以轻松地定制并呈现数据。

ECharts 5 新增支持动态排序柱状图(bar-racing)以及动态排序折线图(line-racing),方便地创建带有时序性的图表,展现数据随着时间维度上的变化,讲述数据的演变过程。

最近几年CSP J组第一轮晋级分数

看到这个动态排序图有没有很熟悉的感觉?没错,经常会在一些短视频中看到它。

评论统计图
评论数据统计图

鉴于之前折腾只涉及到饼图、折线图和柱状图,本次也将用EChart来实现同样的功能。

引入ECharts

html
<script type="text/javascript" src="https://cdn.staticfile.net/echarts/5.4.3/echarts.min.js"></script>

WordPress函数

php
global $wpdb;
$numbers_day = 30;
$numbers_month = 9;
$numbers_user = 8;
$query_day ="SELECT COUNT(*) AS `cnt` , DATE_FORMAT( `comment_date` , '%Y-%m-%d' ) AS d FROM $wpdb->comments GROUP BY d ORDER BY `d` DESC LIMIT 0 , " . $numbers_day;
$query_month="SELECT COUNT(*) AS `cnt` , DATE_FORMAT( `comment_date` , '%Y-%m' ) AS d FROM $wpdb->comments GROUP BY d ORDER BY `d` DESC LIMIT 0 , " . $numbers_month;
$query_user ="
SELECT
COUNT( comment_author_email ) AS number,
comment_author_email,
comment_author
FROM (
SELECT *
FROM $wpdb->comments
LEFT OUTER JOIN $wpdb->posts
ON ( $wpdb->posts.ID = $wpdb->comments.comment_post_ID )
WHERE
comment_date > date_sub( NOW(), INTERVAL 180 DAY )
AND user_id = '0'
AND comment_approved = '1'
ORDER BY comment_ID DESC
) AS tempcmt
GROUP BY comment_author_email
ORDER BY number DESC
LIMIT {$numbers_user}";
$output_day = $wpdb->get_results($query_day);
$output_month = $wpdb->get_results($query_month);
$output_user = $wpdb->get_results($query_user);

统计图

饼图

html
<div id="chart_user" style="width:100%; height:220px"></div>
<script>
// 基于准备好的dom,初始化echarts实例
var userChart = echarts.init(document.getElementById('chart_user'));

// 指定图表的配置项和数据
var option = {
title: {
text: '活跃读者'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'left',
},
series: [
{
name: '活跃读者',
type: 'pie',
radius: '55%',
data: [
<?php foreach ($output_user as $o) {echo "{value:" . $o->number . ",name:'" . $o->comment_author . "'},";} ?>
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};

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

折线图

html
<div id="chart_day" style="width:100%; height:400px;"></div>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var dayChart = echarts.init(document.getElementById('chart_day'));

// 指定图表的配置项和数据
var option = {
title: {
text: '日评论数'
},
tooltip: {
trigger: 'axis'
},
legend: {
data:['评论']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
toolbox: {
feature: {
saveAsImage: {}
}
},
xAxis: {
type: 'category',
boundaryGap: false,
data: [
<?php foreach (array_reverse($output_day) as $o) {echo " '" . $o->d . "',";} ?>
]
},
yAxis: {
type: 'value'
},
series: [
{
name:'评论',
type:'line',
data:[
cnt . ","; ?>
]
}
]
};

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

柱状图

html
<div id="chart_month" style="width: 100%;height:350px;"></div>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var month_Chart = echarts.init(document.getElementById('chart_month'));

// 指定图表的配置项和数据
var option = {
title: {
text: '月评论数据'
},
tooltip: {},
legend: {
data:['评论']
},
xAxis: {
data: [
<?php foreach (array_reverse($output_month) as $o) echo "'" . $o->d . "',"; ?>
]
},
yAxis: {},
series: [{
name: '评论数',
type: 'bar',
data: [
<?php foreach (array_reverse($output_month) as $o) echo "" . $o->cnt . ","; ?>
]
}]
};

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

雷达图

html
<div id="main" style="width: 100%;height:350px;"></div>
<script>var chartDom = document.getElementById('main');
var myChart = echarts.init(chartDom);
var option;

option = {
title: {
text: 'Basic Radar Chart'
},
legend: {
data: ['Allocated Budget', 'Actual Spending']
},
radar: {
// shape: 'circle',
indicator: [
{ name: 'Sales', max: 6500 },
{ name: 'Administration', max: 16000 },
{ name: 'Information Technology', max: 30000 },
{ name: 'Customer Support', max: 38000 },
{ name: 'Development', max: 52000 },
{ name: 'Marketing', max: 25000 }
]
},
series: [
{
name: 'Budget vs spending',
type: 'radar',
data: [
{
value: [4200, 3000, 20000, 35000, 50000, 18000],
name: 'Allocated Budget'
},
{
value: [5000, 14000, 28000, 26000, 42000, 21000],
name: 'Actual Spending'
}
]
}
]
};

option && myChart.setOption(option);</script>

根据自己需要更改变量及参数即可。

热力图

html
<div id="main" style="width: 100%;height:350px;"></div>
<script>var chartDom = document.getElementById('main');
var myChart = echarts.init(chartDom);
var option;

function getVirtualData(year) {
const date = +echarts.time.parse(year + '-01-01');
const end = +echarts.time.parse(+year + 1 + '-01-01');
const dayTime = 3600 * 24 * 1000;
const data = [];
for (let time = date; time < end; time += dayTime) {
data.push([
echarts.time.format(time, '{yyyy}-{MM}-{dd}', false),
Math.floor(Math.random() * 10000)
]);
}
return data;
}
option = {
title: {
top: 30,
left: 'center',
text: 'Daily Step Count'
},
tooltip: {},
visualMap: {
min: 0,
max: 10000,
type: 'piecewise',
orient: 'horizontal',
left: 'center',
top: 65
},
calendar: {
top: 120,
left: 30,
right: 30,
cellSize: ['auto', 13],
range: '2016',
itemStyle: {
borderWidth: 0.5
},
yearLabel: { show: false }
},
series: {
type: 'heatmap',
coordinateSystem: 'calendar',
data: getVirtualData('2016')
}
};

option && myChart.setOption(option);
</script>

在折腾热力图时和上面几种图一起放入统计页面竟然不显示,初步怀疑可能是变量冲突,有时间再研究,于是先放入归档页面。

此时我突然有个大胆的想法——足迹地图是否也可以用这个实现呢???后续有时间再研究。。。

参考资料

ECharts: https://echarts.apache.org

老王发布于2024-08-23 13:10
楚客追梦情难休,万里追寻志未酬。

赞助 点赞 0

林三, Kevin, acevs, 珂泽, Ksable, 阿和, XI, 威言威语等人对本文发表了17条热情洋溢的评论。
  • 8楼
    林三小学生湖北省武汉市 Firefox 127.0 & Windows 10

    看来以后有问题可以来找老王了

  • 7楼
    Kevin初中生友邻重庆市 Chrome 129.0.0.0 & Windows 10

    可以可以,是时候把我那老旧的代码换掉了

    1. 老王作者广东省 Safari 17.6 & macOS Catalina 10.15.7

      之前看过你那里显示是正常的呀~~😊

  • 6楼
    acevs初中生友邻山东省 Chrome 123.0.0.0 & Windows 10

    实践长见识。mark

  • 5楼
    珂泽学前班湖北省武汉市 Microsoft Edge 128.0.0.0 & Windows 10

    可以可以,弄API的话应该会更方便

    1. 老王作者广东省 Safari 17.6 & macOS Catalina 10.15.7

      嗯,技术还达不到呢 ::wb:wl::

  • 4楼
    Ksable学前班广东省茂名市 未知浏览器 & Android 6.0.1

    ECharts?怎么看着这么眼熟,突然想到我之前文章热力图就是用它,不过做的不是很好

    1. 老王作者广东省 Safari 17.6 & macOS Catalina 10.15.7

      嗯嗯,我的热力图也是用的它。

      1. Ksable学前班广东省广州市 未知浏览器 & Android 6.0.1

        有个想法去把我的归档页面给添加上更多的统计图,
        可惜,个人的时间和技术水平都可能把计划给灭掉了

        1. 老王作者广东省 Safari 17.6 & macOS Catalina 10.15.7

          可以参照文中的方法,把数据输出改为你的网站函数。
          文中统计图效果参照:https://www.wanghao.me/charts.html

  • 三甲
    阿和博士生友邻浙江省温州市 Chrome 94.0.4606.71 & 未知系统

    我看着图表就头疼😅

    1. 老王作者广东省 Safari 17.6 & macOS Catalina 10.15.7

      比代码看着舒服吧 ::wb:wl::

      1. 阿和博士生友邻浙江省温州市 Chrome 94.0.4606.71 & 未知系统

        我宁愿看代码😂

  • 次席
    XI初中生友邻四川省成都市 Chrome 109.0.0.0 & Windows 10

    老王可以搞一个wp的api,直接输出一个json给ECharts。

    1. 老王作者广东省 Safari 17.6 & macOS Catalina 10.15.7

      想弄只是技术还没达到😂

  • 首评
    威言威语高中生友邻上海市 Firefox 129.0 & Windows 10

    厉害了,统计页面展示的效果挺不错。

    1. 老王作者广东省 Safari 17.6 & macOS Catalina 10.15.7

      我也只是个拿来主义😀

  • 发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注