介绍

我们知道Python作为一个程序语言,讲究的是严谨和逻辑;而艺术画似乎处于另一个维度,更多是无规则和随心所欲。然而我们却可以找到两者的交汇点。今天我们将学习如何用Python制作艺术图。一旦我们知道如何用Python做基础,我们就可以免费获得Python工具库的其他部分(web框架、数据科学工具、AI+ML+CV工具等)。可以想象,拥有这些工具的我们其实没有天花板。

我们将在本python绘图教程中涉及的工具和库有:Numpy + Scipy + Matplotlib

Jupter Noteboobk

用于交互设计的Ipythonwidgets

用于SVG后处理的Vpype

(可选)Axidraw Python客户端

代码链接:

https://github.com/zoso95/plotter_guides/tree/master/genhut

(可选)Axidraw Python客户端安装指南:

https://axidraw.com/doc/py_api/#installation

基本步骤

生成艺术的第一件作品叫做Voronoi图,如下图所示:

我们需要画一堆多边形,然后填充其中一些多边形。

初始设计

我们要做的第一件事是调整画布的大小。通常使用11x14张纸。这里的想法是,我们希望我们的多边形延伸到框架的边缘之外,因此有一个更大的区域(x/y_bounds)来创建我们的多边形,然后实际上将它们显示在一个11x14的区域内:

x_bounds = np.array([0, 13])y_bounds = np.array([0, 16])x_buffer, y_buffer = 1, 1x_plot = x_bounds + np.array([x_buffer, -x_buffer])y_plot = y_bounds + np.array([y_buffer, -y_buffer])

还记得我说过Voronoi图包含点并给出多边形吗?让我们把这些点表示出来。这段代码将生成200点:num_points = 200x = np.random.uniform(*x_bounds, size=num_points).reshape((num_points, 1))y = np.random.uniform(*y_bounds, size=num_points).reshape((num_points, 1))pts = np.hstack([x, y])plt.scatter(*pts.transpose())

它应该是这样的:

现在我们来看看我们的图表是什么样的。先用泰森多边形法函数返回,我们过滤掉一些无效的多边形:

vor = Voronoi(pts)verts = vor.verticesshapes_ind = vor.regions'''We are doing three things here1. filtering out any empty shapes (len(s) == 0)2. filtering out any shapes that go out of bounds (then it has an index of -1)3. Closing the polygon by adding the last point back (so [1,2,3]->[1,2,3,1])'''shapes_ind = [s+s[0:1] for s in shapes_ind if len(s)>0 and -1 not in s]shapes = [verts[s] for s in shapes_ind]# Plot the Diagramfig, ax = plt.subplots(figsize=(10,10))ax.set_xlim(*x_plot)ax.set_ylim(*y_plot)lc = LineCollection(shapes)ax.add_collection(lc)

我们会得到一个像这样的图:

现在我们只缺少填充多边形。这里有一个简单的数学技巧。我们的想法是,如果我们有一个形状,集中在(0,0),然后按比例形状的年代,我们可以把所有的点乘以S .所以我们要做的就是把一个多边形,中心,规模下来很多次,然后移动多边形+填充回到起始位置。一旦我们可以在一个多边形上做,我们可以在任意多的多边形上做!完成所有这些的代码是这样的:# let's just look at one polygonpolygon_ind = 15polygon = shapes[polygon_ind]center = np.mean(polygon, axis=0)rescaled = []n_fill_lines = 5min_scalar = 0.1 # scale it down to 1/10th the original sizefor scaler in np.linspace(min_scalar, 1, num=n_fill_lines, endpoint=False): scaled = scaler*(polygon - center) + center rescaled.append(scaled) fig, ax = plt.subplots(figsize=(10,10))ax.set_xlim(-1.25, 1.25)ax.set_ylim(-1.25, 1.25)lc = LineCollection(rescaled)ax.add_collection(lc)

添加交互性

正如您可能已经注意到的,我们已经挑选了许多影响我们的设计外观的数字,但是我们并没有非常仔细地挑选它们!你可能会想“到目前为止,这看起来还行,但是如果我们使用更多的点会发生什么呢?”还是更少的填充线?”现在你可以改变这些数字,然后从那时开始重新运行程序,但是一遍又一遍做起来很麻烦。

制作复杂数字程序的挑战之一是,通常它们需要大量的参数作为输入,因此你不知道哪些数字工作得很好,也不知道它们是如何相互影响的。幸运的是,我们有ipywidgets。Ipywidgets可以与Jupytery一起工作,并提供了一个简单的函数包装器,它可以让您轻松地使用幻灯片、按钮等更改函数输入,它会重新运行您的函数,这样您就可以看到发生了什么。

要添加所有这些交互性,我们所要做的就是将代码封装到一个函数中,给输入变量一些默认值,(可选地)我们可以告诉包装器函数哪些值是有意义的,例如,浮点数取一个(最小值、最大值、值增量)。一旦我们这样做,库将自动生成一个交互式小部件。

为此,我们将运行代码:

def make_some_art(num_points=200, percent_to_fill = 0.5, n_fill_lines=5, min_scalar = 0.1, debug=False, toggle_for_new=False): x = np.random.uniform(*x_bounds, size=num_points).reshape((num_points, 1)) y = np.random.uniform(*y_bounds, size=num_points).reshape((num_points, 1)) pts = np.hstack([x, y]) vor = Voronoi(pts) verts = vor.vertices shapes_ind = vor.regions shapes_ind = [s+s[0:1] for s in shapes_ind if len(s)>0 and -1 not in s] shapes = [verts[s] for s in shapes_ind] n_shapes_to_fill = int(percent_to_fill*len(shapes)) shapes_to_fill = np.random.choice(shapes, size=n_shapes_to_fill, replace=False) fill = [] for s in shapes_to_fill: center = np.mean(s, axis=0) for scaler in np.linspace(min_scalar, 1, num=n_fill_lines, endpoint=False): scaled = scaler*(s - center) + center fill.append(scaled) fig, ax = plt.subplots(figsize=(20,20)) ax.set_aspect('equal') if not debug: plt.grid(False) plt.axis('off') ax.set_xlim(*x_plot) ax.set_ylim(*y_plot) lc = LineCollection(shapes+fill) ax.add_collection(lc) return fig, ax w = interactive(make_some_art, num_points=(10,1000,25), percent_to_fill=(0., 1., 0.05), n_fill_lines=(1, 20, 1), min_scalar=(0,1,0.01))display(w)

接下来,我们将更改一些关于如何绘制的内容。我添加了一个调试选项,如果我们没有启用调试,我们会得到一个干净的图形,没有轴线、标记或类似的东西,所以我们可以继续绘制它。但是,当我们启用调试时,它会让我们看到这一点,这样我们就可以得到一个缩放的感觉,所有东西都在哪里,等等。

最后,我添加了一个名为toggle_for_new的无操作切换按钮,它不做任何事情,但将迫使函数使用相同的参数进行新的设计。这在你喜欢设计的时候很有用,你可以通过参数来影响它,但是你不喜欢特定的组合,所以你只想重新运行它。

现在您应该看到出现了一些滑块:

当你调整它们时,它会改变设计!

打印你的画作

我们只剩下保存结果、格式化和打印了。如果我们使用那个文件扩展名,Matplotlib允许我们直接保存到SVGs,所以我们将继续这样做。fig, ax = w.resultfig.savefig('my_super_cool_art.svg', bbox_inches = 'tight', pad_inches = 0)

对于格式化+打印,我们有两个选项。使用Inkscape。

使用Python工具。

因为这是在Python教程中绘制的,所以我们将使用选项2,但是选项1通常也是可以的。

为了进行格式化,我们将使用Vpype。Vpype是一个内置在Python中的命令行工具,它在改变大小或对齐方式、将多个svg合并为一个(例如,如果您想使用多种颜色)、简化svg以提高速度等方面非常出色!因为我们只是确保SVG的大小适合页面,所以这样做相对比较简单。我提供了两个示例命令。一个是11x14(因为我在示例中一直使用它),但是因为您可能要打印在信纸上,所以我也把它扔了进去。我通过缩放给了我们一个空白。

vpype \read my_super_cool_art.svg \scale --to 9.9in 12.6in \write --page-format 11x14 --center my_super_cool_art_rescaled.svgvpype \read my_super_cool_art.svg \scale --to 7.65in 9.9in \write --page-format letter --center my_super_cool_art_rescaled.svg

现在我们只需用我们的钢笔绘图仪把它打印出来。为此,我们将使用Axidraw API。关于这部分大家有如果有兴趣请查看原文。

参考原文:

https://www.generativehut.com/post/robots-and-generative-art-and-python-oh-my

python制作图画_Python也能绘制艺术画?这里有一个完整教程相关推荐

  1. python艺术画_Python也能绘制艺术画?这里有一个完整教程

    基本步骤 生成艺术的第一件作品叫做Voronoi图,如下图所示: 我们需要画一堆多边形,然后填充其中一些多边形. 初始设计 我们要做的第一件事是调整画布的大小.通常使用11x14张纸.这里的想法是,我 ...

  2. python气泡图画_Python使用Plotly绘图工具,绘制气泡图

    今天来讲讲如何使用Python 绘图工具,Plotly来绘制气泡图. 气泡图的实现方法类似散点图的实现.修改散点图中点的大小,就变成气泡图. 实现代码如下: importplotly as pyimp ...

  3. python制作热力图_Python中绘制场景热力图

    原文地址:https://www.cnblogs.com/taotingz/p/11309333.html 我们在做诸如人群密集度等可视化的时候,可能会考虑使用热力图,在Python中能很方便地绘制热 ...

  4. python 制作抽奖_python制作抽奖程序代码详解

    实现制作抽奖程序,需要认知到我们可以看到一般抽奖程序界面上是有很多按钮的,比如中奖区域,按键开始区域等等,所以我们先要设置界面,然后把这些按钮添加到界面中去,想必这对于学过tkinter的同学应该不难 ...

  5. python制作五子棋_python制作简单五子棋游戏

    python制作简单五子棋游戏 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: python制作简单五子棋游戏.txt ] (友情提示:右键点上行txt文档名->目标另存 ...

  6. python制作剪刀石头布_Python制作简单的剪刀石头布游戏

    关于程序相关的 您可以反复玩游戏,直到选择停止为止. 该程序跟踪获胜情况. 大小写无关紧要(即rock与rock相同). 如果您输入的内容无效,程序会一直提示您,直到您输入有效的内容. 对项目进行编码 ...

  7. python制作字典_python如何制作英文字典

    本文实例为大家分享了python制作英文字典的具体代码,供大家参考,具体内容如下 功能有添加单词,多次添加单词的意思,查询,退出,建立单词文件. keys=[] dic={} def rdic(): ...

  8. python制作生日礼物_Python全国少儿编程竞赛参赛作品《智能生日提示小助手》解析...

    本文介绍的作品是全国青少年创意编程与智能设计大赛创意编程比赛王梓名同学的参赛作品. 作品说明 一个记录朋友生日的小程序,数据来源于本地csv文件,简单好用,希望大家喜欢,也欢迎提供宝贵的意见. 正文 ...

  9. python制作日历_Python如何绘制日历图和热力图

    本文以2019年全国各城市的空气质量观测数据为例,利用matplotlib.calmap.pyecharts绘制日历图和热力图.在绘图之前先利用pandas对空气质量数据进行处理. 数据处理 从网站下 ...

最新文章

  1. 微软Google思科宣布将资助OpenSSL等开源项目
  2. Scalable IO in Java
  3. 项目部署mysql安装_Tomcat7+jdk+mysql安装及项目部署
  4. 编写高质量代码改善C#程序的157个建议——建议133:用camelCasing命名私有字段和局部变量...
  5. hive怎样决定reducer个数
  6. Winfrom中设置ZedGraph显示多个标题(一个标题换行显示)效果
  7. VS IISExpress REST DELETE 405 Method Not Allowed
  8. Linux文件和目录权限:chmod、更改所有者和所属组:chown,umask命令,隐藏权限:lsattr/chattr...
  9. CentOS6.4 Install FTP
  10. Linux的实际操作:文件目录类的实用指令(重定向“>“和追加“>>“)
  11. 字典,和字典的增删改查
  12. selenium元素定位之 动态id, class元素定位
  13. HDU1401 Solitaire
  14. LuoguP3674 小清新人渣的本愿 BZOJ4810: [Ynoi2017]由乃的玉米田
  15. 得到 jason中 string 的值_简单高性能的Json解析器: Jason
  16. C# ping 局域网扫描
  17. Chrome(谷歌浏览器)安装Adblock实现屏蔽烦人广告
  18. 计算机while语句知识点总结,while循环使用方法
  19. Manjaro安装deb包
  20. 关于JVM中Eden区、Survivor from区和Survivor to区的理解

热门文章

  1. 【打卡】电子表格符号转换(简单)
  2. JAVA毕业设计数据分析星辰网智能手机销售网站计算机源码+lw文档+系统+调试部署+数据库
  3. MyBatis实现查询的操作
  4. Euclidean distances(欧几里德距离)
  5. redis分布式锁原理及实现
  6. Unity之OpenXR+XR Interaction Toolkit实现 抓取物体
  7. SQLSERVER数据库同步
  8. 关于MySQL可重复读的理解
  9. Vant 步进器 van-stepper 阻止事件冒泡
  10. Openssl Encrypt