网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

入门教程、案例源码、学习资料、读者群

请访问:python666.cn

大家好,欢迎来到 Crossin的编程教室 !

就要放假了,大家都想好去哪里happy了嘛~

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

图1. 月饼效果图

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

首先导入各种需要的库:


import numpy as npfrom numpy import sin, cos, piimport matplotlib.pyplot as pltimport matplotlib.patches as mpatchfrom matplotlib.patches import Arc, Circle, Wedgefrom matplotlib.collections import PatchCollection

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


length = 20R = 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

来源:Crossin的编程教室

完整代码:

https://gitee.com/crossin/snippet/tree/master/mooncake

Crossin的第2本书 《码上行动:利用Python与ChatGPT高效搞定Excel数据分析》 已经上市了 。

本书从 Python 和 Excel 结合使用的角度讲解处理分析数据的思路、方法与实战应用。不论是希望从事数据分析岗位的学习者,还是其他职业的办公人员,都可以通过本书的学习掌握 Python 分析数据的技能。书中创新性地将 ChatGPT 引入到教学当中,用 ChatGPT 答疑并提供实训代码,并介绍了使用 ChatGPT 辅助学习的一些实用技巧,给学习者带来全新的学习方式。

读者朋友们购买后可在后台联系我,加入读者交流群,Crossin会为你开启陪读模式,解答你在阅读本书时的一切疑问。

【教程】:python

【答疑】:666

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
比亚迪官宣:6月23日,新车正式上市!

比亚迪官宣:6月23日,新车正式上市!

科技堡垒
2026-06-23 10:00:46
与梅西一同庆祝记者:这是我的人生照片!我手机的消息都快爆了

与梅西一同庆祝记者:这是我的人生照片!我手机的消息都快爆了

云隐南山
2026-06-23 16:10:12
终于有经济学家批评体制内退休金太高、加剧代际矛盾,评论区炸锅

终于有经济学家批评体制内退休金太高、加剧代际矛盾,评论区炸锅

慧翔百科
2026-06-23 08:47:02
好猛,强回波靠近!明天大转折!台风消息!

好猛,强回波靠近!明天大转折!台风消息!

浙江天气
2026-06-23 18:24:09
恐怖?哈兰德国家队52场59球 世界杯生涯前2场均双响+狂刷6大纪录

恐怖?哈兰德国家队52场59球 世界杯生涯前2场均双响+狂刷6大纪录

我爱英超
2026-06-23 10:03:17
曾被云南镇雄县公安局原副局长举报伪造、篡改笔录,涉事办案人员已不再担任县信访局局长职务

曾被云南镇雄县公安局原副局长举报伪造、篡改笔录,涉事办案人员已不再担任县信访局局长职务

大风新闻
2026-06-23 11:32:12
二婚带娃女子要了40万彩礼、116克黄金和80万婚房,现在不结婚也不退钱!在杭打工父子求助都市快报:怎么办?

二婚带娃女子要了40万彩礼、116克黄金和80万婚房,现在不结婚也不退钱!在杭打工父子求助都市快报:怎么办?

都市快报橙柿互动
2026-06-23 01:56:17
大罗:梅西已经超越了所有前辈,我38岁体重都涨到120公斤了

大罗:梅西已经超越了所有前辈,我38岁体重都涨到120公斤了

懂球帝
2026-06-23 14:29:34
成年球员围殴U15希望之星,中国足球已经下作成这样

成年球员围殴U15希望之星,中国足球已经下作成这样

晓看说
2026-06-22 23:06:01
江苏执法人员开公车收礼被监控拍下,12345举报后竟被要求做伪证

江苏执法人员开公车收礼被监控拍下,12345举报后竟被要求做伪证

听心堂
2026-06-23 16:38:07
世界杯夺冠走势越来越明朗了,这六支队之外,基本可以洗洗睡

世界杯夺冠走势越来越明朗了,这六支队之外,基本可以洗洗睡

观星娱记
2026-06-23 11:45:26
成都舞厅最新通告,严禁剪刀手!部分舞吧仅10元,退休群体享特惠

成都舞厅最新通告,严禁剪刀手!部分舞吧仅10元,退休群体享特惠

火山詩话
2026-06-23 17:28:47
商家:今年吃杨梅的都赚到了!福建“泡药杨梅”事件后,一箱浙江杨梅从138元跌到110元

商家:今年吃杨梅的都赚到了!福建“泡药杨梅”事件后,一箱浙江杨梅从138元跌到110元

第一财经资讯
2026-06-23 16:47:29
相当炸裂 !女子试衣遭孩童掀开帘,全身裸露,被多名男性围观!

相当炸裂 !女子试衣遭孩童掀开帘,全身裸露,被多名男性围观!

阿玲诗话
2026-06-22 21:07:47
网友吐槽“被WPS背刺了”,公司回应

网友吐槽“被WPS背刺了”,公司回应

南方都市报
2026-06-23 20:17:09
车主称踩下刹车,特斯拉反而加速,路口“飙到110km/h”:保险还没生效就撞报废了;特斯拉方回复:事发前没有发现制动系统异常

车主称踩下刹车,特斯拉反而加速,路口“飙到110km/h”:保险还没生效就撞报废了;特斯拉方回复:事发前没有发现制动系统异常

极目新闻
2026-06-23 13:25:20
广德车祸家属称两小孩已经去世,肇事女司机被带走时都快哭了

广德车祸家属称两小孩已经去世,肇事女司机被带走时都快哭了

映射生活的身影
2026-06-23 16:28:07
世界杯32强决出6席!阿根廷进天堂半区,避开5大前冠军,4强稳了

世界杯32强决出6席!阿根廷进天堂半区,避开5大前冠军,4强稳了

球场没跑道
2026-06-23 17:17:48
达成了!重磅3方大交易!篮网彻底告别里夫斯

达成了!重磅3方大交易!篮网彻底告别里夫斯

篮球实战宝典
2026-06-23 14:56:53
阿尔及利亚2比1约旦,“救赎之战”完成逆转掌握出线主动权

阿尔及利亚2比1约旦,“救赎之战”完成逆转掌握出线主动权

澎湃新闻
2026-06-23 13:02:28
2026-06-23 20:56:49
Crossin编程教室 incentive-icons
Crossin编程教室
简单有趣的python入门
431文章数 709关注度
往期回顾 全部

科技要闻

48名中国开发者联名举报苹果

头条要闻

17岁女孩被闺蜜持刀刺成重伤对方自杀身亡 警方已撤案

头条要闻

17岁女孩被闺蜜持刀刺成重伤对方自杀身亡 警方已撤案

体育要闻

扬尼斯去了迈阿密:凯尔特人怎么办?

娱乐要闻

内娱95后顶流格局发生潜移默化的变化

财经要闻

屋顶光伏度苦夏

汽车要闻

华为智驾ADS限时优惠月底结束 7月1日前下订立省3000元

态度原创

家居
亲子
教育
公开课
军事航空

家居要闻

绿意盎然 自然之境

亲子要闻

可可爱爱充满期待

教育要闻

2026天津高考分数线公布!本科线458!特控线547!较去年降低!

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

以色列总理、国防部长和国防军总参谋长发表联合声明

无障碍浏览 进入关怀版