首页 > 其他分享 >SolidJS-每日小知识(9/13)

SolidJS-每日小知识(9/13)

时间:2024-09-14 10:24:12浏览次数:11  
标签:13 const attr svg 知识 SolidJS 圆圈 data d3

知识介绍

  1. 在div容器中并列两个SVG元素 -> 对div容器设置display: "flex"
  2. 使用d3创建散点图
  3. 使用d3的scaleLinear函数创建x轴和y轴的比例尺
  4. 对d3的svg元素增加tooltip提示
  5. 对svg元素增加zoom功能
  6. 使用d3在svg中画线
  7. 对d3中某个元素的attr属性使用函数表达式return值

代码分析

2 使用d3创建散点图

import { createSignal, onMount } from 'solid-js';
import * as d3 from 'd3';

const ScatterPlot = () => {
  // 使用SolidJS的createSignal来创建一个响应式的数据信号
  const [data, setData] = createSignal([
    { x: 10, y: 20 },
    { x: 40, y: 90 },
    { x: 80, y: 50 },
    { x: 90, y: 10 },
    { x: 60, y: 70 },
  ]);

  // 定义一个SVG元素的引用
  let svgRef: SVGSVGElement | undefined;

  // 在组件挂载时执行的逻辑
  onMount(() => {
    // 选择SVG元素并设置其宽度和高度
    const svg = d3.select(svgRef)
      .attr('width', 1000)
      .attr('height', 700);

    // 定义边距
    const margin = { top: 20, right: 20, bottom: 30, left: 40 };
    // 计算绘图区域的宽度和高度
    const width = +svg.attr('width') - margin.left - margin.right;
    const height = +svg.attr('height') - margin.top - margin.bottom;

    // 创建x轴的比例尺
    const x = d3.scaleLinear()
      .domain([0, d3.max(data(), d => d.x) || 0]) // 设置x轴的范围
      .range([0, width]); // 设置x轴的输出范围

    // 创建y轴的比例尺
    const y = d3.scaleLinear()
      .domain([0, d3.max(data(), d => d.y) || 0]) // 设置y轴的范围
      .range([height, 0]); // 设置y轴的输出范围

    // 在SVG中添加一个g元素,并应用边距的平移变换
    const g = svg.append('g')
      .attr('transform', `translate(${margin.left},${margin.top})`);

    // 选择所有的圆圈,绑定数据,并创建新的圆圈
    g.selectAll('circle')
      .data(data()) // 绑定数据
      .enter().append('circle') // 创建新的圆圈
      .attr('cx', d => x(d.x)) // 设置圆圈的x坐标
      .attr('cy', d => y(d.y)) // 设置圆圈的y坐标
      .attr('r', 5) // 设置圆圈的半径
      .attr('fill', 'steelblue'); // 设置圆圈的颜色

    // 添加x轴
    g.append('g')
      .attr('transform', `translate(0,${height})`) // 将x轴平移到底部
      .call(d3.axisBottom(x)); // 调用d3的x轴生成函数

    // 添加y轴
    g.append('g')
      .call(d3.axisLeft(y)); // 调用d3的y轴生成函数
  });

  // 返回SVG元素
  return (
    <svg ref={svgRef}></svg>
  );
};

// 导出组件
export default ScatterPlot;

3 使用d3的scaleLinear函数创建x轴和y轴的比例尺

请注意:若数据集中在一个区间时,使用该数据中最小值和最大值作为数据域的两侧


      const x=d3.scaleLinear()
        .domain([(d3.min(xpoints(),d => d.coords[0]))-10 || 0,d3.max(xpoints(),d => d.coords[0])+10 || 0])
        .range([0,width]);

      const y=d3.scaleLinear()
        .domain([d3.min(ypoints(),d => d.coords[1])-50 || 0,d3.max(ypoints(),d => d.coords[1])+50 || 0])
        .range([height,0]);

4 对d3的svg元素增加tooltip提示

  • 核心是'mouseover'和'mouseout'事件的绑定
    // 选择所有的圆圈,绑定数据,并创建新的圆圈
    g.selectAll('circle')
      .data(data()) // 绑定数据
      .enter().append('circle') // 创建新的圆圈
      .attr('cx', d => x(d.x)) // 设置圆圈的x坐标
      .attr('cy', d => y(d.y)) // 设置圆圈的y坐标
      .attr('r', 5) // 设置圆圈的半径
      .attr('fill', 'steelblue') // 设置圆圈的颜色
      .on('mouseover', (event, d) => {
        // 鼠标悬停时显示工具提示
        const tooltip = d3.select('body')
          .append('div')
          .attr('class', 'tooltip')
          .style('position', 'absolute')
          .style('background-color', 'white')
          .style('border', '1px solid black')
          .style('padding', '5px')
          .style('pointer-events', 'none')
          .style('left', `${event.pageX + 10}px`)
          .style('top', `${event.pageY + 10}px`)
          .text('圆圈');
      })
      .on('mouseout', () => {
        // 鼠标移出时移除工具提示
        d3.select('.tooltip').remove();
      });

5 对svg元素增加zoom功能

  1. 引用d3-zoom模块
  2. 添加事件监听器
  3. 对指定svg元素绑定事件监听器
import {zoom} from 'd3-zoom';

    // 添加缩放事件监听器
    const zoomBehavior = zoom()
      .scaleExtent([0.5, 5]) // 设置缩放范围
      .on('zoom', (event) => {
        g.attr('transform', event.transform); // 应用缩放变换
      });

    yourSvgElement.call(zoomBehavior); // 将缩放行为应用到SVG元素

6 使用d3在svg中画线

    // 生成配对数据并在成对的点之间画线
    const pairedData = data().map((d, i) => ({
      blue: d,
      red: redData()[i],
    }));

    g.selectAll('line.connection')
      .data(pairedData)
      .enter().append('line')
      .attr('class', 'connection')
      .attr('x1', d => x(d.blue.x))
      .attr('y1', d => y(d.blue.y))
      .attr('x2', d => x(d.red.x))
      .attr('y2', d => y(d.red.y))
      .attr('stroke', 'black')
      .attr('stroke-width', 1);

7 对d3中某个元素的attr属性使用函数表达式return值

      g.selectAll('line.connection')
        .data(connections())
        .enter().append('line')
        .attr('class','connection')
        .attr('x1',d => x(d.X_point[0]))
        .attr('y1',d => y(d.X_point[1]))
        .attr('x2',d => x(d.Y_transformed_point[0]))
        .attr('y2',d => y(d.Y_transformed_point[1]))
        .attr('stroke-width',1)
        .attr('stroke', d => {
          // 根据条件设置不同的颜色
          if (d.matched === 1) {
            return 'green'; 
          }
          else {
            return 'orange'; // 其他情况使用红色
          }
        });

标签:13,const,attr,svg,知识,SolidJS,圆圈,data,d3
From: https://www.cnblogs.com/Frey-Li/p/18413459

相关文章

  • Java的数组(Array)和集合,面试常考知识
    Java中的数组(Array)和集合(Collection)是两种用于存储多个对象的容器,但它们在设计、功能和使用场景上存在显著差异。下面分别介绍它们的基本概念和特点。数组(Array)数组是一种固定大小的连续存储空间,用于存储相同类型的数据。数组中的每个元素可以通过索引来访问,索引通常是整......
  • Python 入门教程(3)基础知识 | 3.2、数据类型、变量与常量
    文章目录一、数据类型、变量与常量1、数据类型2、变量3、常量一、数据类型、变量与常量1、数据类型Python的数据类型可以分为不可变类型和可变类型。不可变类型包括整数、浮点数、布尔值和元组,一旦创建,其值就不能改变。可变类型包括列表、字典和集合,它们的值可以......
  • 高级前端应该掌握的Nginx相关知识 转载 404 跨域
    Nginx是在前端服务部署时是很重要的一部分,也是部署的基础,学会了通过Nginx部署前端资源,才能继续后续的一系列进阶。一、了解一点简单的Nginx知识本节内容作为基础知识,如果熟悉Nginx可以略过,如果不熟悉可以实际操作一下。现在服务器安装Nginx很简单,一般只需要两行命令即可,安装......
  • CentOs 入门必备基础知识
    CentOS(CommunityENTerpriseOperatingSystem)是一个基于RedHatEnterpriseLinux(RHEL)源代码构建的自由Linux发行版。作为一个稳定、可靠、开源的操作系统平台,CentOS广泛应用于Web服务器、数据库服务器、应用服务器等多种场景。以下是CentOS入门的必备基础知识,旨在帮助初学者......
  • .NET 9 优化,抢先体验 C# 13 新特性
    合集-.NET基础知识(3) 1..NET9优化,抢先体验C#13新特性08-202.《黑神话:悟空》神话再现,虚幻引擎与Unity/C#谁更强?08-213..NET6.0+WPF使用Prism框架实现导航09-11收起 阅读目录前言新特性总结下载地址参考链接最后前言微软即将在2024年1......
  • 南沙csp-j/s一对一家教陈老师解题:1318:【例5.3】自然数的拆分
    ​题目描述】任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。当n=7共14种拆分方法:7=1+1+1+1+1+1+17=1+1+1+1+1+27=1+1+1+1+37=1+1+1+2+27=1+1+1+47=1+1+2+37=1+1+57=1+2+2+27=1+2+47=1+3+37=1+67=2+2+37=2+57=3+4total=14【输入】输入n。......
  • PbootCMS访问页面出现PHP Fatal error: Allowed memory size of 13421
    当访问PbootCMS页面时出现 PHPFatalerror:Allowedmemorysizeof13421 的错误,通常是由于PHP的内存限制过低导致的。这个错误表明PHP脚本在运行过程中耗尽了分配给它的内存。解决方案增加PHP内存限制检查PHP配置文件(php.ini)在脚本中动态增加内存限制详......
  • Centos入门必备基础知识
    CentOS(CommunityENTerpriseOperatingSystem)是一个开源的Linux发行版,基于RedHatEnterpriseLinux(RHEL)源代码构建。以下是CentOS入门必备的一些基础知识:前言本文由浪浪云赞助发布,我们特别感谢浪浪云的大力支持。浪浪云是业内领先的云服务提供商,凭借其卓越的性能和稳......
  • 第一章 网页的基础知识
    1.1认识网页和网站1.1.1网页、网站网页和网站都是互联网的基本组成部分,但它们的定义稍有不同:1.网页(Webpage):  -网页是通过浏览器访问的单一文档,类似于一张电子页面。网页可以包含文本、图片、视频、超链接等内容。  -每个网页都有唯一的URL(统一资源定位符),例如h......
  • C#笔记13 线程同步概念及其实现,详解lock,Monitor,Mutex代码用法
    同步的概念在我们学会在C#中使用线程之后,我们拥有了把一个程序中的不同代码段在不同线程中运行的能力,可以说此时我们已经能够做到让他们分别执行,异步执行。对于我们的桌面端程序,使用多线程可以让我们在后台进行操作的时候保持用户界面的响应。对于服务器应用程序,多线程可以......