作者简介:Mort,数据分析爱好者,擅长数据可视化,比较关注机器学习领域,希望能和业内朋友多学习交流。
笔者前两天在浏览matplotlib官方网站时,无意中看到一个挺有意思的图片,就是用matplotlib制作的火狐浏览器的logo,也就是下面这个东东(网页地址是https://matplotlib.org/gallery/showcase/firefox.html#sphx-glr-gallery-showcase-firefox-py
)。顿时再次感到Python的强大,当时就有了一个想法,笔者最常用的是Chrome浏览器,能不能用Python制作一个Chrome的logo呢,于是乎就动手试了一下,没想到还真成功了,下面就分享一下制作的过程。
图1. matplotlib制作的火狐logo
首先给大家展示一下Chrome浏览器官方的logo,就是下面的这个图片。Chrome的logo实际上非常简单,比火狐的要容易不少,基本上就是红、绿、黄三部分和中间的那个圆,中间的圆圈很好处理,主要就是红、绿、黄这三部分复杂一些,因为每个色块都是一个不规则图形。但我们仔细观察就会发现,每个色块其实可以分为两个规则的图形,大致就是一个扇形的顶部(即扇形去掉下面的三角形)加上一个小三角形,这样分解一下就容易多了。如果看到这里还没明白,不要紧,后面会一步一步分析一下。
图2. Chrome/Chromium官方logo
首先还是导入需要的各种包。
import matplotlib.pyplot as plt
from matplotlib.collections import PatchCollection
from matplotlib.patches import Circle, Wedge, Polygon
接下来一步一步分析。首先从3个色块开始处理,刚才说了,每个色块相当于一个扇形顶部+一个小三角形,那么我们先画出3个扇形,每个扇形是三分之一个圆。代码如下。
fig, ax = plt.subplots(figsize=[8, 8])
plt.ylim([0,40])
plt.xlim([0,40])
patches = []
w1 = Wedge(center=[20,20], r=10, theta1=30, theta2=150, facecolor='red', edgecolor=None, zorder=1)
w2 = Wedge(center=[20,20], r=10, theta1=150, theta2=270, facecolor='green', edgecolor=None, zorder=1)
w3 = Wedge(center=[20,20], r=10, theta1=270, theta2=390, facecolor='yellow', edgecolor=None, zorder=1)
patches.extend([w1, w2, w3])
为了把这3个色块的效果展示出来,我们还要再加上下面3行代码。这3行代码我们暂且称为“显示代码”,用来显示结果,之所以分得如此细致,是因为要让大家了解每个步骤的原理,实际上最后的代码是全部连在一起的,这3行“显示代码”是在全部代码的最后。
p = PatchCollection(patches, match_original=True)
ax.add_collection(p)
plt.show()
图3. 绘制的3个扇形
再接下来加上3个小三角形。
p1 = Polygon([[20-5*3**0.5, 25], [20-2.5*3**0.5, 17.5], [20, 25]], facecolor='red', edgecolor=None, zorder=2)
p2 = Polygon([[20-2.5*3**0.5, 17.5], [20, 10], [20+2.5*3**0.5, 17.5]], facecolor='green', edgecolor=None, zorder=2)
p3 = Polygon([[20+2.5*3**0.5, 17.5], [20+5*3**0.5, 25], [20, 25]], facecolor='yellow', edgecolor=None, zorder=2)
patches.extend([p1, p2, p3])
加上以后显示结果如下图所示。
图4. 3个扇形加上3个小三角形
这个图有点不太规则,可能这里有人不太明白,这3个小三角形到底加到了哪里。表慌,我们把原来的3个扇形去掉,只添加3个小三角形,再看看结果,如下图所示。
图5. 单独绘制的3个小三角形
这下应该清楚多了。这3个小三角形都是等边三角形,其边长正好等于扇形顶部那条直角边的一半,每个三角形都有两条边和相邻两个扇形顶部的直角边重合。然后我们再加上两个圆,代码如下。
c1 = Circle((20, 20), 5, facecolor='white', edgecolor=None, zorder=3)
c2 = Circle((20, 20), 4, facecolor='blue', edgecolor=None, zorder=4)
patches.extend([c1, c2])
第一个圆大一点,是白色,第二个小一点,是蓝色的,两个是同心圆,圆心正好和3个扇形的圆心重合,完成图如下。这里有两点要注意的,一是每个图形的zorder属性,这个数字越大,图层越靠上,上面的图层会覆盖下面的图层;二是显示代码中,有一行代码是p = PatchCollection(patches, match_original=True),match_original
意思是匹配原有图形的属性,如果不加这个属性或者设置为False,那么原有图形的设置就不会显示,而是按照系统默认的方式显示,最终的结果可能不是我们想要的,所以一定要把这个属性设置为True。
图6. matplotlib制作的Chrome logo
最后再加上“冰块版”的Chromium和“油炸版”的Canary Chrome这两个的logo,只要把上面代码的颜色换一下就行了,冰块版中的4种颜色是“#2976bb”
、“#75bbfd”
、“#a2cffe”
和“#1e90ff”
,油炸版中的4种颜色是“#cb9d06”
、“#fac205”
、“#f4d054”
和“#f5bf03”
。
图7. matplotlib制作的Chromium logo
图8. matplotlib制作的Canary Chrome logo
好了,用matplotlib制作Chrome浏览器logo的方法就介绍完了。最后还有一个问题,世界3大浏览器,火狐和Chrome都能用Python制作了,只剩下微软的edge了……
图9. 微软edge浏览器logo