# 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

```x_bounds = np.array([0, 13])
y_bounds = np.array([0, 16])

x_buffer, y_buffer = 1, 1

x_plot = x_bounds + np.array([x_buffer, -x_buffer])
y_plot = y_bounds + np.array([y_buffer, -y_buffer])```

```num_points = 200
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])
plt.scatter(*pts.transpose())```

```vor = Voronoi(pts)
verts = vor.vertices
shapes_ind = vor.regions

"""
We are doing three things here
1. 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 Diagram

fig, ax = plt.subplots(figsize=(10,10))
ax.set_xlim(*x_plot)
ax.set_ylim(*y_plot)
lc = LineCollection(shapes)

```# let's just look at one polygon
polygon_ind = 15
polygon = shapes[polygon_ind]
center = np.mean(polygon, axis=0)

rescaled = []
n_fill_lines = 5
min_scalar = 0.1 # scale it down to 1/10th the original size

for 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)

```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)

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)```

```fig, ax = w.result
fig.savefig('my_super_cool_art.svg', bbox_inches = 'tight', pad_inches = 0)```

1. 使用Inkscape。
2. 使用Python工具。

```vpype \
scale --to 9.9in 12.6in \
write --page-format 11x14 --center my_super_cool_art_rescaled.svg

vpype \
scale --to 7.65in 9.9in \
write --page-format letter --center my_super_cool_art_rescaled.svg```

0 条评论

• ### Python进阶之Matplotlib入门(五)

Matplotlib是Python的画图领域使用最广泛的绘图库，它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像，是用Python画图的必备技...

• ### 在Python中创建命令行界面的最佳方式

通过创建命令行界面(CLI)，可以使程序功能强大并具有交互性。CLI允许您接受命令行参数(操作系统命令行中程序名称后面的信息)，以便向程序添加其他特性，使代码易...

• ### Python进阶之Matplotlib入门(四)

Matplotlib是Python的画图领域使用最广泛的绘图库，它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像，是用Python画图的必备技...

• ### R语言可视化——柱形图美化（簇状、堆积、百分比）

昨天以最简单的单序列柱形图作为对象详细的讲解了关于套用主题以及图表美化的思路。 今天就我们常用的几种柱形图的衍生图表——簇状柱形图、堆积柱形图、百分比堆积柱形图...

• ### 18.【Kevin聊敏捷】敏捷项目管理之Sprint Retrospective 迭代回顾会

迭代回顾会是在Sprint Review会议之后，下一个新的sprint开始之前。你可以理解为是当前sprint最后一个会议了，所以很多人认为是总结会，也可以这...

• ### 机器学习验证集为什么不再有新意？

研究者们入门数据科学世界时，意识到的第一件事便是，拥有训练和验证机器学习模型的独立数据集，至关重要。但是要实现这一点，很不容易。

• ### 用户活跃，指标波动该怎么分析？

上一篇【用户流失，该怎么分析？】以后，有同学强烈呼吁写用户活跃。因为用户相关的话题很多，为了便于大家阅读，这里把各种话题做一个归类如下图，这样看着清楚一些。今天...

• ### RustCon Asia 实录 | Rust 在国内某视频网站的应用

hawkingrei（王维真），中间件高级开发工程师，开源爱好者，TiDB & TiKV Contributor。

• ### Grpc介绍 — Go-Service To PHP-Client

笔者现在公司项目大部分是PHP进行开发，要完成整体微服务化必须要考虑PHP使用上的可行性，Grpc也是支持PHP作为client端发起Grpc请求，但是依赖的扩...

• ### 在 Quora 做机器学习「炼丹」是怎样的体验?

AI 科技评论按：实际上，号称「美版知乎」的 Quora 也已经大量引入了机器学习技术，而 Quora 的工程师们则喜欢把自己研究机器学习、产出技术方案的过程...

UTS