首页 > 其他分享 >山东大学可视化2024第一次实验

山东大学可视化2024第一次实验

时间:2024-09-17 20:20:16浏览次数:3  
标签:attr data height 2024 可视化 text 山东大学 d3 append

问题:

画出美国1900与2000人口分布

介绍:

只是一个非常粗糙的可视化模板,注意后续改一下颜色什么的~

步骤:

1. 安装vscode

2.下载安装图片中插件

3.新建一个文件夹并添加到工作区

4.创建一个html文件

5.将数据粘贴到文件夹中

6.将以下代码粘贴到html文件中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>美国人口分布1900与2000</title>
    <script src="https://d3js.org/d3.v7.min.js"></script>
    <style>
        .bar {
            fill-opacity: 0.5; /*透明度*/
        }
        .bar:hover {
            fill-opacity: 1;
        }
        .axis text {
            font: 10px sans-serif; /*行字体大小*/
        }
        .legend text {
            font: 12px sans-serif; /*类别字体大小*/
        }
        .label {                
            font-size: 5px;     /*标签字体大小*/
            text-anchor: middle;
            fill: #333;
        }
    </style>
</head>
<body>
    <script>
        // 加载csv文件
        d3.csv('census2000.csv').then(data => {
            // 把各属性字符转换成数字类型
            data.forEach(d => {
                d.Sex = +d.Sex; 
                d.Year = +d.Year; 
                d.Age = +d.Age; 
                d.People = +d.People; 
            });

            // 设置SVG图表的尺寸和边缘留白
            const margin = {top: 100, right: 30, bottom: 100, left: 60},
                  width = 2000 - margin.left - margin.right,
                  height = 1000 - margin.top - margin.bottom;

            // 创建SVG容器
            const svg = d3.select('body').append('svg')
                .attr('width', width + margin.left + margin.right)
                .attr('height', height + margin.top + margin.bottom)
              .append('g')
                .attr('transform', `translate(${margin.left},${margin.top})`);

            // 设置D3.js中的X,Y轴比例尺
            const x0 = d3.scaleBand()
                .domain([...new Set(data.map(d => d.Year))])
                .range([0, width])
                .padding(0.1);

            const x1 = d3.scaleBand()
                .domain([...new Set(data.map(d => d.Age))])
                .range([0, x0.bandwidth()])
                .padding(0.05);

            // 让y轴从中间开始,设置两个y轴
            const y = d3.scaleLinear()
                .domain([0, d3.max(data, d => Math.abs(d.People))])
                .nice()
                .range([height / 2, 0]); // Male

            const yBottom = d3.scaleLinear()
                .domain([0, d3.max(data, d => Math.abs(d.People))])
                .nice()
                .range([height / 2, height]); // Female

            const color = d3.scaleOrdinal()
                .domain([1, 2])
                .range(['steelblue', 'pink']);

            // 创造柱子与定义标签
            const groups = svg.append('g')
                .selectAll('g')
                .data(d3.group(data, d => d.Year))
              .enter().append('g')
                .attr('transform', d => `translate(${x0(d[0])},0)`);

            groups.selectAll('rect')
                .data(d => d[1])
              .enter().append('rect')
                .attr('x', d => x1(d.Age))
                .attr('y', d => d.Sex === 1 ? y(d.People) : height / 2) // Male (Sex==1) bars go upward, Female (Sex==2) bars start from the middle and go downward
                .attr('width', x1.bandwidth())
                .attr('height', d => d.Sex === 1 ? height / 2 - y(d.People) : yBottom(d.People) - height / 2) // Adjust height based on Sex
                .attr('fill', d => color(d.Sex))
                .attr('class', 'bar');

            // 把标签贴到柱子上
            groups.selectAll('text')
                .data(d => d[1])
              .enter().append('text')
                .attr('x', d => x1(d.Age) + x1.bandwidth() / 2)
                .attr('y', d => d.Sex === 1 ? y(d.People) - 5 : yBottom(d.People) + 15) // Adjust text position above or below the bar
                .attr('class', 'label')
                .text(d => `${d.Age} yrs\n${Math.abs(d.People).toLocaleString()}`);

            // 添加x轴
            svg.append('g')
                .attr('class', 'x-axis')
                .attr('transform', `translate(0,${height / 2})`) // Center x-axis
                .call(d3.axisBottom(x0).tickSize(0))
              .selectAll('text')
                .attr('transform', 'rotate(-45)')
                .style('text-anchor', 'end');

            // 添加y轴
            svg.append('g')
                .attr('class', 'y-axis')
                .call(d3.axisLeft(y).ticks(5));

            svg.append('g')
                .attr('class', 'y-axis-bottom')
                .attr('transform', `translate(0,${0})`)
                .call(d3.axisLeft(yBottom).ticks(5));

            // 添加标签
            const legend = svg.append('g')
                .attr('class', 'legend')
                .attr('transform', `translate(${width - 150},0)`);

            legend.selectAll('rect')
                .data([1, 2])
              .enter().append('rect')
                .attr('x', 0)
                .attr('y', (d, i) => i * 20)
                .attr('width', 18)
                .attr('height', 18)
                .attr('fill', d => color(d));

            legend.selectAll('text')
                .data([1, 2])
              .enter().append('text')
                .attr('x', 30)
                .attr('y', (d, i) => i * 20 + 9)
                .attr('dy', '0.32em')
                .text(d => d === 1 ? 'Male' : 'Female');
        });
    </script>
</body>
</html>

7.点击图中选项

8.获得结果

标签:attr,data,height,2024,可视化,text,山东大学,d3,append
From: https://blog.csdn.net/m0_73728239/article/details/142304612

相关文章

  • 效率提升利器:11款实用且便捷的Git可视化管理工具
    前言俗话说得好“工欲善其事,必先利其器”,合理的选择和使用可视化的管理工具可以降低技术入门和使用的门槛。我们在团队开发中统一某个开发工具的使用能够大大降低沟通成本,提高协作沟通效率。今天给大家分享11款实用且便捷的Git可视化管理工具,希望对各位小伙伴有所帮助。Git是什么?Gi......
  • 2024.9.16 Python,最短的桥
    1.最短的桥:这个题我最新的代码如下:fromcollectionsimportdequeclassSolution:defshortestBridge(self,grid:List[List[int]])->int:nr=len(grid)ifnr==0:return0nc=len(grid[0])island=deque([])......
  • 2024.9.17 Python
    1.现有字典d={‘a’:24,’g’:52,’l’:12,’k’:33}请按字典中的value值进行排序?sorted(d.items(),key=lambdax:x[1])[1]换成0即可变成按照键排序2.del列表名[index]:删除指定索引的数据3.列表名.remove(数据):删除第一个出现的指定数据4.列表名.pop(index)5.列表名......
  • 基于SpringBoot 汽车信息分析与可视化系统(用户、汽车店、管理员)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我自己的网站([小蔡coding](https://xiaocaicoding.cn/))演示视频和源码展示一对一指导服务代码参考数据库参考......
  • 最强神器Typora 2024(亲测有效)| Markdown 工具推荐
    听俺讲一下大家好,我是程序员-杨胡广,今天想给大家分享一个在编写文档时的神器——Typora。相信不少小伙伴都在寻找一款既简洁又强大的Markdown编辑工具,而Typora无疑是最值得推荐的选择。当我在大学时偶然发现了它,直到今天依然觉得它无可替代。最近,我成功激活了最新版的......
  • 2024年全国大学生数学建模竞赛B题生产过程中的决策问题分析
    目录引言问题1:抽样检测方案设计问题2:生产过程中的决策决策阶段划分决策方案结果问题3:多道工序和零配件的决策生产流程决策过程问题4:基于抽样检测的重新决策动态调整次品率结论引言在2024年全国大学生数学建模竞赛B题中,企业需要对生产中的各个环节进行决策......
  • [语言月赛 202408] 蓝色的网易云
    [语言月赛202408]蓝色的网易云题目背景你也在听吗落单的孩子啊别害怕别害怕黑夜不会太长悬崖上的花让我为你摘下数一瓣落一瓣就少一朵忧伤题目描述风的歌单中共有nn......
  • [GESP202406 四级] 宝箱
    [GESP202406四级]宝箱题目描述小杨发现了nnn个宝箱,其中第iii......
  • 2024.9.1_ChatGPT镜像列表
    收集自网络,更新于2024.9.1ChatGPT国内镜像ChatGPT外国镜像......
  • 2024-09-17-生活在Kubernetes中的Springboot
    Springboot和Kubernetes中的很多功能都是重叠的,SpringCloud重合的就更多了。不过我还是希望尽可能采用微服务及服务网格这套思路,应用层做轻,SpringCloud就不用了,重合的部分也尽可能用Kubernetes的功能。配置中心Kubernetes本身提供了对配置中心的支持,不需要再使用Apollo之类的工......