首页 > 其他分享 >echarts 两个曲线之间填充并且不遮挡的办法

echarts 两个曲线之间填充并且不遮挡的办法

时间:2024-04-16 17:11:07浏览次数:23  
标签:const 填充 遮挡 echarts item type return data pointCurveData

echarts 两个曲线之间填充 可以用两条曲线 ,第一条填充白色 ,然后 第2条填充想要的颜色 ,如下面的代码

option = {
    title: {
        text: '堆叠区域图'
    },
    tooltip : {
        trigger: 'axis'
    },
    legend: {
        data:['最小值','最大值']
    },
    toolbox: {
        feature: {
            saveAsImage: {}
        }
    },
    grid: {
        left: '3%',
        right: '4%',
        bottom: '3%',
        containLabel: true
    },
    xAxis : [
        {
            type : 'category',
            boundaryGap : false,
            data : ['周一','周二','周三','周四','周五','周六','周日']
        }
    ],
    yAxis : [
        {
            type : 'value'
        }
    ],
    series : [
        {
            name:'最小值',
            type:'line',
          //  stack: '总量',
            areaStyle: {
                color:'#8DA2E4',
                opacity:1,
                origin:"start"
            },
            data:[320, 332, 301, -40, -30, 330, 320]
        },
        {
            name:'最大值',
            type:'line',
         //   stack: '总量',
            label: {
                normal: {
                    show: true
                }
            },
            areaStyle: {
                color:'#ffffff',
                opacity:1,
                origin:"start"
            },
            data:[10, 30, 40, -60, -50, 40, 50]
        }
    ]
};

这样有个弊端,当你 想要绘制markarea 区域的时候 ,由于下面的 曲线填充是白色的会被遮住

所以想了个办法 ,分两片区域绘制 分上半部分和下半部分 ,代码如下

import { useMemo, useState } from "react";
import ReactECharts from "echarts-for-react";
import dayjs from "dayjs";

const areaStyle = {
  opacity: 0.8,
  color: {
    type: "linear",
    x: 0,
    y: 0,
    x2: 0,
    y2: 1,
    colorStops: [
      {
        offset: 0,
        color: "rgb(0, 221, 255)",
      },
      {
        offset: 1,
        color: "rgb(77, 119, 255)",
      },
    ],
  },
};
const getCommonSeries = (name, data, markAreaData, areaStyle = undefined) => {
  return {
    name,
    areaStyle,
    data,
    type: "line",
    smooth: true,
    lineStyle: { width: 0 },
    showSymbol: false,
    markArea: {
      itemStyle: {
        color: "rgba(255, 0, 0, 0.2)",
      },
      data: markAreaData,
    },
  };
};

export const AlarmCurve = ({
  pointCurveData = [], // 点曲线数据
  alarmData = [], // 报警数据
  max = 0, // 最大值
  min = 0, // 最小值
  predictData = [], // 点预测数据
}) => {
  const pointCurveMaxData = useMemo(() => {
    return pointCurveData.map((item) => [item[0], item[1] + max]);
  }, [pointCurveData, max]);
  const pointCurveMinData = useMemo(() => {
    return pointCurveData.map((item) => [item[0], item[1] - min]);
  }, [pointCurveData, min]);
  const markAreaData = useMemo(() => {
    // 获取 alarmData 中连续的1的区间,记录的是 的开始和结束item[0]
    let result = [];
    let start = null;
    for (let i = 0; i < alarmData.length; i++) {
      if (alarmData[i][1] === 1) {
        if (start === null) {
          start = alarmData[i][0];
        }
        if (i === alarmData.length - 1 || alarmData[i + 1][1] === 0) {
          result.push([
            { xAxis: dayjs(start).format("MM-DD HH:mm:ss") },
            { xAxis: dayjs(alarmData[i][0]).format("MM-DD HH:mm:ss") },
          ]);
          start = null;
        }
      }
    }
    console.log("result", result);

    return result;
  }, [alarmData]);

  const opt = useMemo(() => {
    if (pointCurveData.length === 0) {
      return {};
    }
    // line opt
    return {
      title: {
        text: "报警曲线",
        // align center
        left: "center",
      },
      tooltip: {
        trigger: "axis",
        axisPointer: {
          type: "cross",
          label: {
            backgroundColor: "#6a7985",
          },
        },
      },
      grid: {
        top: 30,
        left: "3%",
        right: "4%",
        bottom: "3%",
        containLabel: true,
      },
      xAxis: [
        {
          type: "category",
          boundaryGap: false,
          data: pointCurveData.map((item) =>
            dayjs(item[0]).format("MM-DD HH:mm:ss"),
          ),
        },
      ],
      yAxis: {
        type: "value",
      },
      series: [
        {
          name: "Line 1-max",
          type: "line",
          stack: "max",
          smooth: true,
          lineStyle: {
            width: 0,
          },
          showSymbol: false,
          data: pointCurveData.map((item) => item[1]),
        },
        {
          name: "Line 1-base",
          type: "line",
          stack: "max",
          smooth: true,
          lineStyle: {
            width: 0,
          },
          showSymbol: false,
          emphasis: {
            focus: "series",
          },
          areaStyle: {
            opacity: 0.3,
            color: "rgb(13,185,88)",
          },
          data: pointCurveData.map((item) => max),
        },
        {
          ...getCommonSeries(
            "实时值",
            pointCurveData.map((item) => item[1]),
            undefined,
          ),
          lineStyle: {
            width: 2,
          },
        },

        {
          name: "Line 1-min",
          type: "line",
          stack: "min",
          smooth: true,
          lineStyle: {
            width: 0,
          },
          showSymbol: false,
          emphasis: {
            focus: "series",
          },
          data: pointCurveData.map((item) => item[1] - min),
        },
        {
          name: "Line 3",
          type: "line",
          stack: "min",
          smooth: true,
          lineStyle: {
            width: 0,
          },
          showSymbol: false,
          areaStyle: {
            opacity: 0.3,
            color: "rgb(13,185,88)",
          },
          data: pointCurveData.map((item) => min),
        },
        {
          ...getCommonSeries(
            "预测值",
            predictData.map((item) => item[1]),
            markAreaData,
          ),
          lineStyle: {
            width: 2,
          },
        },
      ],
    };
  }, [
    pointCurveData,
    alarmData,
    max,
    min,
    predictData,
    pointCurveMaxData,
    pointCurveMinData,
  ]);

  return <ReactECharts option={opt} />;
};

模拟数据调用

import dayjs from "dayjs";
import { AlarmCurve } from "./alarm-curve";

export const movingAverage = (data, numberOfPricePoints) => {
  return data.map((row, index, total) => {
    const start = Math.max(0, index - numberOfPricePoints);
    const subset = total.map((x) => x[1]).slice(start, index + 1);
    const sum = subset.reduce((a, b) => a + b, 0);
    return [row[0], sum / subset.length];
  });
};

export const FuXianAlarmCurve = () => {
  const now = dayjs();
  const max = 20;
  const min = 10;
  // 模拟一个1000个点的数据1秒
  const pointCurveData = movingAverage(
    Array.from({ length: 1000 }, (_, i) => [
      now.add(i, "second").valueOf(),
      Math.random() * 100,
    ]),
    20,
  );
  // 模拟一个1000个点的数据1秒
  const predictData = movingAverage(
    Array.from({ length: 1000 }, (_, i) => [
      now.add(i, "second").valueOf(),
      Math.random() * 100,
    ]),
    100,
  );
  // 遍历pointCurveData和 predictData,如果predictData 对应的值在min和max之间, 则返回0 否则返回1
  const alarmData = pointCurveData.map((item, index) => {
    const predictItem = predictData[index];
    if (predictItem[1] > item[1] + max || predictItem[1] < item[1] - min) {
      return [item[0], 1];
    }
    return [item[0], 0];
  });

  return (
    <AlarmCurve
      pointCurveData={pointCurveData}
      predictData={predictData}
      alarmData={alarmData}
      max={max}
      min={min}
    />
  );
};

效果

标签:const,填充,遮挡,echarts,item,type,return,data,pointCurveData
From: https://www.cnblogs.com/ifnk/p/18138686

相关文章

  • echarts常用属性记录
    title:标题相关show:true, //true(显示)|false(隐藏)text:'主标题',subtext:'副标题',x:'center'//水平位置'center'|'left'|'right'|{number}(x坐标,单位px)y:'top',//垂直位置'top'|......
  • Python- pyecharts 制作示例可视化图表
    1、开发可视化图表使用的技术栈:Echarts框架的Python包——pyecharts2、官方网站:pyecharts-APythonEchartsPlottingLibrarybuiltwithlove.3、官方画廊:中文简介-Document(pyecharts.org)安装pyecharts包:pipinstallpyecharts一、构建各类图表所创建的对象......
  • pyecharts实现点击省跳转省地图
    诶呀我去太感谢了终于找到实现点击地图省份实现跳转了。参考:利用pyecharts实现中国省与市之间的跳转_pyecharts点击地图跳转-CSDN博客 需要注意的问题:1.如果想在全国地图显示数据,data数据中要用如:北京市、广东省、香港特别行政区、内蒙古自治区,这种带有后缀的。(可能有些不需......
  • 使用fabric.js根据坐标生成svg图,并使用echarts显示
    仍然是在图片上特定区域根据数值显示不同的颜色的需求。拖了这么久,最终的解决方案终于定下来了:使用aoi检测设备导出的坐标来标定需显示数值和颜色的区域,如此一来就不需要人操作UI界面来标定数值的显示区域。最终使用echarts显示的方法有2种:地图map+使用坐标标记区域且区域有n......
  • echarts使用与踩坑
    0.踩坑点1.当图表不显示在页面(display:none)执行resize可能会导致图表样式混乱1.官网示例import*asechartsfrom'echarts';//基于准备好的dom,初始化echarts实例//注意:这里的main元素要有宽度才可以,不然页面上是看不到渲染的图标的,但实际上echarts已经初始化......
  • Godot Label样式 Textrue纹理,实现样式修改,背景填充
    目录前言运行环境新建项目Style样式讲解StyleBoxEmpty:普通样式StyleBoxTexture:字体样式StyleBoxFlat:填充样式StyleBoxLine:行样式总结前言在Godot中,直接的BackGroud背景颜色这个属性。Godot中使用的是Textrue纹理这个属性来表示文本的信息运行环境Godot4.2.1Windows10......
  • echarts折线图 x 轴 y 轴不展示 背景图为网格 鼠标划上样式修改等
    :header-cell-style="{backgroundColor:'#F6F8F9',color:'#333',textAlign:'center'}" 要求1、折线为渐变色2、折线区域渐变色3、x轴y轴不展示 4、折线图背景为网格   5、鼠标划上样式修改 constoption={title:{......
  • echarts地图默认高度
    echarts地图如果不设置默认高度,地图绘制的时候一直有个默认100px,即使地图的父级都设置了width:100%;height:100%;地图还是不能在高度上继承父级高度。除非你给父级一个确定的高度,比如200px这种。所以解决办法来了,你可以试试width:100%;height:100vh:这里的100vh就拿到了浏览器......
  • 数据可视化-ECharts Html项目实战(11)
    在之前的文章中,我们学习了如何在ECharts中特殊图表的双y图以及自定义形状词云图。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。数据可视化-EChartsHtml项目实战(10)-CSDN博客文章浏览阅读775次,点赞20次,收藏16次......
  • echarts X轴类目名太长时隐藏,hover时显示全部
    echarts图表X轴在柱状图中,X轴类目名如果数据太长;echarts会默认进行隐藏部分字段;如果我们想让每一个类目名都显示出来,需要进行额外的处理X轴类目名太长时,默认只显示一部分类目名<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="......