Python利用matplotlib万花尺画月饼-阿里云开发者社区

开发者社区> spaceack> 正文

Python利用matplotlib万花尺画月饼

简介: 今日正值中秋节,是中国民间的传统节日。中秋节自古便有祭月、赏月、吃月饼、玩花灯、赏桂花、饮桂花酒等民俗,流传至今,经久不息。 通过参加阿里天池 [画月饼过云上中秋](https://tianchi.aliyun.com/competition/entrance/531836/introduction) Python编程活动以此纪念
+关注继续查看

今日正值中秋节,是中国民间的传统节日。中秋节自古便有祭月、赏月、吃月饼、玩花灯、赏桂花、饮桂花酒等民俗,流传至今,经久不息。

通过参加阿里天池 画月饼过云上中秋 Python编程活动以此纪念

完整代码和环境见 Github matplotlib-draw-mooncake , 码字不易,假使该篇文章对您有所帮助,欢迎Star,以资鼓励。

绘制原理

利用数学解析几何中的内旋轮线(hypotrochoid),内旋轮线是追踪附着在围绕半径为 R 的固定的圆内侧滚转的半径为 r 的圆上的一个点得到的转迹线,这个点到内部滚动的圆的中心的距离是d。

繁花曲线规(万花尺,万花规)也是应用之一,大小齿轮的齿数之比,约为最简分数时,其分母就是小齿轮的自转数,分母与分子之和就是图案中的花瓣数。而分子就是小齿轮沿着大齿轮的公转数。所以,只要掌握这个最简分数,就能知道画出来的图案大概是什么形状的。总而言之,选择不同的齿轮与不同的孔,就可画出细腻、动人的各种曲线,例如玫瑰线、内摆线等等。

理论上通过玄学调参可以生成无数种图形可能。 示例如下:

1.png

基本步骤

1、首先我们需要导入画图和数据计算的相关库。

import numpy as np
from numpy import sin, cos
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties

2、为了在图片上显示中文,需要先加载Alibaba-PuHuiTi-Medium字体。

wget http://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/Python/miniproject/01_draw_moon_cake/Alibaba-PuHuiTi-Medium.ttf

3、这里是核心方法,根据数学中内旋轮线(hypotrochoid)参数方程,利用lambd函数生成坐标点:

x = lambda d,r,R,theta: (R-r)*np.cos(theta) + d*np.cos(((R-r)/r)*theta)
y = lambda d,r,R,theta: (R-r)*np.sin(theta) - d*np.sin(((R-r)/r)*theta)

4、接下来我们要画摆线,摆线是月饼边缘的花纹,首先添加相关参数,参数说明见注释: 这个参数是核心,理论上通过玄学调参可以生成无数种可能。可以尝试发挥。例如用for循环遍历 生成渐变动画~

# 转数-内圆旋转次数
revs = 30
# 迭代次数, 即沿绘制路径获取的点。
Niter = 9999
thetas = np.linspace(0,revs*2*np.pi,num=Niter)

d = 2  #  距离
r = 11 # 小圆半径
R = 12 # 大圆半径

5、生成摆线花纹, 可通过color和linewidth参数调整颜色和线宽。

plt.plot(x(d, r, R, thetas), y(d, r, R, thetas), color='orange', linewidth = '4')

2.png

6、然后我们再画一个圆,这个圆是月饼的主体部分。

# 画个圆
length = 2.6
theta = np.linspace(0, 2 * np.pi, 100)
x = length * cos(theta)
y = length * sin(theta)
plt.plot(x, y, color='orange', linewidth = '5')
plt.axis('equal')

3.png

7.绘制文字,使用fontproperties参数可以使用上面下载的中文字体,因为代码不多,所以把剩余所有代码都写在这里:

import numpy as np
from numpy import sin, cos
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties

x = lambda d,r,R,theta: (R-r)*np.cos(theta) + d*np.cos(((R-r)/r)*theta)
y = lambda d,r,R,theta: (R-r)*np.sin(theta) - d*np.sin(((R-r)/r)*theta)
# 转数-内圆旋转次数
revs = 30
# 迭代次数, 即沿绘制路径获取的点。
Niter = 9999
thetas = np.linspace(0,revs*2*np.pi,num=Niter)

d = 2  #  距离
r = 11 # 小圆半径
R = 12 # 大圆半径
plt.plot(x(d, r, R, thetas), y(d, r, R, thetas), color='orange', linewidth = '4')
length = 2.6
# 画个圆
theta = np.linspace(0, 2 * np.pi, 100)
x = length * cos(theta)
y = length * sin(theta)
plt.plot(x, y, color='orange', linewidth = '5')
plt.axis('equal')
plt.axis('off') # 隐藏坐标系
font_set = FontProperties(fname=r"Alibaba-PuHuiTi-Medium.ttf", size=12)
plt.text(-1.2, -1, '中秋\n快乐', bbox=dict(boxstyle='circle', fc="w", ec='orange', linewidth=4), fontproperties=font_set, fontsize=40, color='orange') ##ec为线条颜色,color为字体颜色,可以自由替换
plt.text(-3, -4, 'Python画月饼,Spaceack与您千里共禅娟', fontproperties=font_set, fontsize=20, color='#aa4a30')
plt.show()

图形预览

异形月饼: 弦月饼

4.png

魔法月饼

1.png

花环月饼

5.png

太阳月饼

6.png

改良月饼

7.png

向日葵月饼

8.png

丝绒月饼

9.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
换个dataloader函数, COCO提升3mAP ,上海交大MVIG团队提出InstaBoost
近年来最新的一系列实例分割模型,例如 Mask R-CNN 等,其高准确度很大程度上依赖于大量的训练数据(COCO 数据集包含 20 余万张训练图片)。但是获取像素级别的标注是一项成本高昂且复杂精细的工作。为此,上海交通大学 MVIG 实验室(卢策吾团队)提出了 InstaBoost——一种基于 crop-paste 的实例分割数据增强方法。实验表明,在 Mask R-CNN 和 Cascade R-CNN 等框架中应用 InstaBoost,可以在 COCO 实例分割数据集上达到 2.2 mAP 的提升。同时,该方法还能够将物体检测的精度在 COCO 数据集上最高提升 4mAP。该论文已被I
4 0
关于自学django的服务器实践的体验
很多初学者想在服务器上实践自己的学习成果,却不知道如何入手,阿里云的开发者成长计划为我们开启了这个免费的体验机会,这对很多初学者来说是一个很好的实践平台,但其中还是有很多对于初学者不友好的因素,这是我第一次接触服务器,在这之前我并没有学过服务器怎么使用或者如何在服务器上部署自己开发的程序,以下是我遇到过的各种问题和解决方案。
7 0
LINUX上安装Caffe
LINUX上安装Caffe
6 0
ESC体验感受
云服务器使用感受
7 0
变量的赋值定义分类和类型判断
几乎在所有编程语言当中变量是最先接触语法概念,那么什么是变量,变量应该怎么定义呢,定义变量又该注意哪些因素呢?这里我们来给大家详细聊聊。
8 0
除了闹过腥风血雨的fastjson,你还知道哪些Java解析JSON的利器?(1)
除了闹过腥风血雨的fastjson,你还知道哪些Java解析JSON的利器?
4 0
将博客从Hexo迁移至Hugo
自从了解了Github Pages这种静态博客后,开始喜欢上这种技术人员才能鼓捣明白的协作方式。自己的博客系统也从最初的Octopress,切换到Hexo,直到最近看到Hugo这种号称全球最快的静态博客系统,被适合技术人员的风格样式所吸引。于是在经历了三天的折腾后,顺利的将Hexo迁移至Hugo中。
5 0
python3编译caffe错误:cannot find -lboost_python3
python3编译caffe错误:cannot find -lboost_python3
4 0
阿里云&树莓派通信记录
本文详细介绍如何使用阿里云服务器与小程序之间完成通讯。
9 0
+关注
4
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载