用Processing实现北京地铁的一天动态可视化

Processing 案例 | 可视化网络爬虫爬遍网络 文章目录引言准备:网络爬虫代码主要思想主要结构Grid类第一种移动策略第二种移动策略颜色的选取分析第一种爬取策略第二种爬取策略两者结合拓展:图论小结参考资料 引言   吴军先生在他的《智能时代》中曾经提到:“如果我们把资本和机械动能作为大航海时代以来全球近代化的推动力的话,那么数据将成为下一次技术革命和社会变革的核心动力”。   的确,现在这个时代是数据的时代。当人工智能需要的计算能力、算法都放到... 阅读详情

一、项目思路

在本次项目中,将读取各个地铁站点每分钟的进出站客流并进行动态可视化。

1.1 地图背景使用卫星地图图片,地铁站点用ellipse()展示,地铁线路用line()绘制,站点和线路的的颜色分别使用fill()和stroke()控制。

1.2 在setup()函数中完成一些初始化工作,如读取数据、读取背景图片、加载字体等。

1.3 由于每分钟提供一次数据汇总,因此需要60x24共计1440帧,在每帧的draw()中使用对应的数据重新绘制画布,用ellipse()的大小来表示客流量的多少。

二、项目实现

2.1 新建草图

2.2 新建Table变量

Table是一种类似二维数组的变量类型,定义table变量用于存储站点数据,link变量用于存储线路数据、traffic变量用于存储客流数据。
N等于1440,表示一天一共有1440分钟,interval为每帧对应的时间,即1分钟。
current为当前帧对应的时间,由于凌晨零点至五点地铁尚未运营,所以这里选择从五点开始展示。

2.3 setup()函数

编辑setup()函数以完成一些初始化工作,包括设置画布大小、启用平滑处理、设置背景颜色、设置填充色、启用圆角绘图、设置帧频等。

2.4 数据保存在data文件夹

将背景图片和地铁线路数据存放在data文件夹

2.5 loadTable()函数加载csv数据并赋值给三个Table变量

2.6 使用loadImage()函数加载背景图片并赋值给PImage变量

2.7 设置字体

使用createFont()函数生成一个字体,并使用textFont()函数将生成的字体设置为当前绘图所用的字体。

Table table;
Table link;
Table traffic;
PImage beijing;
int R;
int C;
float w = 1280;
float h = 720;
float minLng = 134.6412879;
float maxLng = 135.9199972;
float minLat = 35.9535469;
float maxLat = 36.6819062;
int interval = 1;
int N = 24 * 60 / interval;
int current = 5 * 60;

int offset = 1;

void setup(){
  size(1280, 720);
  smooth();
  background(250);
  fill(102);
  strokeCap(ROUND);
  frameRate(60);
  
  table = loadTable("stations_with_geo.csv");
  link = loadTable("links_with_geo.csv");
  traffic = loadTable("oneday_traffic.csv");
  beijing = loadImage("beijing.png");
  
  textFont(createFont("MicrosoftYaHei", 13));
}

void draw(){
  drawBackground();
  
  for (int i = 0; i < 304; i++){
    float lat = traffic.getFloat(current, i * 7);
    float lng = traffic.getFloat(current, i * 7 + 1);
    int cr = traffic.getInt(current, i * 7 + 2);
    int cg = traffic.getInt(current, i * 7 + 3);
    int cb = traffic.getInt(current, i * 7 + 4);
    float entry;
    if (offset == 0) {
      entry = traffic.getFloat(current, i * 7 + 5) * 3;
    }
    else {
      entry = traffic.getFloat(current, i * 7 + 6) * 3;
    }
    fill(cr, cg, cb, 120);
    ellipse(w*(lng-minLng)/(maxLng-minLng), h*(maxLat-lat)/(maxLat-minLat), entry, entry);
  }  
  
  // saveFrame("frames/####.tif");
  
  current = current + 1;
  if (current == N) {
    // current = 5 * 60;
    exit();
  }
}

void drawBackground(){
  image(beijing, 0, 0, 1280, 720);
  
  int bg = 250;
  // background(bg);
  
  int hour = current / 60;
  int minute = current % 60;
  fill(bg);
  textSize(30);
  if (hour < 10 && minute < 10) {
    text('0' + str(hour) + ":0" + str(minute), 950, 60);
  }
  else if (hour >= 10 && minute < 10) {
    text(str(hour) + ":0" + str(minute), 950, 60);
  }
  else if (hour < 10 && minute >= 10) {
    text('0' + str(hour) + ':' + str(minute), 950, 60);
  }
  else {
    text(str(hour) + ':' + str(minute), 950, 60);
  }
  textSize(18);
  if (offset == 0) {
    text("Entries / per 3m", 1050, 60);
  }
  else {
    text("Exits / per 3m", 1050, 60);
  }
  textSize(12);
  int tmp = 0;
  for (int i = 0; i < 10; i++){
    String s = traffic.getString(N + current - current % 10, 10 * 2 * offset + i * 2);
    int number = traffic.getInt(N + current - current % 10, 10 * 2 * offset + i * 2 + 1);
    if (number >= 20) {
      textAlign(RIGHT);
      fill(bg);
      text(s, 1020, 96 + 20 * tmp);
      textAlign(LEFT);
      text(number, 1050 + number / 5, 96 + 20 * tmp);
      noStroke();
      fill(bg, 255 - tmp * 20);
      rect(1040, 96 + 20 * tmp - 9, number / 5, 10);
      tmp += 1;
    }
  }
  
  R = link.getRowCount();
  C = link.getColumnCount();
  
  for (int i = 0; i < R; i++){
    float latO = link.getFloat(i, 1);
    float lngO = link.getFloat(i, 2);
    float latD = link.getFloat(i, 4);
    float lngD = link.getFloat(i, 5);
    int cr = link.getInt(i, 7);
    int cg = link.getInt(i, 8);
    int cb = link.getInt(i, 9);
    stroke(cr, cg, cb);
    strokeWeight(2);
    line(w*(lngO-minLng)/(maxLng-minLng), h*(maxLat-latO)/(maxLat-minLat), w*(lngD-minLng)/(maxLng-minLng), h*(maxLat-latD)/(maxLat-minLat));
  }
  
  R = table.getRowCount();
  C = table.getColumnCount();
  
  for (int i = 0; i < R; i++){
    //String name = table.getString(i, 0);
    float lat = table.getFloat(i, 1);
    float lng = table.getFloat(i, 2);
    int category = table.getInt(i, 4);
    if (category == 1) {
      fill(204);
      noStroke();
      ellipse(w*(lng-minLng)/(maxLng-minLng), h*(maxLat-lat)/(maxLat-minLat), 6, 6);
    }
    else {
      fill(204);
      noStroke();
      ellipse(w*(lng-minLng)/(maxLng-minLng), h*(maxLat-lat)/(maxLat-minLat), 3, 3);
    }
  }
}

三、总结

通过“北京地铁的一天”这一实战项目,巩固了Processing中常用的一些语法和知识点,也掌握了使用Processing实现动态可视化的基本思想:准备好不同时间对应的数据,在draw()中根据当前时间获取对应的数据,使用点、线、圆形、矩形等绘图元素进行可视化。

四、成果展示

BeiJingSubwayOnday

五、参考文献

张宏伦 [上海交通大学] 实战 上海地铁的一天动态可视化

KNN算法在GIS中的空间邻近性重构与实战指南 K-Nearest Neighbors(KNN)作为基础机器学习算法,其核心是基于距离的邻近关系建模;但在地理信息系统(GIS)中,‘邻近’并非单纯数学距离,而是融合路网阻抗、行政边界、功能尺度与社会感知的复合空间语义。本文从空间分析本质出发,解析KNN默认欧氏距离与GIS网络距离、球面距离、拓扑邻近之间的原理断层,阐明k值在步行圈、公交圈等真实场景中实为时空阈值的代理变量,而非统计最优整数。通过ArcGIS、QGIS与Python(GeoPandas+OSRM+BallTree)协同实践,展示如何将KNN 阅读详情

相关推荐

互动影像设计:音乐可视化作业 processing

processing音乐可视化作业 作业中用的是aespa的发行单曲《Black Mamba》,图片来自aespa官方微博,侵删 效果如下 代码部分 周围圆轨迹、中心圆、图片在Particle类中 class Particle { float r, angle, d;//中心圆的直径r,周围小圆的旋转角度和直径 PImage img; int[] c = new int[3];//颜色数组 Particle(float r, float d) { this.r =r;

weixin_44848852的博客 5257

大数据可视化实验六、七:大数据可视化工具—Processing(一)(二)

实验五:大数据可视化工具—Processing(一) 参考链接:可视化实验五:大数据可视化工具—Processing(一)

Time木的博客 2599

数据可视化大师:用Processing揭示复杂数据的秘密

👋 欢迎来到系列的第十篇,也是我们的数据可视化篇!今天,我们将一起探索如何使用Processing将枯燥的数据转化为生动的视觉故事。准备好了吗?让我们开始这场数据与艺术的奇妙融合之旅!🎆 数据可视化是Processing中一个非常强大和实用的工具,它让我们能够将复杂的数据转化为易于理解的视觉故事。无论你是想要展示一个简单的统计图表,还是想要创建一个可以交互探索的数据可视化应用,Processing都能帮助你实现。

帅小柏的博客 309

Processing——《下雪的季节》可视化流程

Processing——《下雪的季节》可视化流程 一、前言 灵感来源(也谈不上灵感吧):正值冬季,下雪的季节,做做雪花飘落的“特效 ”也别有一番风味(虽然挺low的,哈哈哈)。更者,正好有一首歌,即名为《下雪的季 节》,所以就又想做些音乐可视化的东西吧,也算锦上添花。 二、飘雪的实现 有了有趣的想法就开始实现吧,先从比...

King的博客 1万+

提高篇(四):在Processing中实现数据可视化:从基础图表到动态展示

通过掌握这些数据可视化技巧,你可以在Processing中将数据转化为直观的图形,从而更好地理解和分析数据。不管是基础图表、动态展示,还是结合外部数据源和第三方库,这些技术都能为你的创意编程提供强大的支持。在接下来的文章中,我们将继续探索更多高级Processing技巧,敬请期待!希望这篇文章能帮助你提升Processing的数据可视化能力,让你的作品更加生动和有趣。如果你有任何问题或建议,欢迎在评论区留言,我们一起交流探讨。

帅小柏的博客 597

ADS AEL脚本进阶:参数化电感与变压器的自动化设计

本文深入探讨了如何利用ADS AEL脚本实现电感与变压器的参数化与自动化设计。通过构建可复用的函数库、封装高级设计流程、集成DRC检查与性能预估,将繁琐的手动绘制升级为高效的智能设计引擎,并最终通过创建GUI工具降低使用门槛,大幅提升射频/微波电路设计效率。

weixin_29309785的博客 203

ROS TF异常本质:时间感知坐标系图谱的契约违约信号

TF(Transform Library)是ROS中用于维护多坐标系间时空关系的核心机制,其底层是一个带纳秒级时间戳的动态树状图谱,而非简单数学变换工具。它遵循唯一性、时效性与连通性三大运行契约,所有异常(如ConnectivityException、ExtrapolationException)均对应特定契约的违反——前者反映坐标系拓扑断裂,后者揭示时间维度上的外推越界。这类异常属于可恢复的运行时逻辑错误,设计初衷是提供精准调试线索,而非指示系统崩溃。在机器人导航、SLAM、多传感器融合等典型场景中,正确

weixin_30487201的博客 340

QMT vs Ptrade:量化交易新手如何根据需求选择券商系统(附实战案例)

本文对比了QMT和Ptrade两大券商量化交易系统的核心差异,帮助量化交易新手根据需求选择合适的平台。QMT适合技术面策略开发,执行效率高;Ptrade则提供全面的财务数据和复杂策略支持。通过实战案例,展示了如何结合两平台优势实现高效量化交易。

weixin_42683394的博客 528

31 实战 上海地铁的一天动态可视化

成果展示 https://gold.xitu.io/post/583a43eaac502e006ea02d64   项目代码 链接:HTTPS://pan.baidu.com/s/1hrHIGr6密码:ny7j   代码时间 开始动手   接下来 选择你感兴趣的数据 打开你的脑洞 创造出独具特色的处理可视化 ...

一夜飘零 9484

【影像组学】用3Dslicer或Python提取影像组学特征

用3Dslicer或Python提取影像组学特征

abdslfwoeugp 1万+

从CentOS迁移到openEuler 24.03 LTS:手把手教你部署Java+MySQL+Redis+Nginx全栈环境

本文详细指导如何从CentOS迁移到openEuler 24.03 LTS,并部署Java+MySQL+Redis+Nginx全栈环境。涵盖系统配置、软件安装、性能优化及环境验证,助力企业级用户高效完成服务器迁移与部署。

weixin_26938645的博客 390

炫酷的可视化工具:processing 初识

为了让你明白这个工具到底有多炫酷,先来几张图震撼一下你吧:你相信吗,上边这些图都是 js 实现的哦,真真不是ps的成果,是不是很强大。 接下来,我们一起学习一些这个 processing 怎么实现这些炫酷效果吧。据说这个 工具是高效艺术系的课程,主要用于制作数字艺术作品、数据可视化作品和互动多媒体艺术作品等,可以实现动态表单、处理手势、定义行为,还可以模拟自然系统以及整合其他各种媒介,最重要的是他是一种开发语言,是一门非常非常简单的开发语言。 主要以 JAVA 为主,可以实现跨平台,目前主流的浏览器都支持

sinat_33255495的博客 1711

python数据处理与分析案例,python如何进行数据处理

大家好,本文将围绕基于python的数据处理案例展开说明,python数据处理与分析案例是一个很多人都想弄明白的事情,想搞清楚python如何进行数据处理需要先了解以下几个事情。大家好,小编来为大家解答以下问题,python数据处理案例步骤及其代码,python数据处理与分析教程,今天让我们一起来看看吧!哈喽~今天学习记录的是数据分析实训小案例。就用这个案例来好好巩固一下 python 数据分析三剑客。

a17348的博客 1239

可视化实验六:大数据可视化工具—Processing(一)

实验目的: 了解Processing数据可视化的特点 掌握Processing的简单操作 能够使用Processing绘制简单形状 实验内容: 练习掌握Processing的安装和基本操作方法 熟悉Processing的绘制功能 练习使用Processing绘制点、线、圆、椭圆、曲线等 实验过程(附结果截图): 1.练习掌握Processing的安装和基本操作方法 (1)下载Processing (2)解压压缩包 (3)利用processing绘制像素点 2.熟悉Processing的绘制功能

qq_43437122的博客 1607

链路状态路由协议 OSPF (一)

本章将会学习链路状态路由协议OSPF,理解OSPF的基本概念,工作原理,掌握OSPF配置基本命令。本章重点,OSPF的基本概念,OSPF配置。

yj11290301的博客 3475

【Clickhouse】Cannot allocate block number in Zookeeper write prefix view location

我有一个问题,我CK集群跑批的时候,replicated表变成只读的了下面是CK的报错和当时ZK的日志。下面是zk报错开始 我认为是写入的时候,压力太大,ZK扛不住了,就按照博客里的建议优化了ZK的参数,现在偶尔还会只读,zk报错都是图里的那种clickhouse的集群是5分片的集群,数据量比较大。每小时批量一次,每次2-10W条数据,字段的话,不到200个字段,使用的 jdbc sink写入。

九师兄 836

python数据分析可视化大作业——对地铁数据的简单数据分析

python数据分析可视化——对地铁数据的简单数据分析

qq_44184866的博客 4万+

什么是垂直同步?电脑快速消除屏幕撕裂与提升游戏性能的方法 垂直同步、游戏画面撕裂、游戏优化、VSync、FPS、FreeSync、G-Sync、显卡驱动更新、游戏画质、输入延迟

看这张动图,左边的画面出现了明显“切开”的断层现象,而右边画面非常流畅,没有撕裂。这正是「垂直同步」开关的区别。:每秒生成多少帧图像。比如 60FPS 表示一秒钟显示 60 张图片。刷新率(Refresh Rate):显示器每秒刷新几次画面,单位是赫兹(Hz)。60Hz 表示每秒刷新 60 次。参数说明FPS显卡渲染速度(逻辑帧率)刷新率显示器的显示频率(物理限制)当 FPS 高于刷新率时,显卡渲染的画面来不及被显示器显示,导致撕裂。屏幕撕裂(Screen Tearing)

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1348

基于Processing的noise随机数做出炫酷的图片

内容 前置知识 一维noise函数 二维noise函数 制作思路 代码 一维noise函数 其xxx的取值范围是负无穷到正无穷,且函数本身关于yyy轴对称。返回值是一个[0,1][0,1][0,1]之间的数。 需要注意的是,[0,1][0,1][0,1]中的每个数出现概率并不相同,其结果类似于正态分布,越接近0.50.50.5的数出现概率越大,越接近0,10,10,1的数出现概率越低。 与random随机数的区别 randow随机数生成的数是均匀分布的,而noise随机数的生成值是接近正态分布的,

hanserdaisuki的博客 2372

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

数据可视化之Processing【1】

数据可视化--顾名思义,是关于数据之视觉表现形式的研究,将数据用其他方式表现出来,使之更直观, 更清晰,更容易分析和处理,常见的表达方式如word中使用广泛的直方图、树状图、折线图、饼状图等。 数据可视化技术的基本思想是将数据库中每一个数据项作为单个图元元素表示,大量的数据集构 成数据图像,同时将数据的各个属性值以多维数据的形式表示。

Fortware的专栏 9847

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

好用的数据可视化工具有哪些?

数据可视化是大数据技术得以展现价值的“最后一公里”,向用户呈现数据处理和分析的结果性数据,通过表和图的方式传递数据价值,并且支撑用户对结果性数据的灵活运用。 大数据的基础数据可以是结构化数据,也可能是非结构化数据,是质量好的、由计算机系统采集的数据,也可能是手工维护的文本、表格数据,在经过数据处理和分析的环节后,纷杂的大数据得以整理、整合、清洗、计算,形成易于元数据描述的结果性小数据,信息密度得以极大的提升。在完成信息密度由低到高的魔法变换后,结果性数据如何最大限度地传递价值,一直是业界不断研究和创新的课题

danerzai的博客 532

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

processing实现的跳动心形

近来看到的电视剧《点燃我,温暖你》里出现的跳动心形,就很心动想要自己去实现一下,用processing做可视化很方便,也许TouchDesign更方便但是这个不太熟悉还是用processing了。最后做不出来电视剧里的效果,就这样先吧。自己做出了来的效果如下:文件里的内容。

weixin_44848852的博客 2840

processing使用python画图_Image-Processing

Image-Processing图像处理软件(程序运行平台为Windows,Python实现)功能有美白、磨皮、滤镜(雕刻、哈哈镜、波浪、冰冻、怀旧、黑白、模糊、灰度)界面设计pyqt5设计,UI和功能代码分离。其中UI利用工具QT designer设计,生成.ui文件以后利用pyuic转换成python代码。【A】.图片显示界面用scrollArea控件,其中填充scrollAreaWidget...

weixin_39850167的博客 1120

给零基础朋友的编程课06 - 代码

processing 图形作品 一

znyicen的专栏 426

基于Processing的数据可视化

虽然数据可视化领域有很多成熟、界面友好、功能强大的软件产品(例如Tableau、VIDI、NodeXL等),但是借助Processing我们可以基于Java语言框架进行丰富多元的可视化编程,熟悉了Processing也可以说是上一学期Topics课程的最大收获,以另一种方式将数据重新组织、统计并以可视化界面展现出来。今天再看其他资料时碰巧看到XX对Processing的支持,颇感亲切,所...

aeaud3002的博客 1286

Processing实现绘制自画像

关于自画像创作 · 自画像的创作主要分以下几个步骤: 工具准备 轮廓构建 颜色填充 形状修正 背景构建 交互构建 工具准备 关于工具准备是指方便构图而使用的一些代码,比如: println(mouseX+" "+mouseY); 可以比较方便地获取屏幕上的坐标位置,方便修改。 另外由于人脸部分的绘图需要用到曲线(我用的比较多的是贝塞尔曲线),我选择将贝塞尔曲线可视化出来...

weixin_44239354的博客 6450
上一篇: Processing基础
下一篇: python环境下xgboost的安装与使用
极客范儿
极客范儿 新星创作者: 游戏开发技术领域 新星创作者: 游戏开发技术领域 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄12年 1万+粉丝 343原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客范儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值