使用您自己的代码进行数据可视化。
项目描述
Code Art
我想总结我过去十年所做编程的成果,并意识到如果创建一个其他人也能使用的工具会更有趣。具体来说,我希望能够
- 有一个类可以解析我本地机器上的仓库,并根据扩展名组织文件。
- 为每个扩展名构建一个word2vec模型,每个语言都有自己的模型。word2vec模型应该有三个维度,以便我们可以将其映射到RGB颜色空间。这意味着每个字符的嵌入不仅对语言是唯一的,而且还有一个独特的颜色。我们还应该能够构建一个跨扩展名的单个模型,并将每个扩展名映射到它。
- 最后,我应该能够使用这些嵌入来可视化任何特定的脚本(或某些其他图形)。我还想添加一些变量/维度来表示年龄/日期。
进度
到目前为止,我能够做到上述功能,并为每个代码文件生成一个小图像,其中单词的颜色由其word2vec(3维,RGB)嵌入决定。以下是从spack中获取的一个Python脚本的小例子
以下是spack仓库中所有Python文件的随机放置网格
查看示例 5:生成颜色图,以更直观地显示仅颜色空间。我所努力实现的是能够推导和组织上述图像,可能基于平均颜色或其他相似的方法。
用法
安装
您可以从 pypi 安装
pip install codeart
或直接从仓库安装
$ git clone https://github.com/vsoch/codeart
$ python setup.py install
以下示例也包含在codeart 示例仓库中。
示例 1:画廊和交互式可视化
生成抽象画廊
您可以为根目录(包括其下的所有文件)或存储库生成网页画廊
from codeart.main import CodeBase
code = CodeBase()
# How to add a folder
code.add_folder('/home/vanessa/code')
# How to add a repository
code.add_repo("https://github.com/spack/spack")
# See languages with >100 files
code.threshold_files(100)
# Generate a web report (one page per language above this threshold)
gallery = code.make_gallery(groups=['', '.py', '.patch'])
Training model with groups |.py|.patch
Generating web output for ''
Generating web output for '.py'
Generating web output for '.patch'
Finished web files are in /tmp/code-art-xp73v5ji
然后为以下每个示例文件
您也可以在这里浏览原始图像这里。
生成 RGB 向量
如果您想为代码库生成 RGB 向量,您可以使用这些向量进行自己的机器学习项目。以下是如何为存储库执行此操作。
from codeart.main import CodeBase
code = CodeBase()
code.add_repo("https://github.com/spack/spack")
代码库将添加代码文件,并在 code.codefiles 中为每个找到的扩展名进行查找。您可能需要查看这些内容,并选择一些高于给定阈值的子集。
# Look at extractors, one added per extension
code.codefiles
# Find those with >100 files
code.threshold_files(thresh=100)
# {'': [codeart-files:115],
# '.py': [codeart-files:4227],
# '.patch': [codeart-files:531]}
然后为每个组/扩展名训练一个 word2vec 模型,大小为 3,以便我们可以映射到 RGB 颜色空间。
code.train(groups=['.py', '', '.patch'])
您也可以为这些扩展名训练单个模型
code.train_all(groups=['.py', '', '.patch'])
或使用所有组进行训练。
code.train_all()
现在我们为每个扩展名(以及所有)都有一个模型
code.models
code.models['all']
以下是如何为特定扩展名(或所有)获取熊猫帧的方法
vectors = code.get_vectors(".py")
vectors = code.get_vectors("all")
生成交互式颜色图
假设我们提取了上面的 spack 代码库,然后想要可视化向量。我的意思是什么?我想看到嵌入模型中的术语(每个对应于具有某个扩展名的代码文件中找到的单词/术语)如何对应于每个扩展名。为此,我可以提取计数和向量
from codeart.graphics import generate_interactive_colormap
vectors = code.get_vectors('all')
counts = code.get_color_percentages(groups=list(code.codefiles.keys()), vectors=vectors)
# Save if desired!
vectors.to_csv("spack-colormap-vectors.csv")
counts.to_csv("spack-color-percentages.csv")
tmpdir = generate_interactive_colormap(vectors=vectors, counts=counts, width=1000)
早期交互式版本在这里这里
并更新以更好地排序,请参阅这里。
基本上,模型中的每个术语都用其颜色表示,颜色的透明度基于每个术语在特定扩展名中的出现频率。您可以通过点击不同的扩展名来查看颜色变化。
对于第二个(排序)图,因为 RGB 颜色值是根据相似性排序的,因此您也可以推断出相似的颜色表示相似的术语,这表示代码文件中的相似上下文。
示例 2:生成绘图
您可能只想获取向量和绘制 RGB 空间。您可以这样做
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(vectors[0].tolist(), vectors[1].tolist(), vectors[2].tolist(), c=vectors.to_numpy()/255)
# Optionally add text (a bit crowded)
for row in vectors.iterrows():
ax.text(row[1][0], row[1][1], row[1][2], row[0])
plt.show()
plt.savefig("img/spack-python.png")
示例 3:生成代码图像
如果您想为某些扩展名生成原始图像,您也可以这样做。这些图像可用于某些图像处理项目,生成其他图像,或进行其他类型的聚类分析。
# Generate images for all files
if not os.path.exists('images'):
os.mkdir('images')
# Create folder of code images (if you want to work with them directly)
code.make_art(extension=".py", outdir='images', vectors=vectors)
示例 4:生成颜色查找网格
我还没有详细开发这个,但您也可以为给定图像生成颜色网格。这里的想法是有一个可以作为图例使用的网格。在这里,我们再次加载 spack 代码库,并为 ".py"(Python)扩展名生成查找。
from codeart.main import CodeBase
from codeart.graphics import save_vectors_gradient_grid
code = CodeBase()
code.add_repo("https://github.com/spack/spack")
vectors = code.get_vectors(".py")
save_vectors_gradient_grid(vectors=vectors, outfile='spack-image-gradient.png')
以下是一个示例渐变图像
以及一个更大的示例(您需要点击并放大查看)
该图像是从此数据生成的,我通过在我的计算机上构建跨所有 Python 代码的模型创建该数据(请注意,模型中除了 Python 之外还有许多不同的文件扩展名)。
当然,您可以根据需要或矩阵大小调整维度、行高、列宽和字体大小。
示例 5:生成颜色图
您可以通过这个笔记本了解如何生成颜色图。例如,这里是我的Python(和相关文件)代码库的整个颜色图,没有改变不透明度,只是绘制颜色(这些是与上面颜色查找网格对齐的颜色)。
如果我们进行降维,我们可以在2D中绘制它
最后,我们可以评估代码库中任何特定扩展的数量,以生成使用透明度来显示给定术语普及程度的图像。这是针对.yml和.rst(重构语法)文件。
我们还可以生成一个动画,循环显示每种语言。
但请注意,这些数据将非常受益于交互式可视化,类似于之前提到的交互式颜色图示例。
示例 6:通过自定义函数解析文件夹
您可能希望以某种超出扩展名的逻辑方式组织组,或者只使用所有文件。因此,add_folder和add_repo函数可以提供一个自定义的"func",该函数将根据文件返回一个组名。例如,从utils中,我们可以导入一个按年份分组文件的函数
def group_by_year_created(filename):
"""Given a filename, return the year it was created.
This function is called after testing the file for read access.
"""
stat = os.stat(filename)
return datetime.fromtimestamp(stat.st_ctime).year
然后,当添加文件夹或存储库时,我们可能会这样做
code.add_folder(folder, func=group_by_year_created)
code.add_repo(folder, func=group_by_year_created)
您也可以直接提供字符串或组(优先于func)
code.add_repo(repo, group="2017")
您提供的函数应将文件名作为主要参数。一个更复杂的例子(使用GitHub API按创建日期解析GitHub存储库)可以在parse_by_year.py中找到。
示例 7:生成CodeArt文本
一个简单的用例是给定一个存储库或文件夹,使用它生成文本图像。
from codeart.graphics import generate_codeart_text
from codeart.colors import generate_color_lookup
# either works here
code.add_repo("https://github.com/vsoch/codeart")
code.add_folder("/path/to/folder")
images = code.make_art(group="all", outdir=os.getcwd())
images = glob("%s/*" % os.path.join(os.getcwd(), "images"))
color_lookup = generate_color_lookup(images)
# Generate an image with text (dinosaur!)
generate_codeart_text("dinosaur", color_lookup, outfile="index.html")
还有一个类似的功能(使用得不是很好/开发得不是很好),是生成到图像的映射。
from codeart.graphics import generate_codeart
generate_codeart('sunset.jpg', color_lookup, sample=10, top=100, outfile="index.html")
有关文本生成的更多详细信息,请参阅
示例 8:基本客户端使用
对于文本生成,我创建了一个简单的客户端,将驱动交互
> codeart --help
usage: codeart [-h] [--version] {textart} ...
Code Art Generator
optional arguments:
-h, --help show this help message and exit
--version print the version and exit.
actions:
actions for Code Art generator
{textart} codeart actions
textart extract images from GitHub or local file system.
目前唯一的简单命令是生成代码艺术文本图形。请注意,这将为每个代码文件生成一个图像,因此应该用于小代码库,或者在大代码库中谨慎使用。
codeart textart --help
usage: codeart textart [-h] [--github GITHUB] [--root ROOT] [--outdir OUTDIR]
[--text TEXT]
optional arguments:
-h, --help show this help message and exit
--github GITHUB GitHub username to download repositories for.
--root ROOT root directory to parse for files.
--outdir OUTDIR output directory to extract images (defaults to temporary
directory)
例如,您可以在codeart-examples中看到.github actions工作流程。
您有疑问吗?或者想要建议一个功能来改进它?请打开一个问题!
项目详情
codeart-0.0.13.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 45f841007ca6f8bdcad055300c0012693abd050ed66ae29c49deaaad5984f31b |
|
MD5 | 463a69a9f068010dd6b13a26a4cea296 |
|
BLAKE2b-256 | 8f7ac497c49f386db0af31cdc34b3bb85dcf57d8d3f3ef644db6d856a9ae9e37 |