数据可视化与树形结构编程优化
立即解锁
发布时间: 2025-08-17 00:25:37 阅读量: 1 订阅数: 3 

### 数据可视化与树形结构编程优化
#### 1. 散点图地图中绘制点的优化
在散点图地图的操作中,缩放模式下点的显示存在问题。当进行缩放时,单个像素点会分散开来,导致点难以看清,很快就会丢失。这一问题源于我们对图像的感知方式,需要在缩放时采用不同的处理方式。
为了解决这个问题,随着用户输入更多数字,点应该变大。更好的做法是在缩放过程中添加更多信息,保持屏幕上信息的密度恒定。例如,输入三个数字后,可以显示州轮廓和主要州际公路的地图数据。虽然获取和格式化这些增强数据过于复杂,但我们可以实现一个简单的方法:在用户输入前四位数字后,显示最后一位数字的所有可能选项。
以下是 `Place` 类中更新后的 `draw()` 方法,它处理了两个优化:将点改为矩形,并显示可能的最后一位数字:
```java
void draw( ) {
float xx = TX(x);
float yy = TY(y);
if ((xx < 0) || (yy < 0) || (xx >= width) || (yy >= height)) return;
if ((zoomDepth.value < 2.8f) || !zoomEnabled) { // show simple dots
set((int)xx, (int)yy, faders[matchDepth].colorValue);
} else { // show slightly more complicated dots
noStroke( );
fill(faders[matchDepth].colorValue);
if (matchDepth == typedCount) {
if (typedCount == 4) { // on the fourth digit, show possibilities
text(code % 10, TX(x), TY(y));
} else { // show a larger box for selections
rect(xx, yy, zoomDepth.value, zoomDepth.value);
}
} else { // show a slightly smaller box for unselected
rect(xx, yy, zoomDepth.value-1, zoomDepth.value-1);
}
}
}
```
#### 2. 在线项目的数据部署问题及解决方案
对于在线项目,下载两兆字节的数据可能会成为问题。当前程序会在所有数据下载完成后才继续运行。更好的选择是使用内置的 `Thread` 类异步加载数据。
线程可以独立于程序的其他部分运行,通过递增 `placeCount` 逐渐添加位置信息。当 `placeCount` 和 `totalCount` 相等时,数据加载完成。
具体操作步骤如下:
1. 将数据文件从数据文件夹移出,放在服务器上草图的相邻位置。在草图文件夹中,将 `zips.tsv` 文件向上移动一级。
2. 对数据进行 gzip 压缩以节省空间和下载时间。可以使用工具对文件进行 gzip 编码,也可以下载已压缩的版本:[http://benfry.com/writing/zipdecode/zips.gz](http://benfry.com/writing/zipdecode/zips.gz)
3. 创建一个名为 `Slurper` 的新文件(在 Processing 界面的新标签中),用于处理异步加载。代码如下:
```java
class Slurper implements Runnable {
Slurper( ) {
Thread thread = new Thread(this);
thread.start( );
}
public void run( ) {
try {
BufferedReader reader = createReader("zips.gz");
// First get the info line.
String line = reader.readLine( );
parseInfo(line);
places = new Place[totalCount];
// Parse each of the rest of the lines.
while ((line = reader.readLine( )) != null) {
places[placeCount] = parsePlace(line);
placeCount++;
}
} catch (IOException e) {
e.printStackTrace( );
}
}
}
```
4. 在主标签中,修改 `readData()` 方法,只需启动线程即可:
```java
void readData( ) {
new Slurper( );
}
```
这种方法的一个优点是,点本身可以作为一种进度条,向用户提示下载进度。在慢速连接下,随着数据开始加载,点会从右到左逐渐出现。
#### 3. 项目的下一步方向
从当前阶段开始,该项目有多个发展方向:
- **优化性能**:使用相关技术检查 `Integrator` 对象在更新过程中是否实际发生了变化。如果没有变化,可以使用 `noLoop()` 禁用动画,减少 CPU 负载,提高其他运行程序的响应速度。
- **处理键盘焦点问题**:根据浏览器配置和导出小程序的 HTML 编写方式,程序首次加载时可能没有键盘焦点。当内置布尔变量 `focused` 为 `false` 时,向用户显示“点击小程序内部开始”的消息。
- **应用于其他国家的代码**:通过重新执行预处理步骤(获取、解析、过滤),该方法可以用于其他国家的代码。德国和英国都使用类似的邮政编码系统,并且可以在线获取相关数据文件。可以从 [opengeodb 项目](http://sourceforge.net/projects/opengeodb) 开始。
- **使用不同的数据类型**:
- 可以使用城镇名称代替邮政编码数字。输入“F”会突出显示所有以 F 开头的位置,输入“Fargo”会显示美国各地 Fargo 的分布情况。这种修改还可以显示不同国家定居者在美国的迁移模式。
- 也可以使用街道名称。虽然处理整个美国的街道信息过多,但可以使用相同的原则显示单个州的所有街道名称地图,并根据用户输入的名称逐步选择。街道数据可以从 [美国人口普查局的 TIGER/LINE 网站](http://www.census.gov/geo/www/tiger) 获取。
- 还可以将该应用扩展到区号或其他地理相关信息。
- **解决特定问题**:可以解决诸如“哪些位置距离 94133 在 25 英里以内”的问题。通过将经纬度距离转换为英里,并更改界面以支持选择邮政编码和距离。
- **添加额外的数据层**:引入额外的数据集,如卫星照片、地理边界、州际公路或地图图像。通过移除第一步中的投影转换,任何基于经纬度的数据都可以作为额外的图层使用。理想的应用是在每个缩放级别显示不同的信息层,保持可视化项目中每个级别的视觉信息密度。
#### 4. 树形结构编程基础
树形结构用于存储每个元素可能有多个子元素的数据。树中的元素通常称为节点,每个节点通常有多个子节点。文件和目录是树形结构的典型例子,每个目录可以包含多个项目,这些项目可以是文件或其他目录,以此类推。
递归结构虽然处理起来有点棘手,但在各种知识领域中都很常见,因此掌握树形结构的显示和交互很重要。以下是使用递归构建目录树的基本步骤:
1. 启动一个新的草图,并添加一个名为 `Node` 的第二个标签。`Node` 对象代表树中的单个元素,在这个例子中,每个元素可以是文件或目录。
2. 节点关联一个内置的 `File` 对象,可以查询其大小、最后修改时间或绝对路径等信息。以下是递归创建 `Node` 对象树的基本结构:
```java
class Node {
File file;
Node[] children;
int childCount;
Node(File
```
0
0
复制全文
相关推荐










