明天是难得一见的国庆中秋双节合一,在这里除了祝大家节日快乐之外,我们还要送上一个“月饼”——当然这个月饼是不能吃的,因为它是用python做的。先给大家看一下效果图。

图1. 月饼效果图

画这样一个月饼,其实不需要太多的代码,笔者只用了不到50行代码,而且用的是我们经常用到的绘图库matplotlib,这对于我们大部分人来说是很容易上手的,下面笔者就详细介绍一下怎么画这样一个月饼。

首先导入各种需要的库:

import numpy as np
from numpy import sin, cos, pi
import matplotlib.pyplot as plt
import matplotlib.patches as mpatch
from matplotlib.patches import Arc, Circle, Wedge
from matplotlib.collections import PatchCollection

然后设置3个变量,这3个变量的用途到后面会有解释:

length = 20
R = 3**0.5*length/(3**0.5*cos(pi/12)-sin(pi/12))
r = 2*sin(pi/12)*R/3**0.5

接下来我们要画12条弧线,这12条弧线是月饼边缘的花纹:

arc1 = Arc([0, length], width=2*r, height=2*r, angle=0, theta1=30, theta2=150, ec='orange', linewidth=4)
arc2 = Arc([-length/2, length/2*3**0.5], width=2*r, height=2*r, angle=0, theta1=60, theta2=180, ec='orange', linewidth=4)
arc3 = Arc([-length/2*3**0.5, length/2], width=2*r, height=2*r, angle=0, theta1=90, theta2=210, ec='orange', linewidth=4)
arc4 = Arc([-length, 0], width=2*r, height=2*r, angle=0, theta1=120, theta2=240, ec='orange', linewidth=4)
arc5 = Arc([-length/2*3**0.5, -length/2], width=2*r, height=2*r, angle=0, theta1=150, theta2=270, ec='orange', linewidth=4)
arc6 = Arc([-length/2, -length/2*3**0.5], width=2*r, height=2*r, angle=0, theta1=180, theta2=300, ec='orange', linewidth=4)
arc7 = Arc([0, -length], width=2*r, height=2*r, angle=0, theta1=210, theta2=330, ec='orange', linewidth=4)
arc8 = Arc([length/2, -length/2*3**0.5], width=2*r, height=2*r, angle=0, theta1=240, theta2=360, ec='orange', linewidth=4)
arc9 = Arc([length/2*3**0.5, -length/2], width=2*r, height=2*r, angle=0, theta1=270, theta2=390, ec='orange', linewidth=4)
arc10 = Arc([length, 0], width=2*r, height=2*r, angle=0, theta1=300, theta2=420, ec='orange', linewidth=4)
arc11 = Arc([length/2*3**0.5, length/2], width=2*r, height=2*r, angle=0, theta1=330, theta2=450, ec='orange', linewidth=4)
arc12 = Arc([length/2, length/2*3**0.5], width=2*r, height=2*r, angle=0, theta1=0, theta2=120, ec='orange', linewidth=4)

看到这里估计很多人懵逼了,代码是不是有点多了?实际上这些弧线都是来自于同一个Arc类,它们的用法都是一样的,只不过部分参数不同,所以我们只要掌握一个,其他的全都会了。这里笔者就用arc1来说明一下:

arc1 = Arc([0, length], width=2*r, height=2*r, angle=0, theta1=30, theta2=150, ec='orange', linewidth=4)

其中 [0, length] 是这个Arc弧线的圆心,因为这个Arc类是一个椭圆形的一部分,所以其包含圆心、横轴、纵轴等参数,length变量就是arc1圆心的纵坐标,width=2*rheight=2*r 就说明这个椭圆的纵轴和横轴长度相等,其是一个圆,而不是椭圆,变量 r 就是这个圆的半径。angle=0 就是我们不需要对这个圆进行旋转,theta1=30theta2=150 是指明这个弧线的起始角度和终止角度,这里的角度分别是30度150度。而 ec='orange'linewidth=4 分别指边线的颜色和线条宽度,颜色我们设为橙色宽度为4。而这些弧线的效果图如图2所示,在图中笔者标出了arc1、arc5和arc9这3条弧线的位置,所有弧线按照逆时针方向排列。这些位置大同小异,大家只要计算好其各自的位置参数就行,这里就不再赘述了。

图2. 弧线效果图

然后我们再画一个圆,这个圆是月饼的主体部分,其圆心和整个月饼的中心是重合的,圆心位置我们选在了坐标原点,代码如下:

circle = Circle((0,0), R, ec='orange', fc='white', linewidth=4)

这里变量R就是这个大圆的半径,边线颜色设置为橙色,表面颜色设为白色。其效果如图3所示。

图3. 大圆效果图

接下来我们再画上一些花纹,这些花纹主要由8个扇形组成,其中有4个大的扇形和4个小的扇形,代码如下:

wedge1 = Wedge([-2, 2], R-5, 90, 180, ec='orange', fc=r'white', linewidth=4)
wedge2 = Wedge([-5, 5], R-12, 90, 180, ec='orange', fc=r'white', linewidth=4)
wedge3 = Wedge([-2, -2], R-5, 180, 270, ec='orange', fc=r'white', linewidth=4)
wedge4 = Wedge([-5, -5], R-12, 180, 270, ec='orange', fc=r'white', linewidth=4)
wedge5 = Wedge([2, -2], R-5, 270, 360, ec='orange', fc=r'white', linewidth=4)
wedge6 = Wedge([5, -5], R-12, 270, 360, ec='orange', fc=r'white', linewidth=4)
wedge7 = Wedge([2, 2], R-5, 0, 90, ec='orange', fc=r'white', linewidth=4)
wedge8 = Wedge([5, 5], R-12, 0, 90, ec='orange', fc=r'white', linewidth=4)

这里wedge1、wedge3、wedge5、wedge7是大扇形,wedge2、wedge4、wedge6、wedge8是小扇形,一个大扇形嵌套一个小扇形,其中wedge1嵌套wedge2,wedge3嵌套wedge4,以此类推。Wedge这个类和前面Arc有些类似,不过Wedge是圆的一部分,以wedge1为例:

wedge1 = Wedge([-2, 2], R-5, 90, 180, ec='orange', fc=r'white', linewidth=4)

其中[-2, 2]是这个Wedge所代表的圆的圆心,R-5 是其半径,90180分别代表起始和终止角度,ecfclinewidth这些都和前面Arc类的用法相似,这8个扇形的效果图如图4所示。在图中笔者标出了wedge1、wedge2、wedge5和wedge6的位置,所有扇形按照逆时针方向放置。

图4. 扇形效果图

最后我们再把公众号“CROSSIN”的名称加上,因为代码不多,所以把剩余所有代码都写在这里:

art_list = [arc1, arc2, arc3, arc4, arc5, arc6, arc7, arc8, arc9, arc10, arc11, arc12]
art_list.extend([circle, wedge1, wedge2, wedge3, wedge4, wedge5, wedge6, wedge7, wedge8])
fig, ax = plt.subplots(figsize=(8,8))
ax.set_aspect('equal')
for a in art_list:ax.add_patch(a)plt.text(-18, -2.5, 'CROSSIN', fontfamily=r'Times New Man', bbox=dict(boxstyle='square', fc="w", ec='orange', linewidth=4),  fontsize=50, color='orange')plt.ylim([-35, 35])
plt.xlim([-35, 35])plt.show()

art_list是我们设置的一个list变量,里面放有arc1到arc12这12个图形,然后再把circle以及8个扇形都加进去。ax.set_aspect('equal')是设置整个图形x轴和y轴同比例,for a in art_list: ax.add_patch(a) 是把art_list中所有图形加入到画布当中。而plt.text这行代码中,-18和-2.5是这个text的左下角的坐标,fontfamilyfontsize 分别是文字的字体和大小,bbox 是设置text边框的格式,这些参数也都和前面讲过的很多参数差不多,这里不再赘述。plt.ylimplt.xlim是设置整个画布的坐标范围。最终效果如图1所示。

当然我们也可以改变图片的颜色,比如设置成蓝色的,如图5所示,这个完全可以根据个人爱好而定。

图5. 蓝色月饼图

笔者在这里用了不到50行代码就画出了一个月饼,其中还有不少复用的,所以核心只有几个绘图函数,理解起来并不难。你也可以自己动手试一试,定制一块你自己的月饼。

最后再次祝大家,中秋快乐!国庆快乐!

作者:tyran
完整代码:https://gitee.com/crossin/snippet/tree/master/mooncake

----

获取更多教程和案例,

欢迎搜索及关注:Crossin的编程教室

这里还有更多精彩。一起学,走得远!

python做日历牌_中秋节到了,送你一个Python做的Crossin牌“月饼”相关推荐

  1. python gui测试工具_在Suse10下尝试dogtail(一个python的GUI测试工具..

    你的位置: 技术文档 -> Python -> 文档详情 在Suse10下尝试dogtail(一个python的GUI测试工具.. 零 简介: DogTail是一个用python写的,自动 ...

  2. python制作中秋贺卡_中秋节到了,送你一个Python做的Crossin牌“月饼”

    明天是难得一见的国庆中秋双节合一,在这里除了祝大家节日快乐之外,我们还要送上一个"月饼"--当然这个月饼是不能吃的,因为它是用python做的.先给大家看一下效果图.图1. 月饼效 ...

  3. python画圆形螺旋线_中秋节到了,送你一个Python做的Crossin牌“月饼”

    明天是难得一见的国庆中秋双节合一,在这里除了祝大家节日快乐之外,我们还要送上一个"月饼"--当然这个月饼是不能吃的,因为它是用python做的.先给大家看一下效果图. 图1. 月饼 ...

  4. 中秋节到了,送你一个Python做的Crossin牌“月饼”

    明天是难得一见的国庆中秋双节合一,在这里除了祝大家节日快乐之外,我们还要送上一个"月饼"--当然这个月饼是不能吃的,因为它是用python做的.先给大家看一下效果图. 图1. 月饼 ...

  5. python 做网页_女生30岁以前,怎么早做打算

    庆哥 爱美水瓶座玩转广式煲汤养生干货总结癖有位网友说,她人生焦虑值达到巅峰是29岁那一年.即将步入30岁大军,已婚未育,工作7年,工资和入职时差不了多少,想跳槽又尴尬.在职场里,30岁,是不是女人的大 ...

  6. python爬财务数据_会计终于不用被老板催着做报表,现在95%的财务都在悄悄办这事了!...

    "我被解雇了!" 依依万万也没想到,每天任劳任怨,拼命工作,最后被裁掉的人竟然是自己. 毕业之后她就来到这家公司做财务,即便工资很低,却还是对这份工作很满足.每天只想着努力学习,多 ...

  7. python 字符串拼接_面试官让用 3 种 python 方法实现字符串拼接 ?对不起我有8种……...

    点击上方 蓝字关注我们 点击上方"印象python",选择"星标"公众号重磅干货,第一时间送达!之前发过很多关于 Python 学习的文章,收到大家不少的好评, ...

  8. python函数编程实战_(转)函数式编程实战教程(Python版)

    许多函数式文章讲述的是组合,流水线和高阶函数这样的抽象函数式技术.本文不同,它展示了人们每天编写的命令式,非函数式代码示例,以及将这些示例转换为函数式风格. 文章的第一部分将一些短小的数据转换循环重写 ...

  9. python vector 初始化_从零开始搭建机器学习算法框架(python)--计算框架

    介绍 今天开始一个新的系列,这个系列的目标是用python在不使用任何第三方库的情况下去实现各类机器学习或者深度学习的算法.之所以会有这种想法是因为每当我想提高编程技巧的时候,我总希望能够做一些简单又 ...

最新文章

  1. 程序员福音-定时提醒bat
  2. 米兔点读笔点读包_小米米兔点读笔评测:养成教育只要轻松一点
  3. linux系统下一个冷门的RAID卡ioc0及其监控mpt-status
  4. Files.newDirectoryStream扫描/过滤目录文件
  5. C#中LINQ技术的简单小例
  6. 无监督和有监督的区别_无监督元学习(Unsupervised Meta-Learning)
  7. 20100506网络互联技术实验
  8. 多重线性回归 多元线性回归_了解多元线性回归
  9. 基础才是重中之重~开发人员应用学会用throw
  10. c3p0配置及其说明
  11. 华为零售商品识别一等奖方案
  12. Windows10系统下PaddleOCR文本检测和文本识别安装
  13. 物联网传感技术——光纤传感器
  14. Windows 10驱动开发入门(五):创建虚拟显示器 Indirect Display驱动开发
  15. c语言表达式判断语法错误题,大连理工大学C语言模拟题机房题库单选、判断、填空(分章节_共十一章)...
  16. PCIe总线的参考时钟与同步时钟的差异
  17. 别着急抢iPhone 13了!拍照有马赛克,苹果确认部分iPhone13存在bug
  18. mercury添加虚拟服务器,mercury怎么设置虚拟服务器
  19. nvidia驱动版本查询
  20. IDEA 2021一键修改文件后缀名方法

热门文章

  1. ITIL基础概述与实战案例分析(下)
  2. 将本地已经存在的代码跟github上新建的仓库建立关联,解决“fatal: 'origin' does not appear to be a git repository...”
  3. 用JAVA制作小游戏——推箱子(二)
  4. php 导出excel类,php 导出excel类
  5. PHP 中 empty is_null 和 isset 的测试
  6. chrome 发送请求出现:Provisional headers are shown 提示
  7. 二. 线程管理之线程池
  8. SHELL $RANDOM产生的随机数范围是0到32767
  9. HBase编程 API入门系列之create(管理端而言)(8)
  10. C++ 0x: 内存模型