Plotly.js 热力图与折线结合

news2024/12/26 20:45:16

在这里插入图片描述
上次记录了Echarts热力图与折线图的结合,但其效果不是很自然。后又找到了Plotly.js库,发现其效果不错。在此整理下实现过程。这里面涉及到自定义工具栏、自定义工具图标等等

配置工具栏显示的工具图标

let config = {
	locale: 'zh-cn',      // 设置本地语言
	displayModeBar: true, // 显示工具栏
	displaylogo: false,   // 隐藏logo
	// 移除部分图标
	modeBarButtonsToRemove:  ['toImage', 'pan', 'zoom', 'zoomin', 'zoomout', 'lasso2d','autoscale','reset']
}

配置自定义工具栏按钮

// 在let config下添加按钮部分:
let config = {
	...
	modeBarButtonsToAdd: [
	   {
	     name: '折线',
	     icon: {
	        width: 500,
	        height:500,
	        path: 'M64 64c0-17.7-14.3-32-32-32S0 46.3 0 64V400c0 44.2 35.8 80 80 80H480c17.7 0 32-14.3 32-32s-14.3-32-32-32H80c-8.8 0-16-7.2-16-16V64zm406.6 86.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L320 210.7l-57.4-57.4c-12.5-12.5-32.8-12.5-45.3 0l-112 112c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L240 221.3l57.4 57.4c12.5 12.5 32.8 12.5 45.3 0l128-128z',
	     },
	     // 绑定的点击事件,注意gb是整个div对象。可通过.xxx的方式获取div中的信息。比如:gb.id可得div的Id
	     click: function(gd) {
	       load_line_data('line', gd.id)  // 自定义图标按钮被点击后的事件,我这实现了点击后热力图切换成Echarts折线图的功能。
	     }
	   },
	],
}

设置layout:

let layout = {
  modebardisplay: false,
  title: { text: "热力图结合折线图", side: 'top center',  // 标题的位置及字体信息
    font: {
      color: "#73cff2",
      size: 14,
    },
  },
  margin: { t: 30, l: 24, b: 24, r: 0 },  // 调整图表位置
  paper_bgcolor: "#09357a",  // 设置图表背景色
  plot_bgcolor: "#09357a",    // 设置轴线背景色
  xaxis: {tickcolor: "#03c7ff",tickfont:{color: "#03c7ff"}},//刻度线的颜色
  yaxis: {visible: false,tickcolor: "#03c7ff",tickfont:{color: "#03c7ff"},zeroline:true, hoverformat: '.2r'},
};

配置热力图的数据

let heatmap = {
  type: "heatmap",
  name: "name会显示在图表的悬浮窗内",  // 可通过接口获得或者固定
  hoverinfo: "x+z",  // 悬浮窗需要显示的数据x表示数据的x轴对应的值,其他数据需要显示的话同理,配置上即可,支持:x、y、z、x+y、x+z...
  xhoverformat: "%Y-%m-%d %H:%M:%S",  // 如果x轴是时间的话,此配置可以格式化日期
  hovertemplate: '<b>日期:</b>: %{x}<br><b>权重:</b>: %{z:.4f}<br>',  // 悬浮窗的样式等等再这里配置
  hoverlabel: {
      bgcolor: "rgba(0,0,0,0)",  // 定义悬浮窗的背景颜色
      bordercolor: "#03c7ff",    // 定义悬浮窗的边框颜色
      font: {
          color: "#149b6a", // 定义悬浮窗内容字体颜色
          size: 14,     // 定义悬浮窗内容字体大小
      }
  },
  showscale: false,  // 是否显示右侧的颜色比例尺
  // 热力图的三维数据
  x: item.x,  
  y: item.y,
  z: item.z,
}

配置折线图的数据

let line = {
  mode: 'lines',
  name: item.text,
  xhoverformat: "%Y-%m-%d %H:%M:%S",  // 格式化悬浮窗的x轴时间字段
  hovertemplate: '<b>日期:</b>: %{x}<br><b>数据:</b>: %{customdata}<br>',  // 定义悬浮窗的内容
  hoverlabel: {
      bgcolor: "rgba(0,0,0,0)",  // 定义悬浮窗的背景颜色
      bordercolor: "#03c7ff",    // 定义悬浮窗的边框颜色
      font: {
          color: "#149b6a", // 定义悬浮窗内容字体颜色
          size: 14,     // 定义悬浮窗内容字体大小
      }
  },
  line: { color: "#149b6a", },  // 定义线的颜色
  x: item.x1,
  y: item.y1,
  customdata: item.customdata,   // 设置自定义数据(数组),此数据可在hovertemplate中访问。
}

完整代码如下:

// Dom元素的配置很简单:
<div id="chart_heatmap" style="width: 100%;height: 400px;"></div>
//  Javascript部分
const load_heatmap_data = function () {
        let chart_heatmap = document.getElementById("chart_heatmap");
        $.ajax({
            type: "POST",
            url: "后端接口地址",
            success: function (item) {
                # 设置配置信息
                let config = {
                    locale: 'zh-cn',
                    displayModeBar: true,
                    displaylogo: false,  //隐藏logo
                    displayReset: false, //
                    modeBarButtonsToRemove:  ['toImage', 'pan', 'zoom', 'zoomin', 'zoomout', 'lasso2d','autoscale','reset'],
                    modeBarButtonsToAdd: [
                        {
                          name: '折线',
                          icon: {
                             width: 500,
                             height:500,
                             // 折线图标的svg
                             path: 'M64 64c0-17.7-14.3-32-32-32S0 46.3 0 64V400c0 44.2 35.8 80 80 80H480c17.7 0 32-14.3 32-32s-14.3-32-32-32H80c-8.8 0-16-7.2-16-16V64zm406.6 86.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L320 210.7l-57.4-57.4c-12.5-12.5-32.8-12.5-45.3 0l-112 112c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L240 221.3l57.4 57.4c12.5 12.5 32.8 12.5 45.3 0l128-128z',
                          },
                          click: function(gd) {
                            load_line_data('line', gd.id)
                          }
                        },
                    ],
                }
                let layout = {
                  modebardisplay: false,
                  title: { text: item.text, side: 'top center',
                    font: {
                      color: "#73cff2",
                      size: 14,
                    },
                  },
                  margin: { t: 30, l: 24, b: 24, r: 0 },
                  paper_bgcolor: "#09357a",  // 设置图表背景色
                  plot_bgcolor: "#09357a",    // 设置轴线背景色
                  xaxis: {tickcolor: "#03c7ff",tickfont:{color: "#03c7ff"}},//刻度线的颜色
                  yaxis: {visible: false,tickcolor: "#03c7ff",tickfont:{color: "#03c7ff"},
                  zeroline:true, hoverformat: '.2r'},
                };
                let heatmap = {
                  type: "heatmap",
                  name: item.text,
                  hoverinfo: "x+z",
                  xhoverformat: "%Y-%m-%d %H:%M:%S",
                  hovertemplate: '<b>日期:</b>: %{x}<br><b>权重:</b>: %{z:.4f}<br>',
                  hoverlabel: {
                      bgcolor: "rgba(0,0,0,0)",  // 定义悬浮窗的背景颜色
                      bordercolor: "#03c7ff",    // 定义悬浮窗的边框颜色
                      font: {
                          color: "#149b6a", // 定义悬浮窗内容字体颜色
                          size: 14,     // 定义悬浮窗内容字体大小
                      }
                  },
                  showscale: false,
                  x: item.x,
                  y: item.y,
                  z: item.z,
                }
                let line = {
                  mode: 'lines',
                  name: item.text,
                  xhoverformat: "%Y-%m-%d %H:%M:%S",  // 格式化悬浮窗的x轴时间字段
                  hovertemplate: '<b>日期:</b>: %{x}<br><b>数据:</b>: %{customdata}<br>',  // 定义悬浮窗的内容
                  hoverlabel: {
                      bgcolor: "rgba(0,0,0,0)",  // 定义悬浮窗的背景颜色
                      bordercolor: "#03c7ff",    // 定义悬浮窗的边框颜色
                      font: {
                          color: "#149b6a", // 定义悬浮窗内容字体颜色
                          size: 14,     // 定义悬浮窗内容字体大小
                      }
                  },
                  line: { color: "#149b6a", },  // 定义线的颜色
                  x: item.x1,
                  y: item.y1,
                  customdata: item.customdata,   // 设置自定义数据(数组),此数据可在hovertemplate中访问。
                }
               Plotly.newPlot(chart_heatmap, [heatmap, line], layout, config);
            },
            complete: function () {
                console.log("complete")
            },
        });
     };

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1367944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32F103GPIO工作模式及原理

目录 GPIO简介GPIO工作模式输入模式输出模式输出速度 GPIO框图和电路解析电路标识电路元件 GPIO工作模式电路解析浮空输入上拉输入下拉输入模拟输入开漏输出推挽输出推挽式复用功能开漏式复用功能 IO工作模式的选取输入模式输出模式 GPIO简介 GPIO&#xff0c;全称为通用输入输…

眼镜用超声波清洗机洗会有伤害吗?这些超声波清洗机适合清洗眼镜

用超声波清洗机洗眼镜是一种非常好的选择&#xff0c;超声波清洗机通过高频振动&#xff0c;将眼镜上的污渍、灰尘等清洗干净&#xff0c;比手洗更彻底、更高效。然而&#xff0c;有些人担心超声波清洗机会对眼镜造成伤害。实际上&#xff0c;这种担心是多余的。超声波清洗机在…

python基础教程八(循环1)

1. while循环 为避免多次重复的代码&#xff0c;我们会用到循环 while (condition): 执行语句 while循环的结构非常简单只要条件满足就一直循环直到&#xff0c;条件不满足为止。 例子如下&#xff1a; x1 while x<100:print(x)x1结果就是最简单的输出1-100的数字 while…

【Internal Server Error】pycharm解决关闭flask端口依然占用问题

Internal Server Error The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application. 起因&#xff1a; 我们在运行flask后&#xff0c;断开服务依然保持运行&#xff0…

Java中SpringBoot组件集成接入【MQTT中间件】

Java中SpringBoot组件集成接入【MQTT中间件】 1.MQTT介绍2.搭建MQTT服务器1.Windows2.Ubuntu3.Docker4.其他方式3.mqtt可视化客户端MQTTX及快速使用教程4.SpringBoot接入MQTT1、maven依赖2、MQTT配置3、MQTT组件具体代码1.定义通道名字2.消息发布器3.MQTT配置、生产者、消费者4…

基于Java SSM框架实现班级同学录管理系统项目【项目源码】

基于java的SSM框架实现高校校园点餐系统演示 SSM框架 当今流行的“SSM组合框架”是Spring SpringMVC MyBatis的缩写&#xff0c;受到很多的追捧&#xff0c;“组合SSM框架”是强强联手、各司其职、协调互补的团队精神。web项目的框架&#xff0c;通常更简单的数据源。Spring…

【S32K 进阶之旅】 NXP S32K3 以太网 RMII 接口调试(2)

前言 前文介绍了 NXP S32K3 以太网 RMII 接口调试的开发环境搭建&#xff0c;下面开始详解软件调试步骤。没看过第一节的小伙伴请移步《【S32K 进阶之旅】 NXP S32K3 以太网 RMII 接口调试&#xff08;1&#xff09;》&#xff0c;话不多说我们直接进入正题。 lwip Stack 介绍 …

oracle 19c容器数据库数据加载和传输-----SQL*Loader(一)

目录 数据加载 &#xff08;一&#xff09;控制文件加载 1.创建用户执行sqlldr 2.创建文本文件和控制文件 3.查看表数据 4.查看log文件 &#xff08;二&#xff09;快捷方式加载 1.system用户执行 2.查看表数据 3.查看log文件 外部表 数据加载和传输的工具&#xff1…

Vue3---安装路由

介绍 在Vue3项目中安装路由 示例 第一步&#xff1a;执行npm命令安装路由 npm install vue-router4第二步&#xff1a;在项目的src文件夹下创建router子文件夹 第三步&#xff1a;创建index.js和routes.js文件&#xff0c;以下为文件的代码 //通过vue-router插件实现模板…

docker打包介绍

最近在做一个开源项目&#xff0c;遇到开发者问各种问题&#xff0c;发现都是系统和软件版本的差异引起的。于是了解了一下docker的使用&#xff0c;发现docker真是个好东东&#xff0c;基本解决了各种版本差异的问题&#xff0c;真正做到了一键部署使用。 先熟悉一下docker里…

VS2022 | 显示Unreal Engine日志

VS2022 | 显示Unreal Engine日志 视图 -> 其他窗口 -> Unreal Engine日志 视图 -> 其他窗口 -> Unreal Engine日志

ORACLE体系结构逻辑结构-表空间、段、区和数据块

实例 实例是指在内存中分配的一块共享内存区域&#xff08;SGA&#xff09;和一组后台进程&#xff08;或线程&#xff09;&#xff0c;它们用于访问和控制数据库。3实例是Oracle数据库的运行时环境&#xff0c;它是数据库的动态部分&#xff0c;它可以启动和关闭&#xff0c;…

本地部署 big-AGI

本地部署 big-AGI 1. big-AGI 介绍2. Github 地址3. 本地部署 big-AGI4. 访问 big-AGI5. 配置 API key6. 测试一下 1. big-AGI 介绍 欢迎使用 big-AGI &#x1f44b;&#xff0c;这是一款面向需要功能、形式、简单性和速度的专业人士的 GPT 应用程序。 big-AGI 由 10 个供应商…

静态网页设计——崩坏3(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; 使用技术&#xff1a;HTMLCSSJS&#xff08;静态网页设计&#xff09; 主要内容&#xff1a;对游戏崩坏3进行简单介绍。 https://www.bilib…

ATTCK视角下的信息收集:组策略信息收集

目录 什么是组策略&#xff1f; 本地组策略收集 域组策略收集 组策略存储收集 组策略对象收集 什么是组策略&#xff1f; Windows中的组策略&#xff08;Group Policy&#xff09;是一种管理和配置Windows操作系统的功能&#xff0c;它允许系统管理员对计算机和用户的行为…

Photoshop Express一款出色的照片编辑器

​【应用名称】&#xff1a;Photoshop Express ​【适用平台】&#xff1a;#Android ​【软件标签】&#xff1a;#Photoshop ​【应用版本】&#xff1a;12.1.2 ​【应用大小】&#xff1a;223MB ​【软件说明】&#xff1a;软件升级更新。一款出色的照片编辑器&#xff0c…

Xshell连接Ubuntu失败

错误&#xff1a; Xshell连接Ubuntu失败。 Connecting to 192.168.xx.xxx:22…Could not connect to 192.168.xx.xxx’ (port 22): Connection failed. 解决方案&#xff1a;边解决&#xff0c;边测试Xshell是否可以连接 1、SSH 服务未启动&#xff1a; 确保 Ubuntu 上的 S…

回车与换行的区别。CR、LF、CRLF的区别。\r \n \r\n

1.先上结论 中文英文英文缩写ASCⅡ转义ASCⅡ值系统回车Carriage ReturnCR\r13MacIntosh&#xff08;早期的Mac&#xff09;换行LinefeedLF\n10Unix/Linux/Mac OS X&#xff08;现在的Mac&#xff09;回车并换行CRLF\r\nWindows 2.详解 很长一段时间里&#xff0c;对于CRLF、C…

swing快速入门(四十二)JTree的基本创建

注释很详细&#xff0c;直接上代码 新增内容 &#x1f526;JTree的创建 &#x1f526;设置节点之间的连线 &#x1f526;设置节点之间的水平分割线 &#x1f526;设置根节点的展开折叠图标 &#x1f526;设置是否隐藏根节点 package swing31_40;import javax.swing.*; import j…

【Electron】 Vite项目 初始配置 scss

pnpm add -D sasssrc下面创建 styles/main.scss 文件 mian.ts 内引入 ./styles.scss 文件 import ./styles/main.scss 测试scss是否生效&#xff1a; styles/mian.scss :root{--mian:red; } App.vue <template><div>你好</div> </template><s…