parent
e7fb395e66
commit
9416a310d0
@ -0,0 +1,153 @@
|
||||
body{
|
||||
margin: 0;
|
||||
background: #333;
|
||||
}
|
||||
#title{
|
||||
position: absolute;
|
||||
width: 40%;
|
||||
height: 10%;
|
||||
top: 0;
|
||||
left: 30%;
|
||||
color: white;
|
||||
font-size: 35px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
}
|
||||
#tim{
|
||||
position: absolute;
|
||||
height: 5%;
|
||||
top: 5%;
|
||||
right: 2%;
|
||||
background: transparent;
|
||||
font-size: 20px;
|
||||
}
|
||||
#c1{
|
||||
position: absolute;
|
||||
width: 40%;
|
||||
height: 30%;
|
||||
top: 10%;
|
||||
left: 30%;
|
||||
color: white;
|
||||
}
|
||||
.num{
|
||||
width: 25%;
|
||||
float: left;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: gold;
|
||||
font-size: 20px;
|
||||
}
|
||||
.txt{
|
||||
width: 25%;
|
||||
float: left;
|
||||
font-family: "幼圆";
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.txt h2{
|
||||
margin: 0;
|
||||
}
|
||||
#c2{
|
||||
position: absolute;
|
||||
width: 40%;
|
||||
height: 60%;
|
||||
top: 40%;
|
||||
left: 30%;
|
||||
/*background: #888888;*/
|
||||
}
|
||||
#l1{
|
||||
position: absolute;
|
||||
width: 30%;
|
||||
height: 45%;
|
||||
top: 10%;
|
||||
left: 0;
|
||||
/*background: #999999;*/
|
||||
}
|
||||
#container{
|
||||
position: absolute;
|
||||
padding-top: 15px;
|
||||
width: 30%;
|
||||
height: 45%;
|
||||
top: 55%;
|
||||
left: 0;
|
||||
/*background: #353;*/
|
||||
overflow: hidden;
|
||||
|
||||
}
|
||||
#l2{
|
||||
/*position: absolute;*/
|
||||
text-align: center;
|
||||
display: flex;
|
||||
width: 100%;
|
||||
height: 20%;
|
||||
/*top: 0;*/
|
||||
/*left: 0;*/
|
||||
/*background: #777;*/
|
||||
overflow: hidden;
|
||||
mask-image: linear-gradient(
|
||||
90deg, transparent, #fff 20%, #fff 80%, transparent
|
||||
);
|
||||
}
|
||||
#l2 div{
|
||||
white-space: nowrap;
|
||||
animation: animate var(--t) linear infinite;
|
||||
}
|
||||
#l2 div:nth-child(2){
|
||||
animation: animate2 var(--t) linear infinite;
|
||||
animation-delay: calc(var(--t)/ -2);
|
||||
}
|
||||
@keyframes animate {
|
||||
from{
|
||||
transform: translate(100%);
|
||||
}
|
||||
to{
|
||||
transform: translate(-100%);
|
||||
}
|
||||
}
|
||||
@keyframes animate2 {
|
||||
from{
|
||||
transform: translate(0);
|
||||
}
|
||||
to{
|
||||
transform: translate(-200%);
|
||||
}
|
||||
}
|
||||
#l2 div span{
|
||||
display: inline-flex;
|
||||
margin: 10px;
|
||||
letter-spacing: .2em;
|
||||
background-color: #504d4d;
|
||||
color: #fff;
|
||||
padding: 5px 10px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
|
||||
#r1{
|
||||
position: absolute;
|
||||
/*padding-bottom: 10px;*/
|
||||
width: 30%;
|
||||
/*height: 45%;*/
|
||||
height: 371px;
|
||||
top: 10%;
|
||||
left: 70%;
|
||||
/*background: #8888;*/
|
||||
}
|
||||
#r2{
|
||||
position: absolute;
|
||||
width: 30%;
|
||||
height: 45%;
|
||||
top: 55%;
|
||||
left: 70%;
|
||||
/*background: #444;*/
|
||||
}
|
||||
|
||||
#wordCloudImage{
|
||||
width: 100%;
|
||||
height: auto;
|
||||
max-width: 100%;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 132 KiB |
After Width: | Height: | Size: 250 KiB |
@ -0,0 +1,8 @@
|
||||
// 发送请求到后端获取平均情感得分
|
||||
fetch('/average_sentiment')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
// 获取平均情感得分并更新到前端
|
||||
document.querySelector('#average_sentiment h1').textContent = data.average_sentiment.toFixed(2);
|
||||
})
|
||||
.catch(error => console.error('Error:', error));
|
@ -0,0 +1,8 @@
|
||||
// 发送请求到后端获取弹幕总数
|
||||
fetch('/barrage_count')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
// 获取行数并更新到前端
|
||||
document.querySelector('#barrage_count h1').textContent = data.row_count;
|
||||
})
|
||||
.catch(error => console.error('Error:', error));
|
@ -0,0 +1,45 @@
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
var chartDom = document.getElementById('r1');
|
||||
var myChart = echarts.init(chartDom);
|
||||
var option;
|
||||
|
||||
fetch('/barrage_sentiment')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
// 只加载前100条数据
|
||||
data = data.slice(0, 250);
|
||||
|
||||
var scatterData = data.map((item, index) => [index, item.sentiment]);
|
||||
|
||||
option = {
|
||||
title: {
|
||||
text: '弹幕情感分析',
|
||||
left: 'center',
|
||||
top: 'bottom',
|
||||
textStyle: {
|
||||
color: '#FFFFFF',
|
||||
}
|
||||
},
|
||||
tooltip: {},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: data.map((item, index) => index),
|
||||
axisLabel: {
|
||||
show:false
|
||||
}
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value'
|
||||
},
|
||||
series: [{
|
||||
data: scatterData,
|
||||
type: 'scatter',
|
||||
itemStyle: {
|
||||
color: 'rgba(255, 0, 0, 0.8)'
|
||||
}
|
||||
}]
|
||||
};
|
||||
|
||||
myChart.setOption(option);
|
||||
});
|
||||
});
|
@ -0,0 +1,47 @@
|
||||
fetch('/data')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
let clusterData = {};
|
||||
data.forEach(item => {
|
||||
if (!clusterData[item.cluster]) {
|
||||
clusterData[item.cluster] = [];
|
||||
}
|
||||
clusterData[item.cluster].push(item.barrage);
|
||||
});
|
||||
|
||||
let seriesData = [];
|
||||
for (let cluster in clusterData) {
|
||||
seriesData.push({
|
||||
name: `Cluster ${cluster}`,
|
||||
type: 'bar',
|
||||
data: clusterData[cluster].map((item, index) => ({ value: item.length, name: `弹幕 ${index + 1}` }))
|
||||
});
|
||||
}
|
||||
let chart = echarts.init(document.getElementById('l1'));
|
||||
let option = {
|
||||
title: {
|
||||
text: '弹幕聚类分析',
|
||||
left:'center',
|
||||
top: 'bottom',
|
||||
textStyle: {
|
||||
color: '#ffffff'
|
||||
}
|
||||
},
|
||||
tooltip: {},
|
||||
legend: {
|
||||
data: seriesData.map(item => item.name),
|
||||
textStyle: {
|
||||
color: '#ffffff'
|
||||
}
|
||||
},
|
||||
xAxis: {
|
||||
data: seriesData[0].data.map(item => item.name),
|
||||
axisLabel: {
|
||||
show: false,
|
||||
}
|
||||
},
|
||||
yAxis: {},
|
||||
series: seriesData
|
||||
};
|
||||
chart.setOption(option);
|
||||
});
|
@ -0,0 +1,8 @@
|
||||
// 发送请求到后端获取关键字数量
|
||||
fetch('/count_keywords')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
// 获取关键字数量并更新到前端
|
||||
document.querySelector('#keyword_count h1').textContent = data.keyword_count;
|
||||
})
|
||||
.catch(error => console.error('Error:', error));
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,121 @@
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
var myChart = echarts.init(document.getElementById('c2'));
|
||||
myChart.showLoading();
|
||||
$.when(
|
||||
$.get('https://fastly.jsdelivr.net/npm/echarts/map/json/china.json'),
|
||||
$.getScript('https://fastly.jsdelivr.net/npm/d3-array'),
|
||||
$.getScript('https://fastly.jsdelivr.net/npm/d3-geo')
|
||||
).done(function (res) {
|
||||
const chinaJson = res[0];
|
||||
const projection = d3.geoMercator();
|
||||
myChart.hideLoading();
|
||||
echarts.registerMap('China', chinaJson);
|
||||
option = {
|
||||
color: 'white',
|
||||
title: {
|
||||
text: '中国各省得奖情况',
|
||||
sublink: 'http://www.census.gov/popest/data/datasets.html',
|
||||
left: 'center',
|
||||
top:'top',
|
||||
textStyle:{
|
||||
color:'#FFFFFF',
|
||||
}
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'item',
|
||||
showDelay: 0,
|
||||
transitionDuration: 0.2
|
||||
},
|
||||
visualMap: {
|
||||
left: 'right',
|
||||
min: 0,
|
||||
max: 18,
|
||||
inRange: {
|
||||
color: [
|
||||
'#313695',
|
||||
'#4575b4',
|
||||
'#74add1',
|
||||
'#abd9e9',
|
||||
'#e0f3f8',
|
||||
'#ffffbf',
|
||||
'#fee090',
|
||||
'#fdae61',
|
||||
'#f46d43',
|
||||
'#d73027',
|
||||
'#a50026'
|
||||
]
|
||||
},
|
||||
text: ['高', '低'],
|
||||
calculable: true,
|
||||
show:false,
|
||||
},
|
||||
toolbox: {
|
||||
show: false,
|
||||
left: 'left',
|
||||
top: 'top',
|
||||
feature: {
|
||||
dataView: {readOnly: false},
|
||||
restore: {},
|
||||
saveAsImage: {}
|
||||
}
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: '奖牌数',
|
||||
type: 'map',
|
||||
map: 'China',
|
||||
projection: {
|
||||
project: function (point) {
|
||||
return projection(point);
|
||||
},
|
||||
unproject: function (point) {
|
||||
return projection.invert(point);
|
||||
}
|
||||
},
|
||||
emphasis: {
|
||||
label: {
|
||||
show: true
|
||||
}
|
||||
},
|
||||
data: [
|
||||
{ name: '北京', value: 5 },
|
||||
{ name: '天津', value: 3 },
|
||||
{ name: '上海', value: 9 },
|
||||
{ name: '重庆', value: 2 },
|
||||
{ name: '河北', value: 5 },
|
||||
{ name: '河南', value: 3 },
|
||||
{ name: '云南', value: 2 },
|
||||
{ name: '辽宁', value: 7 },
|
||||
{ name: '黑龙江', value: 1 },
|
||||
{ name: '湖南', value: 15 },
|
||||
{ name: '安徽', value: 1 },
|
||||
{ name: '山东', value: 16 },
|
||||
{ name: '新疆', value: 1 },
|
||||
{ name: '江苏', value: 17 },
|
||||
{ name: '浙江', value: 18 },
|
||||
{ name: '江西', value: 3 },
|
||||
{ name: '湖北', value: 6 },
|
||||
{ name: '广西', value: 2 },
|
||||
{ name: '甘肃', value: 0 },
|
||||
{ name: '山西', value: 0 },
|
||||
{ name: '内蒙古', value: 2 },
|
||||
{ name: '陕西', value: 0 },
|
||||
{ name: '吉林', value: 4 },
|
||||
{ name: '福建', value: 4 },
|
||||
{ name: '贵州', value: 3 },
|
||||
{ name: '广东', value: 16 },
|
||||
{ name: '青海', value: 0 },
|
||||
{ name: '西藏', value: 0 },
|
||||
{ name: '四川', value: 18 },
|
||||
{ name: '宁夏', value: 0 },
|
||||
{ name: '海南', value: 2 },
|
||||
{ name: '台湾', value: 7 },
|
||||
{ name: '香港', value: 4 },
|
||||
{ name: '澳门', value: 0 },
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
myChart.setOption(option);
|
||||
});
|
||||
});
|
@ -0,0 +1,13 @@
|
||||
function getTime() {
|
||||
$.ajax({
|
||||
url: "/time",
|
||||
timeout: 10000,
|
||||
success: function (data) {
|
||||
$("#tim").html(data);
|
||||
},
|
||||
error: function (xhr, type, errorThrown) {
|
||||
console.error("Error occurred: ", type, errorThrown);
|
||||
}
|
||||
});
|
||||
}
|
||||
setInterval(getTime,100)
|
@ -0,0 +1,23 @@
|
||||
fetch('/world_comment')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
const container = document.getElementById('container');
|
||||
|
||||
data.forEach(entry => {
|
||||
const div = document.createElement('div');
|
||||
div.id = 'l2';
|
||||
div.style.setProperty('--t', entry.time);
|
||||
|
||||
const innerDiv = document.createElement('div');
|
||||
entry.items.forEach(item => {
|
||||
const span = document.createElement('span');
|
||||
span.textContent = item;
|
||||
innerDiv.appendChild(span);
|
||||
});
|
||||
|
||||
div.appendChild(innerDiv.cloneNode(true)); // 克隆一份 innerDiv
|
||||
div.appendChild(innerDiv); // 添加原始 innerDiv
|
||||
container.appendChild(div);
|
||||
});
|
||||
})
|
||||
.catch(error => console.error('Error fetching data:', error));
|
@ -0,0 +1,57 @@
|
||||
fetch('/wordcloud')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
// let wordCloudData = [];
|
||||
// for (let word in data) {
|
||||
// wordCloudData.push({ name: word, value: data[word] });
|
||||
// }
|
||||
|
||||
let chart = echarts.init(document.getElementById('r2'));
|
||||
let option = {
|
||||
tooltip: {
|
||||
show: true
|
||||
},
|
||||
series: [{
|
||||
type: 'wordCloud',
|
||||
shape: 'circle',
|
||||
maskImage: new Image(),
|
||||
left: 'center',
|
||||
top: 'center',
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
right: null,
|
||||
bottom: null,
|
||||
sizeRange: [12, 50],
|
||||
rotationRange: [-90, 90],
|
||||
rotationStep: 45,
|
||||
gridSize: 8,
|
||||
drawOutOfBound: false,
|
||||
textStyle: {
|
||||
normal: {
|
||||
fontFamily: 'sans-serif',
|
||||
fontWeight: 'bold',
|
||||
color: function () {
|
||||
return 'rgb(' + [
|
||||
Math.round(Math.random() * 200) + 50,
|
||||
Math.round(Math.random() * 50),
|
||||
Math.round(Math.random() * 50) + 50
|
||||
].join(',') + ')';
|
||||
}
|
||||
},
|
||||
emphasis: {
|
||||
shadowBlur: 10,
|
||||
shadowColor: '#333'
|
||||
}
|
||||
},
|
||||
data: data
|
||||
}]
|
||||
};
|
||||
|
||||
// 加载遮罩图像
|
||||
let maskImage = new Image();
|
||||
maskImage.src = 'static/img/log.png';
|
||||
maskImage.onload = function() {
|
||||
option.series[0].maskImage = maskImage;
|
||||
chart.setOption(option);
|
||||
};
|
||||
});
|
Loading…
Reference in new issue