<div style="margin-top: 20px; position: relative;">
<div style="font-size: 16px; color: #333; font-weight: 600;">{{ $t('treatmentData.treatment24') }}</div>
<div :id="'event'+item.useDate" style="width: 100%; height: 240px; position: relative; margin-top: 15px;"></div>
<div :id="'event-1'+item.useDate" style="width: 100%;height: 100px; overflow: hidden; margin-top: 0px; margin-left: 2px; background-color: rgba(0,0,0,0) !important; position: absolute; bottom: -10px; left: -10px;"></div>
</div>
处理数据
if (this.echartListCpapDay[y].idName == 'event') {
this.eventData = resData.eventTrend.list[x];
if (this.eventData == null) {
this.monitorData.CA = [];
this.monitorData.FL = [];
this.monitorData.RERA = [];
this.monitorData.Snore = [];
this.monitorData.PB = [];
this.monitorData.OA = [];
this.monitorData.HY = [];
} else {
this.sxBtn('CA',0,x);
this.sxBtn('FL',1,x);
this.sxBtn('RERA',2,x);
this.sxBtn('Snore',3,x);
this.sxBtn('PB',4,x);
this.sxBtn('OA',5,x);
this.sxBtn('HY',6,x);
}
this.echatEvent(x,this.comTime[x]);
}
sxBtn(val,index,valx) {
let colors = ['#31d3e8', '#5b92d9','#c06de9','#ff9767','#ece000','#83e952','#2c3039'];
if (this.eventData[val].count > 0) {
this.eventData[val].list.map(item => {
this.eventList[valx].push(
{
itemStyle: { normal: { color: colors[index] } },
name: val,
value: [index, item.start_time, item.end_time]
}
)
})
// console.log(this.eventList)
}
},
echatEvent(valx,valName) {
let that = this;
let chartDom = document.getElementById('event'+valName);
let myChart = echarts.init(chartDom);
let colors = ['#31d3e8', '#5b92d9','#c06de9','#ff9767','#ece000','#83e952','#2c3039']; //三种状态的颜色
let state = ['CA','FL','RERA','Snore','PB','OA','HY']; //三种状态
// console.log(this.time[0],this.time[this.time.length - 1])
// echart配置
let option = {
title: [
{
subtext: this.bsZh != "zh" && this.bsZh != "tw" ? ': Hypopnea' : ': 低通气',
subtextStyle: {
color: '#2C3039',
fontSize: 11,
lineHeight: 16
},
top: '3%',
left: '5%'
},
{
subtext: this.bsZh != "zh" && this.bsZh != "tw" ? ': Obstructive Apnea' : ': 阻塞性睡眠呼吸暂停',
subtextStyle: {
color: '#2C3039',
fontSize: 11,
lineHeight: 16
},
top: '15%',
left: '5%'
},
{
subtext: this.bsZh != "zh" && this.bsZh != "tw" ? ': Periodic Breathing' : ': 周期性呼吸',
subtextStyle: {
color: '#2C3039',
fontSize: 11,
lineHeight: 16
},
top: '26%',
left: '5%'
},
{
subtext: this.bsZh != "zh" && this.bsZh != "tw" ? ': Snoring' : ': 打鼾',
subtextStyle: {
color: '#2C3039',
fontSize: 11,
lineHeight: 16
},
top: '38%',
left: '7%'
},
{
subtext: this.bsZh != "zh" && this.bsZh != "tw" ? ': Respiratory Effort'+ '\n'+'-Related Arousal' : ': 呼吸努力相关觉醒',
subtextStyle: {
color: '#2C3039',
fontSize: 11,
lineHeight: 16
},
top: '50%',
left: '7%'
},
{
subtext: this.bsZh != "zh" && this.bsZh != "tw" ? ': Flow Limitation' : ': 气流限制',
subtextStyle: {
color: '#2C3039',
fontSize: 11,
lineHeight: 16
},
top: '61%',
left: '5%'
},
{
subtext: this.bsZh != "zh" && this.bsZh != "tw" ? ': Central Apnea' : ': 中枢性睡眠呼吸暂停',
subtextStyle: {
color: '#2C3039',
fontSize: 11,
lineHeight: 16
},
top: '72%',
left: '5%'
},
],
color: colors,
tooltip: {
// trigger: 'axis',
formatter: function (params) {
// console.log(params)
return params.name + ':' + timeBtn(params.value[1]) + '~' + timeBtn(params.value[2]);
}
},
legend: {
orient: "vertical",
top: "7%",
left: '0%',
// left: 'left',
itemHeight: 18,
data: ['HY','OA','PB','Snore','RERA','FL','CA'],
formatter:function(name){
return name;
},
},
grid: {
left: '18%',
right: '3%',
top: '5%',
bottom: '5%',
containLabel: true
},
xAxis: {
type: 'time',
interval: 3600 * 1000, //以一个小时递增
min: this.patientDetail.allTrend[valx].time != null ? this.patientDetail.allTrend[valx].time[0] : 0, //将data里最小时间的整点时间设为min,否则min会以data里面的min为开始进行整点递增
// max: this.time[this.time.length - 1],
max: this.patientDetail.allTrend[valx].time != null ? this.patientDetail.allTrend[valx].time[this.patientDetail.allTrend[valx].time.length - 1] : 0,
show: false,
axisLabel: {
formatter: function (value) {
let that = this;
return formatDate(new Date(value),'hh:mm')
function formatDate(value, fmt) {
let getDate = new Date(value);
let o = {
'M+': getDate.getMonth() + 1,
'd+': getDate.getDate(),
'h+': getDate.getHours(),
'm+': getDate.getMinutes(),
's+': getDate.getSeconds(),
'q+': Math.floor((getDate.getMonth() + 3) / 3),
'S': getDate.getMilliseconds()
};
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (getDate.getFullYear() + '').substr(4 - RegExp.$1.length))
}
for (let k in o) {
if (new RegExp('(' + k + ')').test(fmt)) {
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
}
}
return fmt;
}
},
},
axisLine: {
show: true,
lineStyle: {
color: "#333",
width: 1,
type: "solid"
},
},
splitLine: {show: false}
},
yAxis: {
axisLine: {
show: true,
lineStyle: {
color: "#333",
width: 1,
type: "solid"
},
},
data: ['CA','FL','RERA','Snore','PB','OA','HY']
},
series: [
// 用空bar来显示三个图例
{ name: state[0], type: 'bar', data: [] },
{ name: state[1], type: 'bar', data: [] },
{ name: state[2], type: 'bar', data: [] },
{ name: state[3], type: 'bar', data: [] },
{ name: state[4], type: 'bar', data: [] },
{ name: state[5], type: 'bar', data: [] },
{ name: state[6], type: 'bar', data: [] },
{
type: 'custom',
renderItem: function (params, api) {//开发者自定义的图形元素渲染逻辑,是通过书写 renderItem 函数实现的
var categoryIndex = api.value(0);//这里使用 api.value(0) 取出当前 dataItem 中第一个维度的数值。
var start = api.coord([api.value(1), categoryIndex]); // 这里使用 api.coord(...) 将数值在当前坐标系中转换成为屏幕上的点的像素值。
var end = api.coord([api.value(2), categoryIndex]);
var height = api.size([0, 1])[1];
// 根据时间计算事件大小
let eventNN = 0;
let nam = (end[0] - start[0]);
if (that.time.length > 720) {
eventNN = 1;
nam = (end[0] - start[0]) < 1 ? (end[0] - start[0])*10 : (end[0] - start[0])
}
if (that.time.length > 1440) {
eventNN = 1;
nam = (end[0] - start[0]) < 1 ? (end[0] - start[0])*30 : (end[0] - start[0])
}
if (that.time.length < 400) {
eventNN = 2;
nam = (end[0] - start[0]) < 1 ? (end[0] - start[0])*10 : (end[0] - start[0])
}
if (that.time.length < 60) {
eventNN = 2;
nam = (end[0] - start[0])/20
}
return {
type: 'rect',// 表示这个图形元素是矩形。还可以是 'circle', 'sector', 'polygon' 等等。
shape: echarts.graphic.clipRectByRect({ // 矩形的位置和大小。
x: start[0],
y: start[1] - height / 2,
width: nam,
// width: (end[0] - start[0])*10,
height: height
}, { // 当前坐标系的包围盒。
x: params.coordSys.x,
y: params.coordSys.y,
width: params.coordSys.width,
height: params.coordSys.height
}),
style: api.style()
};
},
encode: {
x: [1, 2], // data 中『维度1』和『维度2』对应到 X 轴
y: 0// data 中『维度0』对应到 Y 轴
},
data: this.eventList[valx]
}
]
};
option && myChart.setOption(option);
},
效果如下图
