实验二:D3数据可视化基础
实验目的:
熟悉 D3 数据可视化的使用方法。
实验原理:
D3 的全称是(Data-Driven Documents),是一个被数据驱动的文档,其实就是 一个 JavaScript 的函数库,使用它主要是用来做数据可视化的。本次实践主要介绍D3一些最基本的使用方法,以及生成一些比较简单的图表。
实验环境:
实验步骤:
<html>
<head>
<meta charset="utf-8">
<title>完整的柱形图</title>
<style>
/* 设置柱形图的颜色 */
.MyRect {
fill: green; /* 修改颜色为绿色 */
}
/* 设置文字的样式 */
.MyText {
font-size: 12px;
text-anchor: middle;
fill: blue; /* 文字颜色为蓝色 */
}
/* 设置坐标轴的样式 */
.axis path,
.axis line {
fill: none;
stroke: black;
shape-rendering: crispEdges;
}
.axis text {
font-family: sans-serif;
font-size: 11px;
}
</style>
</head>
<body>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script>
// 画布大小
var width = 400;
var height = 400; // 在 body 里添加一个 SVG 画布
var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height); // 画布周边的空白
var padding = {left: 30, right: 30, top: 20, bottom: 20};
3、定义数据和比例尺
在添加画布的代码后面加入以下代码。
// 定义一个数组
var dataset = [16, 23, 54, 46, 33, 24, 19, 37, 9]; // x 轴的比例尺
var xScale = d3.scale.ordinal()
.domain(d3.range(dataset.length))
.rangeRoundBands([0, width - padding.left - padding.right], 0.1); // y 轴的比例尺
var yScale = d3.scale.linear()
.domain([0, d3.max(dataset)])
.range([height - padding.top - padding.bottom, 0]);
4、定义坐标轴
// 定义 x 轴
var xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom"); // 定义 y 轴
var yAxis = d3.svg.axis()
.scale(yScale)
.orient("left");
5、添加矩形和文字元素
// 添加矩形元素
var rects = svg.selectAll(".MyRect")
.data(dataset)
.enter()
.append("rect")
.attr("class", "MyRect")
.attr("transform", "translate(" + padding.left + "," + padding.top + ")")
.attr("x", function(d, i) {
return xScale(i) + rectPadding / 2;
})
.attr("y", function(d) {
return yScale(d);
})
.attr("width", xScale.rangeBand() - rectPadding)
.attr("height", function(d) {
return height - padding.top - padding.bottom - yScale(d);
});
// 添加文字元素
var texts = svg.selectAll(".MyText")
.data(dataset)
.enter()
.append("text")
.attr("class", "MyText")
.attr("transform", "translate(" + padding.left + "," + padding.top + ")")
.attr("x", function(d, i) {
return xScale(i) + rectPadding / 2;
})
.attr("y", function(d) {
return yScale(d);
})
.attr("dx", function() {
return (xScale.rangeBand() - rectPadding) / 2;
})
.attr("dy", function(d) {
return 20;
})
.text(function(d) {
return d;
});
6.添加坐标轴的元素
// 添加 x 轴
svg.append("g")
.attr("class", "axis")
.attr("transform", "translate(" + padding.left + "," + (height - padding.bottom) + ")")
.call(xAxis); // 添加 y 轴
svg.append("g")
.attr("class", "axis")
.attr("transform", "translate(" + padding.left + "," + padding.top + ")")
.call(yAxis);
</script>
</body>
</html>
最后运行结果如下图所示:

题目二:制作动态的柱形图
// 添加矩形元素
var rects = svg.selectAll(".MyRect")
.data(dataset)
.enter()
.append("rect")
.attr("class", "MyRect")
.attr("transform", "translate(" + padding.left + "," + padding.top + ")")
.attr("x", function(d, i) {
return xScale(i) + rectPadding / 2;
})
.attr("width",xScale.rangeBand() - rectPadding)
.attr("y", function(d) {
var min = yScale.domain()[0];
return yScale(min);
})
.attr("height", function(d) {
return 0;
});
.transition()
.delay(function(d,i){
return i * 200;
})
.duration(2000)
.ease("bounce")
.attr("y",function(d){
return yScale(d);
})
.attr("height",function(d){
return height - padding.top - padding.bottom - yScale(d);
}); // 添加文字元素
var texts = svg.selectAll(".MyText")
.data(dataset)
.enter()
.append("text")
.attr("class", "MyText")
.attr("transform", "translate(" + padding.left + "," + padding.top + ")")
.attr("x", function(d, i) {
return xScale(i) + rectPadding / 2;
})
.attr("dx", function() {
return (xScale.rangeBand() - rectPadding) / 2;
})
.attr("dy", function(d) {
return 20;
})
.text(function(d) {
return d;
});
.attr("y", function(d) {
var min = yScale.domain()[0];
return yScale(min);
})
.transition()
.delay(function(d,i){
return i * 200;
})
.duration(2000)
.ease("bounce")
.attr("y",function(d){
return yScale(d);
})

<html>
<head>
<meta charset="utf-8">
<title>饼状图</title>
</head>
</style>
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script>
// 画布大小
var width = 400;
var height = 400;
// 数据集
var dataset = [11, 6, 34, 27, 13, 9];
// 创建 SVG 画布
var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
// 定义一个布局
var pie = d3.layout.pie();
var piedata = pie(dataset);
首先定义一个布局,返回值赋給变量 pie,此时 pie 可以当做函数使用,接着将数组 dataset 作为 pie()的参数,返回值给 piedata。
// 定义弧生成器
var outerRadius = 150; // 外半径
var innerRadius = 0; // 内半径,为 0 则中间没有空白 var arc = d3.svg.arc()
.innerRadius(innerRadius)
.outerRadius(outerRadius);
// 添加分组元素,每个分组对应一段弧
var arcs = svg.selectAll("g")
.data(piedata)
.enter()
.append("g")
.attr("transform", "translate(" + (width / 2) + "," + (height / 2) + ")");
// 添加路径元素,绘制弧
arcs.append("path")
.attr("fill", function(d, i) {
return color(i); // 根据索引设置颜色
})
.attr("d", function(d) {
return arc(d); // 使用弧生成器生成路径
})
.outerRadius(outerRadius);
// 定义颜色比例尺
var color = d3.scale.category10();
var arcs = svg.selectAll("g")
// 添加文本元素,显示数据值
arcs.append("text")
.attr("transform", function(d) {
return "translate(" + arc.centroid(d) + ")"; // 将文本定位到弧的中心
})
.attr("text-anchor", "middle")
.text(function(d) {
return d.data; // 显示数据值
}); // 打印数据集和转换后的数据到控制台
console.log("原始数据集:", dataset);
console.log("转换后的数据:", piedata);
</script>
</body>
</html>

// 添加路径元素,绘制弧
arcs.append("path")
.attr("fill", function(d, i) {
return color(i); // 根据索引设置颜色
})
.attr("d", function(d) {
return arc(d); // 使用弧生成器生成路径
})
.on("mouseover", function(d, i) {
d3.select(this)
.attr("fill", "yellow"); // 鼠标悬停时变为黄色
})
.on("mouseout", function(d, i) {
d3.select(this)
.transition()
.duration(500)
.attr("fill", color(i)); // 鼠标移出时恢复原色
});
运行结果为:

实验心得:
实验二:D3数据可视化基础的更多相关文章
- Python数据可视化基础讲解
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:爱数据学习社 首先,要知道我们用哪些库来画图? matplotlib ...
- 数据可视化基础专题(十二):Matplotlib 基础(四)常用图表(二)气泡图、堆叠图、雷达图、饼图、
1 气泡图 气泡图和上面的散点图非常类似,只是点的大小不一样,而且是通过参数 s 来进行控制的,多的不说,还是看个示例: 例子一: import matplotlib.pyplot as plt im ...
- 数据可视化基础专题(三):Pandas基础(二) csv导入与导出
1.csv导入 1.1 csv导入 .read_csv()函数 pandas.read_csv(filepath_or_buffer: Union[str, pathlib.Path, IO[~Any ...
- 数据可视化基础专题(二):Pandas基础(一) excel导入与导出
1.Excel 1.1 Excel导入 read_excel() pandas.read_excel(io, sheet_name=0, header=0, names=None, index_col ...
- 数据可视化基础专题(十):Matplotlib 基础(二) 自定义配置文件和绘图风格(rcParams和style)
https://matplotlib.org/api/rcsetup_api.html#module-matplotlib.rcsetup 一.什么是rcParams?我们在使用matplotlibl ...
- 数据可视化基础专题(十五):pyecharts 基础(二)flask 框架整合
Flask 前后端分离 Step 1: 新建一个 Flask 项目 $ mkdir pyecharts-flask-demo $ cd pyecharts-flask-demo $ mkdir tem ...
- D3 数据可视化实战 笔记
学习真是件奇妙的事情.这本书我之前都看过,有些的知识点却完全没有印象. 总结:把用到的知识好好研究:平时可以了解其他技术的基础,把相关的资料和难点记录下来. javascript陷阱 1.变量类型 v ...
- 数据可视化基础专题(五):Pandas基础(四) 生成对象
引言 先介绍下 Pandas 的数据结构,毕竟数据结构是万物的基础. Pandas 有两种主要的数据结构: Series 和 DataFrame 模块导入 首先我们在代码中引入 Pandas 和 Nu ...
- 数据可视化基础专题(十三):Matplotlib 基础(五)常用图表(三)环形图、热力图、直方图
环形图 环形图其实是另一种饼图,使用的还是上面的 pie() 这个方法,这里只需要设置一下参数 wedgeprops 即可. 例子一: import matplotlib.pyplot as plt ...
- 【笔记】matplotilb数据可视化基础
matplotilb基础 matplotilb是我们使用的一个基础的可视化方法 一般来说,使用matplotilb是较为专业的绘制图形的选择 不需要很专业的时候可以只是用matplotilb的子模块p ...
随机推荐
- Qt编写物联网管理平台41-自动清理早期数据
一.前言 随着时间的增加,存储的历史记录也在不断增加,如果设备数量很多,存储间隔很短,不用多久,数据库中的记录就非常多,至少是百万级别起步,而且有些用户还是需要存储每一次的采集的数据,这数据量别说一年 ...
- MIPI/LVDS/PCIE/HDMI 设计规范
参考链接: 1.MIPI/LVDS/PCIE/HDMI 2.接口简介(HDMI .eDP/DP.LVDS.VGA.YPbPr.DVI.MHL.MIPI-DSI.VbyOneHS) 3.干货 | 带 ...
- IDEA导入他人的项目时提示“project sdk is not defined”的解决办法
IDEA导入他人的项目时提示"project sdk is not defined"的解决办法 1.在IDEA中,在有问题的项目上单击鼠标右键,然后选择"Open Mod ...
- 利用idea开发环境进行Spring Boot开发时maven同步更新jar依赖包时提示:sync:Cannot resolve xxx 的解决方案
idea maven sync Cannot resolve xxx 的解决方案 经常会出现这种奇葩情况,提示找不到包 其实是因为网络波动或者突然断掉,导致包更新出现问题 直接去maven的仓库目录 ...
- 不为人知的网络编程(十五):深入操作系统,一文搞懂Socket到底是什么
1.引言 我相信大家刚开始学网络编程中socket的时候,都跟我一样对书上所讲的socket概念云里雾里的.似懂非懂,很是困扰. 这篇文章我打算从初学者的角度,用通俗易懂的文字,跟大家分享下我所理解的 ...
- pytorch模型降低计算成本和计算量
下面是如何使用PyTorch降低计算成本和计算量的一些方法: 压缩模型:使用模型压缩技术,如剪枝.量化和哈希等方法,来减小模型的大小和复杂度,从而降低计算量和运行成本. 分布式训练:使用多台机器进行分 ...
- Java 中toString方法在枚举中的应用:展示枚举字段信息
在Java编程中,枚举(enum)是一种特殊的数据类型,它允许程序员定义一组固定的常量.枚举类型在Java中非常有用,尤其是在需要表示一组固定选项(如星期.月份.方向等)时.尽管枚举类型在定义时看起来 ...
- 新一代python版本与依赖管理工具 uv
uv python版本与依赖管理 选择原因 1. 新的好玩.rust开发的执行速度快 2. 确实方便 3. 轻,软件就十几二十兆,占磁盘小 4. uv.lock可以锁版本 场景应用 场景一 从 ana ...
- bazel学习
bazel学习 a fast, scalable, multi-language and extensible build system bazel就是一个编译打包工具,类似于make.cmake等 ...
- SQL server 更改计算机名后造成未找到或无法访问服务器解决方法
默认的计算机名较长且不易辨识,我在更改完计算机名之后却发现每次登陆SQL server都需要更改计算机名并重启计算机,否则便会出现以下错误提示: 此时我们需要再次更改计算机名(最终你想给计算机起的名字 ...