手把手:一张图看清编程语言发展史,你也能用Python画出来!

编译:周佳玉、丁慧、叶一、小鱼、钱天培

今天文摘菌要教大家制作一张编程语言的关系网络图。如果不知道什么是关系网络图,可以点击下方链接先来看一下最终成果:

我们可以在这里看到从过去到现在的250多种编程语言之间的“设计影响”的关系,下面是该演示的截图:

接下来,就让我们一起来学做这个关系网络图吧!

众所周知,在过去几十年来最有影响力的公司中,有一部分是因为网络的力量而获得成功。

亚马逊的高效配送网络使他们能够在一些主要城市提供当天发货。

网络模型也可以解释大量的科学现象,包括有量子力学、生化途径以及生态和社会经济系统等。

那么,鉴于它们不可否认的重要性,我们应该如何更好地理解网络及其属性呢?

此外,我们将使用Python3.x和一款非常棒的开源软件Gephi,通过关系网络将过去和现在的一系列编程语言的网络可视化联系起来。

首先,究竟什么是网络呢?

其实上面文摘菌举的栗子已经给了一些线索。交通网络由目的和路径的连接组成。社交网络通过个人和个人之间的关系进行连接。Google的搜索引擎算法通过查看有哪些页面链接到其他页面,来评估不同网页的“顺序”。

更一般地说,网络是可以用节点和边描述的任何系统,或者通俗来讲,就是我们所说的“点和线”。

边连接节点(语言)的例子(该网络表示了编程语言相互影响的关系)

有些系统以这种方式建立网络比较容易。社交网络也许是最明显的例子。计算机文件系统则是另一种方式——文件夹和文件通过其“父”和“子”关系创建连接。

但是,网络的真正威力其实在于,许多系统都可以从网络的角度来建模,即使这起初并不明显。

代表网络

我们应该如何将点和线的图片转换成我们可以压缩的数字信号呢?

其中有一个解决方案是绘制一个邻接矩阵来表示我们的网络。

如果你不熟悉矩阵这个概念,这听起来可能有点吓人,但不要害怕。把它们想象成可以一次执行许多计算的数字网格就好。下面是一个简单的例子:

在这个矩阵中,每个行和列的交集都是0或1,这取决于各个语言是否被链接。你也可以根据上面的插图观察到!

对于要解决的大多数问题而言,矩阵是以数学方式表示网络的好方法。然而从计算的角度来看,它有时可能会有点麻烦。

例如,即使节点数量相对较少(比如说有1000个),矩阵中的元素数目也会大得多(例如,1000^2=1,000,000)。

许多现实世界的系统会产生稀疏网络,在这些网络中,大多数节点只能连接其他所有节点中的一小部分。

如果我们将计算机内存中1000个节点的稀疏网络表示为邻接矩阵,那么我们将在RAM中存储1,000,000个字节的数据。大多数将会是零。这里有一个更为有效的方法可以解决这个问题。

这种方法是使用边列表来代替邻接矩阵。这些正是他们所说的,它们只是一个节点对相互链接的列表。

表示网络的另一种手段是邻接表,它列出了每个节点后面与它进行链接的节点。例如:

收集数据,建立连接

任何网络模型以及可视化的表现都取决于构建网络本身所用的数据质量好坏。除了确保数据是准确和完整的同时,我们也需要一种推断节点之间边的合理方法。

这是相当关键的一步,随后对网络进行的任何分析和推断都取决于“关联标准”的合理性。

例如,在社交网络分析中,你可能会根据人们是否在社交媒体上相互关联来创建人与人之间的联系。在分子生物学中,你可能会基于基因的共同表达建立连接。

通常,我们还可以给边分配权重,从而体现关系的“强度”。

例如,对于网上零售的情况,可以根据产品被同时购买的频率来计算权重。用高权重的边连接经常被同时购买的产品,用低权重的边连接偶尔被同时购买的产品。和偶尔被同时购买的产品相比,那些不会被同时购买的产品根本就不会被网络连接。

正如你想的那样,将节点彼此连接的方法有可能很复杂。

但是对于本教程,我们将使用更简单的方式连接编程语言。我们要依靠维基百科。

而且,它的页面结构相对一致,使其成为试用网页抓取技术的便利场所。

另一个便利工具是覆盖面广泛的、有据可查的维基百科API,这使得信息检索更容易。接下来让我们一起开始吧。

第一步:安装Gephi

Gephi可在Linux、Mac和Windows的环境下进行安装。

对于这个项目,我使用了Lubuntu。如果你使用的是Ubuntu/Debian,那么你可以按照下面的步骤来启动和运行Gephi。如果不是,那么安装过程也不会差太多。

下载最新版本的Gephi到你的系统(在撰写本文时是v.0.9.1)。准备就绪后,你需要提取文件。

你可能需要检查你的JavaJRE版本。Gephi需要最新版本。在我刚刚安装的Lubuntu上,我只安装了default-jre,下面的一切将建立在此基础上。

在你准备好进行安装之前还有一步。为了将图表导出到Web,你可以使用Gephi的Sigma.js插件。

从Gephi的菜单栏中选择“工具”选项,然后选择“插件”。

点击“可用插件”标签并选择“SigmaExporter”(我也安装了JSON导出器,因为它是另一个有用的插件)。

点击“安装”按钮,你将完成整个安装过程。安装结束后,你需要重新启动Gephi。

第二步:编写Python脚本

本教程将使用python3.x以及一些模块来进行简化。使用pip模块安装程序,需运行一下命令:

现在,在一个新的目录中,创建一个名为script.py的文件,并在你最喜欢的代码编辑器/IDE中打开它。以下是主要逻辑的大纲:

首先,你需要有一个编程语言的列表。

从中提取出每种语言所影响的编程语言列表。这是我们连接节点的粗略标准。

同时,我们可以抓取一些关于每种语言的元数据。

最后,将收集的所有数据写入一个.csv文件。

完整的脚本在这里:

导入模块

在script.py中,首先导入一些模块。

准备好后——从创建一个节点的列表开始。这是Wikipedia模块派上用场的地方。它使得访问维基百科API非常容易。

添加下面的代码:

另外,还需要手动检查自动收集的数据。快速浏览后我们可以发现,除了许多实际的编程语言之外,该脚本还提供了一些额外的链接。

如:可能会看到“Listofmarkuplanguages”,“Comparisonofprogramminglanguages”等。

这些代码定义了要从数据中移除的子字符串列表。运行该脚本时遍历数据,移除所有包含不需要的子字符串的元素。

在Python语言中,完成这些只需要一行代码!

其他辅助函数

现在我们可以开始从wikipedia抓取数据并建立一个边列表(并收集所有元数据)。为了更简便,让我们首先定义一些函数。

抓取HTML

第一个函数使用BeautifulSoup模块来获取每种语言的Wikipedia页面的HTML。

然后传给BeautifulSoup,它将读取HTML并解析为一个可以用来搜索信息的对象。

接下来,使用find_all()方法抓取感兴趣的HTML元素。

最简单的方法是访问其中一个编程语言页面。在这里,可以简单地使用浏览器的开发工具来检查感兴趣的元素。汇总表有HTML标记

和CSS类“infobox”和“vevent”,因此可以使用这些来标识HTML中的表格。

用参数指定它:

find_all()返回符合标准的所有元素列表。为了指定感兴趣的元素,需要添加索引[0]。如果函数执行成功,则返回table对象,否则,返回None。

在使用了自动数据收集程序的情况下,全面的异常处理是非常重要的。如果没有,那么在最好的情况下如果脚本崩溃了,数据抓取程序需要重新开始执行。

在最坏的情况下,你获得数据集将包含不一致性和错误,这将为你后续的工作买下隐患。

检索元数据

下一个函数使用table对象来查找一些元数据。下面给出在表格中搜索语言第一次出现的年份的代码。

这个简短的函数以table对象作为参数,并调用BeautifulSoup的get_text()函数生成一个字符串。

下一步是创建一个名为year的子字符串。该字符串存储了在“appear”这个词首次出现之后的30个字符。这个字符串应该包含语言第一次出现的年份。

为了仅提取年份,使用正则表达式(通过re模块)来匹配任何以1到3之间的数字开头、并紧邻三个数字的字符串。

如果执行成功,函数将返回一个整数的year。否则,我们会得到“Couldnotdetermine”。你可能还想进一步挖掘元数据,例如范例,设计者或打字规律。

收集链接

我们还需要一个函数–该函数读入给定语言的table对象,输出一个包含其他编程语言的列表。

仔细观察上面代码中嵌套部分,到底是怎么回事呢?

一旦找到这一行,就可以确定下一行包含了被当前行影响的每种编程语言的链接。使用find_all(“a”)便可查找这些链接-其中参数“a”对应于HTML标签

对于每个链接j,将其[“title”]属性添加到名为out的列表。对[“title”]属性感兴趣的原因是因为它将完全匹配存储在节点中的语言名称。

例如,Java作为“Java(编程语言)”存储在节点中,因此需要在整个数据集中使用这个确切的名称。

如果执行成功,getLinks()将返回一组编程语言。该函数的其余部分进行了异常处理,以防程序在某一阶段出现问题。

收集数据

最后,在一切准备就绪后执行脚本,收集数据并将其存储在两个列表对象中。

现在编写一个循环,将先前定义的函数应用于nodes中的每个词条,并将输出存储在edgeList和meta中。

该函数使用节点中的每种语言,并尝试从维基百科页面检索汇总表。

然后,该函数将检索表中列出的与目标语言所关联的全部语言。

对于同时出现在节点列表中的每种语言,将一个元素以[“source,target”]的形式添加到edgeList。通过这种方式,建立一个边的列表传给Gephi。

出于调试的目的,打印添加到edgeList的每个元素——这样做仅仅为了确保一切都工作。如果想要更彻底地调试,也可以添加打印语句到except语句中。

接下来,获取语言的名称和年份,并将其添加到元列表中。

写进CSV文件

一旦循环运行,最后一步是将edgeList和meta的内容写入到CSV文件。通过使用前面导入的csv模块,完成上一步骤就容易多了。

完成了!保存脚本,并从终端运行:

$python3script.py

当构建边列表时,你可以看到脚本输出了source-target对。确保网络连接的稳定性后,你就可以坐等结果了,此时脚本将发挥其魔力。

第三步:用Gephi建立图形

希望你已经安装并运行了Gephi。现在你可以创建一个新项目,并使用你收集的数据来构建有向图。有向图将显示不同的编程语言是如何相互影响的!

首先在Gephi中创建一个新项目,然后切换到“数据实验室”窗口。Gephi中提供了一个扩展式的接口来处理数据。首先要导入列表。

点击“导入电子表格”。选择由Python脚本生成的edge_list.csv文件。确保Gephi中使用逗号作为分隔符。从列表类型中选择“边列表”点击“下一步”,导入源和目标列作为字符串,并检查。

用一个节点列表来更新数据实验室。现在,导入metadata.csv文件。这一次,从列表类型中选择“节点列表”。

切换到“Preview”选项卡,查看网络的外观。

这时的图形看起来颜色十分单一,而且杂乱无章,就像一盘意大利面。所以我们接下来要进行图像美化。

图像美化

我们可以通过各种方式来演示图像,也可以尽情发挥自己的创意。另外,关于网络可视化还要考虑以下三件事情:

节点定位:生成网络布局模式的算法有很多,比较流行的是fruchterman-reingold算法,而且Gephi支持该算法。

节点大小:图中节点的大小可以用来表示一些有趣的属性。通常,这是一个中心性度量。度量中心性的方法有很多,但它们都反映了给定节点的“重要性”,即它与网络的其他部分关联的紧密程度。

节点着色:我们还可以使用颜色来显示节点的某些属性。通常,颜色用来表示群落结构,广泛定义为“与图的其余部分相比关联更紧密的一组节点”。在社交网络中,群落结构可以揭示个人的友情、家庭或专业团体之间的关联。有几种算法可以检测群落结构,Gephi自带的检测算法是Louvain方法。

要执行上述步骤,还需要计算一些统计数据。切换到“Overview”窗口。在这里你可以看到右侧的一个面板。它包含一个“Statistics”选项卡。打开它,你将看到一系列选项。

Gephi具有许多内置的统计功能。对于每种功能,点击“Run”将生成一个报告,该报告揭示了关于网络的一些洞见。

如果要修改网络的外观,我们可以转向左边的面板。

在“Layout”选项卡中,可以选择要使用的布局算法。点击“运行”,实时观看图表的变化!看看你认为哪种布局算法效果最好。

在Layout选项卡之上是“Appearance”选项卡。在这里,你可以为节点和各条边的颜色、大小和标签进行设置,也可以根据数据的属性来配置(包括你要计算的数据)。

一个建议:

根据模块化属性将节点着色。着色的根据是节点的群落成员关系。根据节点的平均程度来确定节点的大小。关联紧密的节点会比关联稀疏的节点显得大。

不过,也可以尝试设计一个最喜欢的布局。一旦对图形外观感到满意,就可以进入最后一个步骤——将图形导出至网页!

第四步:使用Sigma.js插件

既然已经构建了一个可以在Gephi中查看的网络可视化,接下来可以选择使用屏幕截图,或者以SVG、PDF或PNG格式保存图形。

可从Gephi的菜单栏选择“Export>Sigma.js模板…”。

按要求填写详细信息。确保选择导出项目所在的目录。你也可以更改图形的标题、图例、描述、悬停和许多其他细节。当你准备好了,点击“确定”。

现在,如果你打开导出项目所在的目录,你将看到一个文件夹,其中包含Sigma.js生成的所有文件。

在你最喜欢的浏览器打开index.html文件。哈!你的网络!如果你知道一些CSS和JavaScript,可以载入各种生成的文件到你的网络中,以便按照你的意愿调整输出的网络。

脑洞开一开,网络画起来

许多系统可以作为网络进行建模和可视化。图论是数学的一个分支,它提供了帮助理解网络结构和属性的工具。

使用Python从Wikipedia获取数据,构建编程语言影响图。关联标准是一种给定的语言是否能被列为对设计另一种语言的影响。

Gephi和Sigma.js是分析和可视化网络的开源工具。它们可以让你以图像、PDF或Web格式导出网络。

模仿本文的方法,你还可以为很多其他的关系建模并做出可视化。脑洞开一开,网络画起来。

1.程序设计图片程序设计素材免费下载包图网精选海量程序设计图片供您下载使用,免费高清程序设计图片素材,内容涵盖程序设计广告设计、插画UI、摄影配图、商务办公等各类应用场景,轻松编辑即可完成设计需求,包图网让设计更简单。https://ibaotu.com/tupian/chengxusheji.html
2.程序开发素材程序开发图片程序开发素材图片下载觅知网为您找到149个原创程序开发素材图片,包括程序开发图片,程序开发素材,程序开发海报,程序开发背景,程序开发模板源文件下载服务,包含PSD、PNG、JPG、AI、CDR等格式素材,更多关于程序开发素材、图片、海报、背景、插画、配图、矢量、UI、PS、免抠,模板、艺术字、Phttps://www.51miz.com/so-sucai/107808.html
3.小程序设计案例素材网站图片免费下载运营管理小程序设计案例 茶品牌商城小程序设计案例 53 DJVIVI 小程序设计案例展示 10 设研设计工作室 Ui界面设计 | 鲜花小程序设计案例 106 澄境ArtClear 职业技术学院校友小程序设计案例 2 同济小明同学 咖啡店小程序装修设计 | 案例分享 9 小马儿设计师 https://www.zcool.com.cn/tag/ZODM5NzM2.html
4.微信小程序轮播图:样式设计及尺寸指南小程序轮播图怎么添加和设计?你可以使用「云中科」小程序制作工具https://www./,注册账号后选择一个你喜欢的模板(电商、展示、服务预订、文章、超级云名片……等等),在“小程序设计-页面设计”里,你可以添加图片banner版块,选择轮播图类型,上传自己需要展示的图片。 https://www.zhonweb.com/newsDetail.html?id=2290
5.当红设计趋势!揭秘信息可视化图表的设计方法优设网编者按:今年最火的信息图教程来了!本文是百度同学总结的,包括信息图的6大类型和信息图设计流程两个方面,每方面都有细致展开,包同学们看得懂,学得来 >>>信息可视化包括了信息图形、知识、科学、数据等的可视化表现形式,以及视觉可视化设计方面的进步与发展。地图、表https://www.uisdc.com/information-chart-design-method/
6.基于stm32作品设计:懒人蓝牙彩灯手机APP无线控制ws2812,MCU无线(二)QT程序设计 (三)APP功能设计 作品哔哩哔哩视频:【待上映】 资料链接:【待更新】 一、作品背景 在智能的2021年代,年轻的小伙伴都患上了懒惰的症状,我也一样。 有一个难以入眠的夜晚,我打开了王者荣耀,我习惯了玩手机都要开着灯打,这样可以减少对眼睛的损伤,终于,赢了好几把,时间已经到了凌晨2点半,我https://www.ucloud.cn/yun/121235.html
7.学习编程丨全网最全的C/C++编程学习顺序和书籍推荐,自学别错过《Windows程序设计》 Windows平台学习的必看经典书籍 《Windows核心编程》 Windows编程深入学习经典书籍 Windows开发库 《MFCWindows程序设计》 MFC入门学习经典书籍 《深入浅出MFC》 深入学习MFC经典书籍 《Windows用户态程序高效排错》 编程调试经典书籍,提高开发效率 https://zhuanlan.zhihu.com/p/79173768
8.小程序图片长按识别功能笔记? 背景 今天,做的小程序项目要求,个人中心的客服图片在用户长按时可以识别其二维码 在百度无果,参考小程序官方文档后,发现: 附录文档位置:小程序图片长按识别 代码设计 好在https://www.jianshu.com/p/ec9a620222d6
9.计算机毕业课程设计javaweb毕业设计-图片浏览小程序(java+applet)(可做课程设计).zip 浏览:78 javaweb毕业设计-图片浏览小程序(java+applet)(可做课程设计).zipjavaweb毕业设计-图片浏览小程序(java+applet)(可做课程设计).zipjavaweb毕业设计-图片浏览小程序(java+applet)(可做课程设计).zipjavaweb毕业设计- https://download.csdn.net/download/p445098355/87797907
10.设计模式的艺术第五章工厂方法设计模式练习(设计一个程序来读取设计一个程序来读取各种不同类型的图片格式,针对每种格式都设计一个图片读取器。例如,GIF 图片读取器用于读取 GIF 格式的图片,JPG 图片读取器用于读取 JPG 格式的图片。需充分考虑系统的灵活性和可扩展性。 一、类结构图 抽象工厂角色类:设计为 ImageReaderFactory 接口,面向抽象产品角色类编程,包含接口方法 createImhttps://xie.infoq.cn/article/c4085ac3f4d842de888bbb3f1
11.微信小程序实现图片压缩javascript技巧本文实例为大家分享了微信小程序图片压缩的具体代码,供大家参考,具体内容如下 设计思路: 选择图片后调用微信压缩图片接口,压缩后接收压缩图片的临时地址,调用微信储存接口保存图片至本地。 参数: imagesrc:图片地址 imgcount:是否选择图片 show_hidden:是否展示按钮 https://www.jb51.net/article/175589.htm
12.《春》优秀教学设计(通用10篇)利用cAI课件进行多媒体辅助教学,能将抽象的内容形象化,复杂的问题简约化。在《春》一课中,运用了Powerpoint技术,并将从网络上下载的图片应用于课件中,结合Vcd影碟的音乐效果,使人身临春之中,体味春之美。 八、教学程序设计 1、教学流程图 (教师活动),(学生活动),(师生共同),(多媒体应用) https://www.cnfla.com/jiaoxuesheji/2838381.html
13.电脑程序设计师简笔画简笔画图片大全电脑程序员简笔画教程 程序员简笔画 设计师男孩简笔画 电脑工程师形象简笔画 电脑程序员简笔画教程 电脑工作者简笔画集 电脑程序员简笔画 电脑编程人员简笔画 计算机程序设计员简笔画 电脑工作者简笔画集 设计师简笔画卡通 电脑简笔画图片教程 计算机简笔画图片人物简笔画计算机程序员简笔画图片 展开更多https://www.puchedu.cn/jianbihua/362340421a1da390.html
14.网页设计的注意事项由于计数器也是由程序设计成的,显示计数器的过程其实就是在执行一个程序的过程,它需要占用用户宝贵的上网时间,况且大多数浏览者认为计数器毫无意义,它们很容易被做假,浏览者也不想看广告。因此笔者建议不要轻易考虑在你的网站上放置一个醒目的点击记数器。你设计网站是为了给访问者提供服务,而不是推销你自己认为重要https://www.yjbys.com/edu/meigongsheji/308312.html
15.原型设计小piu的7套原型图资源分享!点击图片一键使用原型设计小 piu 同款 6、通讯聊天类小程序原型设计 这款通讯聊天类小程序原型设计以绿色为页面主色调,用少量的黄色、湖蓝色作为点缀,视觉体验上带来活泼灵动的感觉。一共 12 张界面,主页、查询页、聊天页面等都包含在内。 7、音乐应用线框原型设计 https://js.design/special/article/prototyping-xiao-piu.html
16.外观专利申请的流程是怎么样的依据专利法,外观专利申请的审批程序包括受理、初审和授权三个阶段。 什么是外观专利 我国专利法规定:外观设计专利是指对产品的形状、图案或其结合以及色彩与形状、图案的结合所做出的富有美感并适于工业应用的新设计。 外观专利申请要提交的资料 1、外观设计图片或照片 https://www.66law.cn/laws/191839.aspx
17.自然界的水循环教学设计(通用12篇)作为一名教职工,往往需要进行教学设计编写工作,教学设计是教育技术的组成部分,它的功能在于运用系统方法设计教学过程,使之成为一种具有操作性的程序。我们应该怎么写教学设计呢?下面是小编为大家收集的自然界的水循环教学设计,希望对大家有所帮助。 自然界的水循环教学设计 1 https://www.ruiwen.com/jiaoxuesheji/3167317.html