查看原文
其他

圆蛋快乐

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:陈志玲

文字编辑:钱梦璇

技术总编:张   邯



爬虫俱乐部将于2020年1月5日至11日湖北武汉举行为期一周的Stata编程技术定制培训,此次采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~详细培训大纲及报名方式,请点击《爬虫俱乐部2020第一期Stata编程训练营开始报名啦!》或点击文末阅读原文呦~


2020来了,2020来了,2020悄无声息地来了!转眼我们已经到了2020年,在此,爬虫俱乐部全体成员祝各位:



新的一年开始了,不管过去的一年是好是坏,希望我们都可以在小憩之后愉快地踏上新的征程。大家有没有觉得蛋蛋有点可爱呢?“元旦快乐”是不是写得很工整呢?哈哈哈,这都是我们即将介绍的turtle库的功劳哦。

turtle库是Python的一个内置库,也叫海龟绘图,最初是为了用来引导孩子学习编程的。它是依据坐标轴来绘制图像,可通过控制画笔(想象成一个海龟)在坐标平面上移动,来绘制你想要的各式各样的图像或者文字。因为是内置库,所以我们直接导入turtle库就可使用其中的各种函数。

from turtle import *

turtle库中的所有函数基本可以分为设置画布和控制画笔这两类。当想画画时我们要先准备画板,同样地,当我们想用turtle来绘制图像时,也要先设置画布。

 

一、画布

首先我们要选择画板的大小,即设置绘图区域的大小和位置:

turtle.screensize(canvwidth=None, canvheight=None, bg=None)

该函数的参数分别设置画板的宽、高和背景颜色,如果不设置一般默认画布大小为(400,300)。

 

我们先设置一个400*400的海贝色画布:
screensize(400,400,'seashell')

二、画笔

设置好画布的大小和颜色之后,就可以开始拿起画笔,于是我们开始挑选画笔的粗细和颜色,接着开始控制画笔走向和距离等。


函数

功能

turtle.pensize()

设置画笔的宽度

turtle.pencolor()

设置画笔的颜色

turtle.forward(distance)

画笔向前移动距离

turtle.backward(distance)

画笔向后移动距离

turtle.right(degree)

画笔顺时针移动角度

turtle.left(degree)

画笔逆时针移动角度

penup()

提笔移动(只移不画)

pendown()

落笔移动(边画边移)

turtle.goto(x,y)

画笔将要移到位置

turtle.circle()

画圆

turtle.fillcolor(colorstring)

填充颜色

turtle.begin_fill()

开始填充

turtle.end_fill()

结束填充

turtle.hideturtle()

隐藏画笔


简单介绍一下circle函数的使用:turtle.circle(radius,extent=None, steps=None)

radius参数是指定圆的半径,当其为正(负)时表示圆心在笔的左(右)边。extent为可选参数,表示圆的弧度。steps也为可选参数,代表画半径为radius的圆的内切多边形的边数。

例如画一个三角形:
circle(30,steps=3)

以上就是我们调用turtle库时常用的函数,还有一个最重要的函数。如果没有它你的程序可能永远不会终止结束,所以它是乌龟图形程序的最后一个语句,即:

turtle.mainloop()turtle.done()

三、“元”

    因为每一个字都有很多笔画,所以本文将每一个字都封装成一个函数,通过调用函数来实现。

元,代表“始”,凡数之始成为“元”,我们今天将详细介绍画“元”的程序。因为要写四个字,故将画布分为四部分,即和坐标轴中的象限正好吻合,“元”在第二象限,“旦”在第一象限,“快”在第三象限,“乐”在第四象限。

在上文中我们已经导入了turtle库,并且设置画布大小和颜色。接下来是画笔准备工作:
def yuan(): #首先定义函数yuan()  pensize(10)  #画笔粗细为10  pencolor('purple') #画笔颜色为紫色
第一笔,一横:
up() #提起画笔pensize(10) #画笔粗细为10pencolor('purple') #画笔颜色为紫色goto(-200,200) #将画笔移至坐标为(-200,200)的位置down() #落笔开始画goto(-140,200)    #画至坐标为(-140,200)的位置
第二笔,一横:
up()#再次提笔移动goto(-220,170)#移至坐标为(-220,170)的位置down()#落笔开始画goto(-120,170)#画至坐标为(-120,170)的位置,即第二笔,一横
第三笔,一捺:
backward(50)#此时画笔还在第二横的末尾,将画笔反向移动50像素right(90) #将画笔顺时针旋转90度a=1 #因为此笔为一捺,所以需要有弯度,通过循环使角度不断变化for i in range(0,25): #将弯度限制在25度之内a=a+0.2right(2.5)#每次循环顺时针旋转2.5度forward(a)#向前移动a像素
最后一笔,竖弯钩:
up() #提笔移动goto(-160,170) #移至(-160,170)down()#落笔移动left(62.5)#逆时针旋转62.5度forward(65)#向前65像素 ,即竖left(90)#再逆时针旋转90度forward(50)#再向前50像素,即弯left(90)#在逆时针旋转90度forward(15)#再向前15像素,即钩

至于中间为什么会有一个逆时针旋转62.5度呢?得解释一下,在画捺时,我们循环了25次,每次顺时针旋转2.5度,那么当捺写完时我们向右边转了25*2.5=62.5度。所以当我们想回到之前的位置和方向时就不得不逆时针旋转62.5度。

在“元”字的程序中小编并没有放入隐藏画笔(hideturtle())和结束循环(done())的函数。因为程序后面还有三个字和一个蛋没有完成,如果放入会导致后面的程序无法运行或者即使运行了也无法看见。

用turtle库写字就是不停的变换坐标,所以在画之前要先在纸上计算好坐标。如果不想用坐标,你也可以使用变换画笔角度,使用向前或反向移动,但那也得提前算好每一笔之间的角度。不过小编认为角度比坐标更难找,很容易晕头转向。当然turtle库的奇妙之处远不止此,但不管用其画什么内容都离不开以上所介绍的函数。

 

附上完整程序:

from turtle import *screensize(400,400,'seashell')
def yuan(): pensize(10) pencolor('purple') up() goto(-200,200) down() goto(-140,200) up() goto(-220,170) down() goto(-120,170)backward(50) right(90) a=1 for i in range(90,115): a=a+0.2 right(2.5) forward(a) up() goto(-160,170) down() left(62.5) forward(65) left(90) forward(50) left(90) forward(15)def dan(): width(10) pencolor('red') up() goto(120,200) down() goto(125,130) up() goto(120,200) down() goto(200,200) right(90) goto(190,130) up() goto(135,165) down() forward(50) up() goto(125,130) down() forward(60) up() goto(100,100) down() forward(120)def kuai(): width(10) pencolor('yellow') up() goto(-200,-110) down() goto(-200,-220) up() goto(-210,-160) down() goto(-225,-180) up() goto(-190,-160) down() goto(-180,-170) up() goto(-160,-130) down() goto(-110,-130) goto(-110,-160) up() goto(-170,-160) down() goto(-90,-160) up() goto(-130,-110) down() goto(-160,-220) up() goto(-140,-160) down() goto(-100,-215)def le(): width(10) pencolor('pink') up() goto(190,-110) down() goto(130,-120) goto(120,-170) goto(210,-170) up() goto(165,-120) down() goto(165,-230) goto(140,-210) up() goto(140,-190) down() goto(120,-220) up() goto(180,-190) down() goto(205,-220)def dandan(): width(1) up() goto(0,-120) down() begin_fill() color("wheat","wheat") a=1 for i in range(120): if 0<=i<30 or 60<=i<90: a=a+0.2left(3) #向左转3度forward(a) #向前走a的步长 else: a=a-0.2left(3)forward(a) end_fill() pencolor("black") width(3) up() goto(-18,0) down() left(90) circle(10,180) up() goto(30,0) down() right(180) circle(10,180)
up() goto(-20,-50) down() circle(20,180)def luokuan(): up() goto(200,-280) down() write("------from 爬虫俱乐部", align="center", font=("楷体", 16, "normal")) hideturtle() done()yuan()dan()kuai()le()dandan()luokuan()

HAPPY NEW YEAR


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

BvD最后一弹——宏观数据宝典    

多图“预警”(二)

您的圣诞礼物到了,请注意查收

BvD数据库介绍之Oriana

frlink:让连接更具“目的性”

多图“预警”(一)

Selenium的等待方式
一举拿下函数图像
BvD数据库介绍之Osiris
来!左边跟我一起画个龙在你右边画一道彩虹~
Selenium登录豆瓣
妙用正则表达式--Python中的re模块(二)
cngcode和cnaddress新鲜出炉!
数据可视化之地理图

“气功”研究哪家强

数据长、宽整型之另辟蹊径

10分钟带你走进宝藏数据库BvD

实战演练——爱婴医院中莆田系医院数据分析(一)

关于我们

微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存