Tableau数据可视化入门、D3数据可视化基础
实验一:Tableau数据可视化入门
一、实验目的
1、熟悉Tableau Desktop 使用方法。2、通过Tableau软件来实现Excel中数据的基本可视化。
二、实验原理
Tableau是新一代商业智能工具软件,它将数据连接、运算、分析与图表结合在一起,通过拖放方式创建各种图表。
三、实验环境
四、实验步骤
1、双击桌面图标打开Tableau软件。出现Tableau Desktop引导界面。

界面的左边指示数据的来源,Tableau 可以连接到本地的 Excel 表格,文本,Access 数据库,统计文件等,也可以连接数据库服务器,例如 Microsoft SQL Server数据库,MySQL 数据库,Oracle 数据库等。左边最下面显示了已保存的数据源。中间上部分显示最近打开过的工作薄,下部分显示示例工作薄,即 Tableau 自带的一些工作薄,可以点击更多样本查看更多的数据图。右边显示了探索,每周精选以及 Tableau 一些社区,博客,新闻等等。第一次运行该软件,可以点击某一个示例工作薄,查看该软件数据展示的图示,以及如何简单操作。
2、点击上图示左侧“已保存数据源”下的“示例-超市”。打开界面后,点击左下角的“数据源”,结果如下。




3、制作中国各个地区的利润图表。



4、制作填充地球图。



5、制作中国各个省份地区的利润仪表板。










五、总结
1、实验步骤回顾
-
启动Tableau Desktop: 熟悉软件界面,了解数据源连接方式,并打开示例工作簿进行探索。
-
数据源探索: 学习如何查看数据源中的子工作表,以及如何使用筛选器进行数据过滤。
-
创建基本图表: 通过拖放维度和度量到行和列,快速创建条形图和填充气泡图,并利用“智能显示”功能切换图表类型。
-
制作填充地球图: 学习如何更改数据类型,将地理位置信息设置为地理维度,并创建填充地球图。
-
创建仪表板: 学习如何创建仪表板,并添加多个工作表进行布局和排版,实现信息对比。
2、实验收获
-
掌握了Tableau Desktop 的基本操作和界面布局。
-
熟悉了数据源连接和数据探索的方法。
-
学会了利用拖放方式快速创建各种图表,并进行图表类型切换。
-
了解如何制作填充地球图和仪表板,进行数据可视化展示。
3、实验反思
-
需要进一步学习Tableau Desktop 的进阶功能,例如数据清洗、数据计算、图表定制等。
-
可以尝试连接其他数据源,例如数据库服务器,进行更复杂的数据分析和可视化。
-
需要提升对数据可视化的理解和设计能力,制作更具吸引力和信息量的图表。
总体而言,本次实验成功实现了实验目的,使我初步掌握了Tableau Desktop 的使用方法,为后续学习和实践数据可视化奠定了基础。
实验二:D3数据可视化基础
一、实验目的
二、实验原理
三、实验环境
四、实验步骤
题目一:制作一个简单的柱形图。
1、打开Notepad++,新建文件,并编辑好html框架。







题目二:制作动态的柱形图。



题目三:制作饼形图。





运行结果如下:

题目四:制作交互式的饼形图。

运行结果为:

五、总结
1、实验过程:
-
环境搭建: 在 HTML 文件中引入 D3.js 库,并创建 SVG 画布作为绘图区域。
-
数据准备: 定义数据数组,并使用 D3 的比例尺功能将数据映射到 SVG 画布的坐标轴上。
-
图形绘制:
-
柱形图: 使用 SVG 的
rect元素绘制矩形,并通过设置其位置和宽度来表示数据。 -
动态柱形图: 利用 D3 的过渡效果,让柱形图动态地变化到目标高度。
-
饼形图: 使用 D3 的饼图布局将数据转换成适合绘制饼图的形式,并使用 SVG 的
path元素绘制饼图的各个扇区。 -
交互式饼形图: 添加鼠标事件监听器,实现在鼠标悬停在饼图扇区时改变颜色,并在鼠标移开后恢复原色的交互效果。
2、实验收获:
-
掌握了 D3.js 库的基本使用方法,包括 SVG 画布的创建、数据的准备、比例尺的应用、图形的绘制以及事件监听器的添加。
-
理解了 D3 的布局概念,以及如何使用布局将数据转换成适合绘图的格式。
-
体验了 D3 的强大功能,能够通过编写简单的代码实现复杂的数据可视化效果。
附录:
柱状图代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>美化柱形图及文字</title>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<style>
.MyRect {
fill: #0000EE;
transition: fill 0.3s ease;
}
.MyRect:hover {
fill: #408b7d;
}
.MyText {
font-family: sans-serif;
font-size: 12px;
fill: white;
text-anchor: middle;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.axis text {
font-family: sans-serif;
font-size: 11px;
}
</style>
</head>
<body>
<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 };
// 定义一个数组
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]);
// y轴的比例尺
var yScale = d3.scale.linear()
.domain([0, d3.max(dataset)])
.range([height - padding.top - padding.bottom, 0]);
// 矩形之间的空白
var rectPadding = 4;
// 定义x轴
var xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom");
// 定义y轴
var yAxis = d3.svg.axis()
.scale(yScale)
.orient("left");
// 添加矩形元素
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 () {
var min = yScale.domain()[0];
return yScale(min);
})
.attr("height", 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 () {
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);
});
// 添加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>
饼状图代码:
<html>
<head>
<meta charset="utf-8">
<title>饼状图</title>
</head>
<style>
</style>
<body>
<!-- 确保D3.js的链接是有效的 -->
<script src="https://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];
var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
var pie = d3.layout.pie();
var piedata = pie(dataset);
var outerRadius = 150;
var innerRadius = 0;
var arc = d3.svg.arc()
.innerRadius(innerRadius)
.outerRadius(outerRadius); // 设置外半径
var color = d3.scale.category10();
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);
})
// 添加鼠标悬停事件
.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));
});
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>

浙公网安备 33010602011771号