「数据可视化 D3系列」入门第八章:动画效果详解(让图表动起来)
动画效果详解
- 一、D3.js动画核心API
- 1. d3.transition()
- 2. transition.duration()
- 3. transition.delay()
- 4. 其他重要API
- 二、动画实现原理
- 三、完整动画示例解析
- 1. 柱状图生长动画
- 2. 文本跟随动画
- 四、动画效果优化技巧
- 1. 缓动函数选择:
- 2. 组合动画:
- 3. 动画事件监听:
- 4. 性能优化:
- 五、进阶动画技术
- 1. 自定义插值器
- 2. 路径动画
- 3. 交错动画
- 六、注意事项小结
- 小结
- 核心要点
- 实践建议
- 下章预告:交互式操作
在数据可视化中,动画效果不仅能增强视觉吸引力,还能帮助观众更好地理解数据变化过程。本章将详细介绍如何使用D3.js为图表添加流畅的动画效果。
一、D3.js动画核心API
1. d3.transition()
这是D3动画系统的基础,用于创建一个过渡效果。它会返回一个过渡对象,可以在该对象上链式调用其他过渡方法。
d3.selectAll("rect").transition() // 开始过渡.attr("width", 100); // 目标属性值
2. transition.duration()
设置动画持续时间(毫秒)。持续时间越长,动画越慢。
.duration(1000) // 1秒动画
3. transition.delay()
设置动画延迟时间(毫秒)。可以为每个元素设置不同的延迟时间。
.delay(function(d, i) {return i * 100; // 每个元素延迟100ms
})
4. 其他重要API
-
transition.ease() - 设置缓动函数(如
d3.easeLinear
、d3.easeBounce
等) -
transition.on() - 监听过渡事件(“start”、“end”、“interrupt”)
-
transition.attrTween() - 自定义属性插值器
二、动画实现原理
D3的过渡系统基于插值原理工作:
- 记录初始状态
- 指定目标状态
- 在指定时间内平滑过渡
三、完整动画示例解析
1. 柱状图生长动画
👇 完整代码:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>柱状图生长动画</title><script src="https://d3js.org/d3.v7.min.js"></script><style>.bar {fill: #4CAF50;transition: fill 0.3s;}.bar:hover {fill: #FF5722;}.axis path,.axis line {fill: none;stroke: #333;shape-rendering: crispEdges;}.axis text {font-family: Arial;font-size: 12px;}.label {font-size: 12px;font-weight: bold;fill: #333;}</style>
</head>
<body><svg width="600" height="400"></svg><script>// 数据集const dataset = [90, 75, 12, 36, 54, 88, 24, 66];const margin = {top: 30, right: 30, bottom: 50, left: 50};const width = 600 - margin.left - margin.right;const height = 400 - margin.top - margin.bottom;// 创建SVG容器const svg = d3.select("svg").attr("width", width + margin.left + margin.right).attr("height", height + margin.top + margin.bottom).append("g").attr("transform", `translate(${margin.left},${margin.top})`);// 创建比例尺const xScale = d3.scaleBand().domain(d3.range(dataset.length)).range([0, width]).padding(0.2);const yScale = d3.scaleLinear().domain([0, d3.max(dataset)]).range([height, 0]);// 创建坐标轴const xAxis = d3.axisBottom(xScale).tickFormat(d => `项目 ${+d + 1}`);const yAxis = d3.axisLeft(yScale);// 添加X轴svg.append("g").attr("class", "axis").attr("transform", `translate(0,${height})`).call(xAxis);// 添加Y轴svg.append("g").attr("class", "axis").call(yAxis);// 创建柱状图分组const bars = svg.selectAll(".bar").data(dataset).enter().append("g");// 柱状图生长动画bars.append("rect").attr("class", "bar").attr("x", (d, i) => xScale(i)).attr("y", height) // 初始位置在底部.attr("width", xScale.bandwidth()).attr("height", 0) // 初始高度为0.attr("rx", 3) // 圆角.attr("ry", 3).transition().duration(1500).delay((d, i) => i * 200) // 每个柱子延迟200ms.ease(d3.easeElasticOut) // 弹性效果.attr("y", d => yScale(d)).attr("height", d => height - yScale(d));// 添加数据标签bars.append("text").attr("class", "label").attr("x", (d, i) => xScale(i) + xScale.bandwidth() / 2).attr("y", height + 20) // 初始位置在底部下方.attr("text-anchor", "middle").text(d => d).transition().duration(1500).delay((d, i) => i * 200).attr("y", d => yScale(d) - 5); // 最终位置在柱子上方</script>
</body>
</html>
👇 效果展示:
该示例演示了柱状图的生长动画,包括柱子从底部向上生长和标签跟随移动的效果
2. 文本跟随动画
👇 完整代码:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>文本跟随动画</title><script src="https://d3js.org/d3.v7.min.js"></script><style>.dot {fill: steelblue;stroke: #fff;stroke-width: 2px;}.label {font-family: Arial;font-size: 12px;fill: #333;opacity: 0; /* 初始不可见 */}.line {fill: none;stroke: steelblue;stroke-width: 2px;}.axis path,.axis line {fill: none;stroke: #999;shape-rendering: crispEdges;}.axis text {font-family: Arial;font-size: 11px;}</style>
</head>
<body><svg width="600" height="400"></svg><script>// 时间序列数据const timeData = [{date: new Date(2023, 0, 1), value: 30},{date: new Date(2023, 1, 1), value: 40},{date: new Date(2023, 2, 1), value: 25},{date: new Date(2023, 3, 1), value: 35},{date: new Date(2023, 4, 1), value: 45},{date: new Date(2023, 5, 1), value: 30},{date: new Date(2023, 6, 1), value: 50},{date: new Date(2023, 7, 1), value: 42}];// 设置边距和尺寸const margin = {top: 40, right: 40, bottom: 60, left: 60};const width = 600 - margin.left - margin.right;const height = 400 - margin.top - margin.bottom;// 创建SVG容器const svg = d3.select("svg").attr("width", width + margin.left + margin.right).attr("height", height + margin.top + margin.bottom).append("g").attr("transform", `translate(${margin.left},${margin.top})`);// 创建比例尺const xScale = d3.scaleTime().domain(d3.extent(timeData, d => d.date)).range([0, width]);const yScale = d3.scaleLinear().domain([0, d3.max(timeData, d => d.value) * 1.1]).range([height, 0]);// 创建折线生成器const line = d3.line().x(d => xScale(d.date)).y(d => yScale(d.value));// 添加折线路径(初始不可见)svg.append("path").datum(timeData).attr("class", "line").attr("d", line).attr("stroke-dasharray", function() { return this.getTotalLength(); }).attr("stroke-dashoffset", function() { return this.getTotalLength(); }).transition().duration(2000).attr("stroke-dashoffset", 0);// 创建数据点分组const dots = svg.selectAll(".dot-group").data(timeData).enter().append("g").attr("class", "dot-group");// 添加数据点dots.append("circle").attr("class", "dot").attr("cx", d => xScale(d.date)).attr("cy", height) // 初始位置在底部.attr("r", 5).transition().duration(2000).delay((d, i) => i * 300).ease(d3.easeBounceOut).attr("cy", d => yScale(d.value));// 添加数据标签(跟随动画)dots.append("text").attr("class", "label").attr("x", d => xScale(d.date)).attr("y", height) // 初始位置在底部.attr("dy", -10).attr("text-anchor", "middle").text(d => d.value).transition().duration(2000).delay((d, i) => i * 300).attr("y", d => yScale(d.value)).attr("opacity", 1);// 添加坐标轴const xAxis = d3.axisBottom(xScale).ticks(d3.timeMonth.every(1)).tickFormat(d3.timeFormat("%b %Y"));const yAxis = d3.axisLeft(yScale).ticks(5);svg.append("g").attr("class", "axis").attr("transform", `translate(0,${height})`).call(xAxis).selectAll("text").attr("transform", "rotate(-45)").attr("dx", "-.8em").attr("dy", ".15em").style("text-anchor", "end");svg.append("g").attr("class", "axis").call(yAxis);// 添加图表标题svg.append("text").attr("x", width / 2).attr("y", 0 - (margin.top / 2)).attr("text-anchor", "middle").style("font-size", "16px").style("font-weight", "bold").text("2023年月度数据趋势");</script>
</body>
</html>
👇 效果展示:
该示例展示了折线图的绘制动画、圆点的弹跳效果以及文本标签的跟随动画
四、动画效果优化技巧
1. 缓动函数选择:
.ease(d3.easeElasticOut) // 弹性效果
2. 组合动画:
.transition().attr("x", 100)
.transition() // 链式调用实现连续动画.attr("y", 200)
3. 动画事件监听:
.on("end", function() {console.log("动画结束");
})
4. 性能优化:
-
避免过多同时运行的动画
-
使用
transform
代替left/top
等属性 -
对复杂图形考虑使用CSS动画
五、进阶动画技术
1. 自定义插值器
.transition()
.attrTween("fill", function() {return d3.interpolateRgb("red", "blue");
});
2. 路径动画
path.transition().duration(2000).attrTween("d", pathTween); // 自定义路径插值
3. 交错动画
.delay(function(d, i) {return Math.random() * 1000; // 随机延迟
})
六、注意事项小结
- 初始状态必须明确: 确保动画开始前设置了明确的初始属性
- 坐标系考虑: SVG的y轴向下增长,动画方向要注意
- 浏览器兼容性: 复杂动画在不同浏览器可能有性能差异
- 无障碍访问: 为动画提供适当的ARIA标签和替代内容
小结
核心要点
1. 三大基础API:
transition()
启动动画过渡duration()
控制动画时长(毫秒)delay()
设置延迟启动时间
2. 实现流程:
graph LRA[设置初始状态] --> B[调用transition()]B --> C[定义目标状态]C --> D[配置动画参数]
3. 四种进阶控制:
- 缓动函数
.ease()
- 事件监听
.on()
- 属性插值
.attrTween()
- 路径动画
pathTween()
实践建议
1. 设计原则:
- 动画时长控制在200-1000ms
- 使用交错延迟增强视觉效果
- 保持动画目的性(数据强调/状态过渡)
2. 性能优化:
- 优先使用transform属性
- 复杂动画考虑CSS混合实现
- 移动端减少同时运行的动画数量
3. 常见模式:
// 典型生长动画
.attr('height', 0) // 初始状态
.transition()
.duration(500)
.attr('height', d => height - yScale(d)) // 最终状态
下章预告:交互式操作
相关文章:
「数据可视化 D3系列」入门第八章:动画效果详解(让图表动起来)
动画效果详解 一、D3.js动画核心API1. d3.transition()2. transition.duration()3. transition.delay()4. 其他重要API 二、动画实现原理三、完整动画示例解析1. 柱状图生长动画2. 文本跟随动画 四、动画效果优化技巧1. 缓动函数选择:2. 组合动画:3. 动画…...
index: 自动化浏览器智能体
GitHub:https://github.com/lmnr-ai/index 更多AI开源软件:https://www.aiinn.cn/ 在做浏览器自动化脚本时,我们常常需要编写大量代码来处理复杂的网页交互,不仅耗时耗力,还难以调试和优化,要是出错更是难以…...
网页端调用本地应用打开本地文件(PDF、Word、excel、PPT)
一、背景原因 根据浏览器的安全策略,在网页端无法直接打开本地文件,所以需要开发者曲线救国。 二、实现步骤 前期准备: 确保已安装好可以打开文件的应用软件,如,WPS; 把要打开的文件统一放在一个文件夹&am…...
如何批量在多个 Word 文档末尾添加广告页面
Word是我们日常使用非常频繁的文档编辑软件,凭借其强大的文本处理功能,如文字输入、格式设置、段落排版、图片插入等,可以帮助我们轻松创建专业且美观的文档。不过呢当我们需要将这些文档分享给他人时,往往需要在每个文档的末尾添…...
JavaScript原生实现简单虚拟列表
旧笔记,最近使用时做了点新优化,之前只发在了个人博客上 地址:JavaScript原生实现简单虚拟列表 背景 在公司项目中,需要给商品配置大量的属性值,可能其中一个属性的值数量就有成百上千条。 一个商品会有很多属性&…...
安心联车辆管理平台应用前景分析
安心联车辆管理平台凭借其技术创新与行业适配能力,展现出广阔的应用前景。以下从技术驱动、行业覆盖、实际效益、市场策略及未来潜力五个维度进行分析: 一、技术驱动的核心竞争力 高精度定位与多传感器融合 安心联采用北斗/GPS双模定位技术,实…...
力扣每日打卡 2176. 统计数组中相等且可以被整除的数对(简单)
力扣 2176. 统计数组中相等且可以被整除的数对 简单 前言一、题目内容二、解题方法1. 暴力解法2.官方题解官方也是暴力解法 前言 这是刷算法题的第十三天,用到的语言是JS 题目:力扣 2176. 统计数组中相等且可以被整除的数对(简单) 一、题目内容 给你一…...
OpenStack Yoga版安装笔记(22)Swift笔记20250418
一、官方文档 https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html#https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html# 二、对象存储简介(Introduction to Object Storage) OpenStack 对象存储&a…...
Linux 线程互斥
目录 Linux线程互斥 进程线程间的互斥相关背景概念 互斥量的接口 初始化互斥量 互斥量加锁和解锁 锁的封装 编辑 互斥量加锁的非阻塞版本 互斥量实现原理探究 可重入VS线程安全 概念 常见的线程不安全的情况 常见的线程安全的情况 常见的不可重入的情况 常见的…...
webgl入门实例-12WebGL 投影矩阵 (Projection Matrix)基本概念
WebGL 投影矩阵 (Projection Matrix) 投影矩阵是将3D场景从视图空间(相机空间)转换到裁剪空间的关键矩阵,它决定了3D物体如何投影到2D屏幕上。 投影矩阵的作用 定义3D空间到2D平面的映射方式确定视景体(view frustum)的形状和范围实现透视效果(近大远小)或正交投…...
《实战AI智能体》——邮件转工单的AI自动化
💡 为什么使用 邮件转工单(AI自动化)模板 想象一下,您的邮箱像是一个繁忙的宇宙港口,每封邮件都是一艘载着信息的飞船。当这些飞船抵达时,我们的自动化系统就像是一位高效的宇宙调度员,迅速将每艘飞船(邮件)转化为一艘艘探索号(工单),并为它们分配勇敢的宇航员(…...
YOLOv8 Bug 及解决方案汇总 【2024.1.24更新】【环境安装】【训练 断点续训】OMPError / KeyError
YOLOv8 Bug 及解决方案汇总:深入解析与应对 引言 YOLOv8作为一款高性能的目标检测算法,在实际应用中难免会遇到各种各样的问题。本文将对YOLOv8常见的Bug进行汇总,并提供相应的解决方案,旨在帮助开发者更好地使用和优化YOLOv8。…...
健康养生:开启活力生活新篇章
在当代社会,熬夜加班、久坐不动、外卖快餐成为许多人的生活常态,随之而来的是各种亚健康问题。想要摆脱身体的疲惫与不适,健康养生迫在眉睫,它是重获活力、拥抱美好生活的关键。 应对不良饮食习惯带来的健康隐患,饮…...
Yocto项目实战教程 · 第4章:4.3小节-层
🔍 B站相应的视频教程: 📌 Yocto项目实战教程-第4章-4.3小节-层 记得三连,标为原始粉丝。 在 Yocto 项目中,元数据(Metadata)不仅是构建系统的核心驱动力,更是实现高度定制化、可移植…...
小红书爬虫,小红书api,小红书数据挖掘
背景: 小红书(Xiaohongshu)是一款结合社交、购物和内容分享的移动应用,近年来在中国以及全球范围内拥有大量的用户群体。小红书上的内容包括用户的消费体验、生活方式、旅行分享、时尚搭配等。通过这些内容,用户可以了…...
选择 iOS 按键精灵无根有根越狱辅助工具的理由
节省成本 使用 iOS 按键精灵,每台设备可为你减少 5 - 10 元的签名成本。对于需要使用大量脚本或者多设备操作的用户来说,长期下来能够节省一笔可观的费用。 不断更新优化 按键精灵团队始终致力于产品的更新与优化。新版本不断增加新功能&#x…...
电脑里的AI帮手:Open Interpreter智能助手食用指南
Open Interpreter简介如下: interpreter是一个使用python开发的命令行工具,可以让你在终端中使用类似AI对话的方式,只需简单输入指令要求,即可自动编写程序、执行代码,实现各种自动化操作interpreter有自动检测输出结…...
Windows软件界面分析软件-控件识别工具
Inspect.exe 这是微软提供的一款 UI 自动化检查工具,主要用于开发和测试应用程序的辅助功能(Accessibility)及 UI 自动化。 主要功能: 查看界面元素的属性(如名称、角色、状态、位置等)。 支持 UIA&…...
iOS 冷启动时间监控:启动起点有哪些选择?
⏱️ iOS 冷启动时间监控:启动起点有哪些选择? 作者:侯仕奇 来源:sqi.io 在监控 iOS 冷启动性能时,一个关键问题是:如何精确记录 App 冷启动的开始时间? 本文将对不同的“冷启动起点”监控方式…...
MacOS怎么显示隐藏文件
现象描述: 有些文件比如git的配置文件会作为隐藏文件存在。 Mac os默认是不显示隐藏文件的。 但是很多场合下我们需要查看或者编辑这些隐藏文件。 解决方法: 如下图所示,在Finder中使用Shift⇧Command⌘.快捷键 显示和隐藏都是同样的按…...
苹果紧急修复两个已被利用的iOS漏洞,用于针对特定目标的复杂攻击
苹果公司已发布iOS 18.4.1和iPadOS 18.4.1更新,修复两个被用于针对特定iPhone用户实施高度定向、复杂攻击的关键零日漏洞。 这两个漏洞存在于CoreAudio和RPAC组件中,攻击者可利用它们在受影响设备上执行任意代码或绕过安全保护机制。 两个正被活跃利用…...
8.观察者模式:思考与解读
原文地址:观察者模式:思考与解读 更多内容请关注:7.深入思考与解读设计模式 引言 在开发软件时,系统的某些状态可能会发生变化,而你希望这些变化能够自动通知到依赖它们的其他模块。你是否曾经遇到过,系统中某个对象…...
13.编码器的结构
从入门AI到手写Transformer-13.编码器的结构 13.编码器的结构代码 整理自视频 老袁不说话 。 13.编码器的结构 T r a n s f o r m e r E n c o d e r : 输入 [ b , n ] TransformerEncoder:输入[b,n] TransformerEncoder:输入[b,n] E m b e d d i n g : − > [ b , n , d ]…...
java 设计模式之模板方法模式
简介 模板方法模式:定义一个算法的基本流程,将一些步骤延迟到子类中实现。模板方法模式可以提高代码的复用性, 模板方法中包含的角色: 抽象类:负责给出一个算法的基本流程,它由一个模板方法和若干个基本…...
C++面向对象
面向对象的思想 面向过程: 根据程序的执行过程,来设计软件的所有细节。面向过程的缺点:开发大型项目时,越来越难以把控,甚至失去控制。后期维护、更新成本很大。解决方案:使用面向对象。 什么是面向对象…...
守护进程编程
目录 一、守护进程 1.1 守护进程概述 1.2 守护进程的功能及特点 1.2.1 守护进程的功能 1.2.2 守护进程的特点 1.3 主要过程 1.4 阿里云服务器编程实现守护进程 1.4.1 daemon 命令 1.4.2 nohup命令 1.4.3 fork()编程实现 1.5 在树莓派中通过三种方式创建守护进程 1.5…...
【Spring Boot 源码学习】深入 ConfigurableEnvironment 的初始化过程
《Spring Boot 源码学习系列》 深入 ConfigurableEnvironment 的初始化过程 一、引言二、配置环境的初始化2.1 源码总览2.2 prepareEnvironment 方法2.2.1 获取或创建可配置环境2.2.2 配置环境并设置参数2.2.3 将配置属性源附加到环境中2.2.4 触发环境准备事件2.2.5 将DefaultP…...
若依集成BladeX单点登录的令牌管理与api请求流程
目录 概述系统架构单点登录流程令牌管理机制接口调用流程关键代码实现数据结构安全性考虑常见问题与解决 概述 本文档详细说明若依系统如何实现与BladeX的单点登录集成,包括令牌管理和接口调用的完整流程。整个集成采用基于OAuth2的授权码流程,允许用…...
54常用控件_QLCDNumber的属性
目录 代码示例: 倒计时 QLCDNumer 是一个专门用来显示数字的控件.类似于“老式计算器”的效果 核心属性 属性 说明 intValue QLCDNumber显示的数字值(int). value QLCDNumber 显示的数字值(double). 和intValue是联动的. 例如给value设为1.5, intValue的值就是2. 另外&a…...
IcePlayer音乐播放器项目分析及学习指南
IcePlayer音乐播放器项目分析及学习指南 项目概述 IcePlayer是一个基于Qt5框架开发的音乐播放器应用程序,使用Visual Studio 2013作为开发环境。该项目实现了音乐播放、歌词显示、专辑图片获取等功能,展现了桌面应用程序开发的核心技术和设计思想。 技…...
【ELF2学习板】Ne10进行FFT测试
目录 引言 Ne10简介 交叉编译Ne10 测试 测试程序 测试结果 结语 引言 在上一篇博文介绍了FFTW在ELF2开发板的测试。其中我们提到--enable-neon选项在aarch64平台下无法启用。接下来测试一个专门用NEON指令优化的FFT库Ne10。 Ne10简介 NE10 是一个面向 ARM 架构的开源数…...
Android device PCO (protocol configuration options) intro
术语 英文缩写英文全称中文PCOprotocol configuration options协议配置选项RILradio interface layer 无线电接口层PCO介绍 PCO(Protocol Configuration Options) 是 3GPP 标准协议(TS 24.008)中定义的核心概念,用于在 LTE/5G 网络建立 PDN 连接时传递动态配置参数(如 D…...
HAL库通过FATFS和SDIO+DMA写入SD卡数据错误
HAL库F4版本 1.28.1 最近在使用HAL库配置SDIODMA并通过FATFS向SD卡写入数据,但是发现写入的数据经常有错误,不是少了一部分就是多了一部分,写入的数据为csv格式,通过循环向缓冲区写入"100100,12.345678\r\n"数据来观察问…...
RK Android11 修改默认语言为法语及时区为巴黎时间
文章目录 1、需求2、解决 1、需求 客户要求将系统默认语言改为法语,系统默认时区改为巴黎时间(也称为欧洲中部时间)2、解决 --- a/build/make/tools/buildinfo.shb/build/make/tools/buildinfo.sh-46,7 46,7 echo "ro.product.cpu.ab…...
文件上传Ⅰ
文件上传--前后端验证 不让上传php,所以要绕过它 遇到网站可能不是php语言,会是java或者python语言等,它只能解析网站本身的语言,那我们就上传符合网站语言识别的格式(它能解析什么后缀,就上传什么后缀)&…...
IntelliJ IDEA clean git password
IntelliJ IDEA clean git password 清除git密码 方法一:(这个要特别注意啊,恢复默认设置,你的插件什么要重新下载了) File->Manage IDE Settings->Restore Default Settings以恢复IDEA的默认设置(可选); 清空…...
【C++指南】哈希驱动的封装:如何让unordered_map/set飞得更快更稳?【上】
🌟 各位看官好,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 💬 注意:本文在哈希函数中主讲除法散列法,乘法散列法、全域散列法、双重散列等自行了解。 &#x…...
论坛测试报告
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
人脸扫描黑科技:多相机人脸扫描设备,打造你的专属数字分身
随着科技的迅猛发展,人脸扫描这个词已经并不陌生,通过人脸扫描设备制作超写实人脸可以为影视制作打造逼真角色、提升游戏沉浸感,还能助力教育机构等领域生产数字人以丰富教学资源,还在安防、身份识别等领域发挥关键作用࿰…...
统计字符串每个字符出现频率
输入一个字符串,统计每个字符的出现频率,然后判断最大频率与最小频率的差值 cnt: 如果 cnt 是质数,则输出 "Lucky Word" 和 差值; 否则输出 "No Answer" 和 0。 #include <bits/stdc.h> u…...
SQL-子查询
SQL子查询是嵌套在另一个SQL查询中的SELECT语句,将内部查询的结果作为外部查询的条件或者数据源。 核心概念 子查询是一个完整的SELECT语句,可以嵌入到其他查询的where, from, SELECT, HAVING等子句中,用于动态生成条件或临时数据集。 例如…...
Python(21)Python日期时间完全指南:从基础到实战注意事项
目录 一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法则 三、企业级应用案例3.1 全球日志分析系统3.2 金融交易时间校验 四、六大核心注意事项1. 时区意识优先原则2. 时间戳的精度陷阱3. 夏令时转换三步骤4. 日期格式化安全指南5. 性…...
【医学影像 AI】早产儿视网膜病变国际分类(第三版)
【医学影像 AI】早产儿视网膜病变国际分类(第三版) 0. 论文简介0.1 基本信息0.2 摘要0.3 缩略语0.4 ICROP3的关键内容总结 1. 引言2. 血管化位置:区域(ZONE)3. 加重病变与前加重病变4. 急性病变分期(阶段1-…...
焊接机器人的设计
一、引言 随着制造业的发展,焊接工艺在各个领域得到广泛应用。焊接机器人具有焊接质量高、效率高、劳动强度低等优点,能够满足现代制造业对焊接生产的要求。设计一款性能优良的焊接机器人,对于提高焊接生产的自动化水平和产品质量具有重要意…...
SQL SERVER里面也可以插入存储过程,操作TCP,WEBSOCKET吗?数据发生改变时用于通知客户端
SQL SERVER里面也可以插入存储过程,操作TCP,WEBSOCKET吗?数据发生改变时用于通知客户端SQL存储过程入门🔥 - 人生得E不早朝 深度思考完成 用时28秒 好的,用户的问题是:SQL Server里面是否可以通过插入存储过程来操作TCP或WebSocket&…...
利用 DeepSeek-R1 模型和计算机视觉微调模型实现马铃薯叶片疾病识别和分类
一、需求背景 在农业现代化进程中,作物健康监测对于保障粮食安全和提高农业生产效率起着举足轻重的作用。马铃薯作为全球重要的粮食作物之一,其种植面积广泛,产量和质量直接关系到众多农户的生计以及食品供应链的稳定。准确、快速地鉴别马铃…...
文章记单词 | 第39篇(六级)
一,单词释义 themselves [əmˈselvz] pron. 他们自己;她们自己;它们自己;(用以加强语气)他们亲自,她们亲自,它们亲自;(反身代词) 指某人或某物本…...
深入理解C++中string的深浅拷贝
目录 一、引言 二、浅拷贝与深拷贝的基本概念 2.1 浅拷贝 2.2 深拷贝 在C 中, string 类的深浅拷贝有着重要的区别。 浅拷贝 深拷贝 string 类中的其他构造函数及操作 resize 构造 构造(赋值构造) 构造(拼接构造…...
C++ 常用的智能指针
C 智能指针 一、智能指针类型概览 C 标准库提供以下智能指针(需包含头文件 <memory>): unique_ptr:独占所有权,不可复制, 可移动shared_ptr:共享所有权,用于引用计数weak_pt…...
【AI部署】腾讯云GPU-常见故障—SadTalker的AI数字人视频—未来之窗超算中心 tb-lightly
ERROR: Could not find a version that satisfies the requirement tb-nightly (from torchreid) (from versions: none) ERROR: No matching distribution found for tb-nightly 解决 阿里云 python -m pip install tb-nightly -i https://mirrors.aliyun.com/pypi/simple …...