阿里天池-“Python绘制月饼,云上中秋”:Python元祖冰皮月饼海报制作

1 篇文章 0 订阅
1 篇文章 0 订阅
#%% md

### Python元祖冰皮月饼海报制作

#%% md

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

#%%

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
from matplotlib.font_manager import FontProperties

#%% md

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

#%%

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

#%% md

3、然后设置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

#%% md

4、接下来我们要月饼边缘的花纹:此处将普通的弧线替换成普通的圆,这样就可以做出填充效果了

#%%

arc1 = Circle((0,length), r, ec='#E2E1E3', fc='#E8FDFE', linewidth=4)
arc2 = Circle((-length/2, length/2*3**0.5), r, ec='#E2E1E3', fc='#E8FDFE', linewidth=4)
arc3 = Circle((-length/2*3**0.5, length/2), r, ec='#E2E1E3', fc='#E8FDFE', linewidth=4)
arc4 = Circle((-length, 0), r, ec='#E2E1E3', fc='#E8FDFE', linewidth=4)
arc5 = Circle((-length/2*3**0.5, -length/2), r, ec='#E2E1E3', fc='#E8FDFE', linewidth=4)
arc6 = Circle((-length/2, -length/2*3**0.5), r, ec='#E2E1E3', fc='#E8FDFE', linewidth=4)
arc7 = Circle((0, -length), r, ec='#E2E1E3', fc='#E8FDFE', linewidth=4)
arc8 = Circle((length/2, -length/2*3**0.5), r, ec='#E2E1E3', fc='#E8FDFE', linewidth=4)
arc9 = Circle((length/2*3**0.5, -length/2), r, ec='#E2E1E3', fc='#E8FDFE', linewidth=4)
arc10 = Circle((length, 0), r, ec='#E2E1E3', fc='#E8FDFE', linewidth=4)
arc11 = Circle((length/2*3**0.5, length/2), r, ec='#E2E1E3', fc='#E8FDFE', linewidth=4)
arc12 = Circle((length/2, length/2*3**0.5), r, ec='#E2E1E3', fc='#E8FDFE', linewidth=4)

#%% md

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

#%%

circle = Circle((0,0), R, ec='#E2E1E3', fc='#E8FDFE', linewidth=4) ##ec为线条颜色,fc为填充颜色,可以自由替换

#%% md

7、这里变量R就是这个大圆的半径,边线颜色(ec)设置为橙色,表面颜色设为白色。
接下来我们再画上一些花纹,这些花纹主要由8个扇形组成,其中有4个大的扇形和4个小的扇形,我们先画一个,代码如下:

#%%

wedge1 = Wedge([-1.5, 1.5], R-4, 90, 180,
               ec='#E5E5E7', fc=r'#E8FDFE', linewidth=4) ##ec为线条颜色,fc为填充颜色,可以自由替换

#%% md

8、其中[-2, 2]是这个Wedge所代表的圆的圆心,R-5 是其半径,90 和180分别代表起始和终止角度,ec、fc和linewidth这些都和前面Arc类的用法相似,这8个扇形的效果图如图4所示。在图中笔者标出了wedge1、wedge2、wedge5和wedge6的位置,所有扇形按照逆时针方向放置。
了解以后我们把剩下的部分给画完

#%%

wedge2 = Wedge([-3.5, 3.5], R-8.5, 90, 180, ec='#E2E1E3',
               fc=r'#E8FDFE', linewidth=4)
wedge22 = Wedge([-5, 5], R-12, 90, 180, ec='#E2E1E3',
               fc=r'#E8FDFE', linewidth=4)

wedge3 = Wedge([-1.5, -1.5], R-4, 180, 270, ec='#E5E5E7', 
               fc=r'#E8FDFE', linewidth=4)
wedge4 = Wedge([-3.5, -3.5], R-8.5, 180, 270, ec='#E2E1E3', 
               fc=r'#E8FDFE', linewidth=4)
wedge42 = Wedge([-5, -5], R-12, 180, 270, ec='#E2E1E3', 
               fc=r'#E8FDFE', linewidth=4)

wedge5 = Wedge([1.5, -1.5], R-4, 270, 360, ec='#E5E5E7', 
               fc=r'#E8FDFE', linewidth=4)
wedge6 = Wedge([3.5, -3.5], R-8.5, 270, 360, ec='#E2E1E3', 
               fc=r'#E8FDFE', linewidth=4)
wedge62 = Wedge([5, -5], R-12, 270, 360, ec='#E2E1E3',
               fc=r'#E8FDFE', linewidth=4)

wedge7 = Wedge([1.5, 1.5], R-4, 0, 90, ec='#E5E5E7', 
               fc=r'#E8FDFE', linewidth=4)
wedge8 = Wedge([3.5, 3.5], R-8.5, 0, 90, ec='#E2E1E3', 
               fc=r'#E8FDFE', linewidth=4)
wedge82 = Wedge([5, 5], R-12, 0, 90, ec='#E2E1E3',
               fc=r'#E8FDFE', linewidth=4)

#%% md

9、最后我们再把自己取好的名称加上,因为代码不多,所以把剩余所有代码都写在这里:

#%%

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, wedge22, wedge42, wedge62, wedge82])
# plt.style.use('dark_background')
# plt.style.use('fivethirtyeight')
fig, ax = plt.subplots(figsize=(8,8), facecolor='darkslategray')
ax.set_aspect('equal')
for a in art_list:
    ax.add_patch(a)
    
plt.axis('off')
font_set = FontProperties(fname=r"Alibaba-PuHuiTi-Medium.ttf", size=12) ##可以自由下载字体使用
plt.text(-14, 7.5, '冰',fontproperties=font_set, bbox=dict(boxstyle='square', fc="#E8FDFE", ec='#E2E1E3', linewidth=2, alpha=0),  fontsize=50, color='#D8E6EC') ##ec为线条颜色,color为字体颜色,可以自由替换
plt.text(7, 7.5, '皮',fontproperties=font_set, bbox=dict(boxstyle='square', fc="#E8FDFE", ec='#E2E1E3', linewidth=2, alpha=0),  fontsize=50, color='#D8E6EC')
plt.text(-14, -13, '月',fontproperties=font_set, bbox=dict(boxstyle='square', fc="#E8FDFE", ec='#E2E1E3', linewidth=2, alpha=0),  fontsize=50, color='#D8E6EC') ##ec为线条颜色,color为字体颜色,可以自由替换
plt.text(7, -13, '饼',fontproperties=font_set, bbox=dict(boxstyle='square', fc="#E8FDFE", ec='#E2E1E3', linewidth=2, alpha=0),  fontsize=50, color='#D8E6EC')
plt.text(-28, -33, '     元组冰淇淋冰皮月饼',fontproperties=font_set, fontsize=30, color='#aa4a30')
plt.ylim([-35, 35])
plt.xlim([-35, 35])

plt.savefig("img.png")  # 注意,一定要放在show()之前,不然保存图片为空白
plt.show()

#%%


最后生成的月饼海报图片如图所示:

 

参考链接:

fork from Python画月饼,云上过中秋花纹填充

https://tianchi.aliyun.com/notebook-ai/detail?spm=5176.12586969.1002.24.13bc7a94e6ukqO&postId=133174


fork from Python入门项目:如何利用Python绘制月饼,云上中秋(官方代码)

https://tianchi.aliyun.com/notebook-ai/detail?spm=5176.12586969.1002.3.13bc7a94e6ukqO&postId=132700

 

具体操作参考:

https://tianchi.aliyun.com/competition/entrance/531836/information

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值