第9章图形绘制本章教学目标:理解tkinterCanvas图形绘制方法,掌握规则图形绘制和运用微直线法进行函数图形绘制。理解turtle库图形绘制方法,掌握规则图形绘制和运用微直线法进行函数图形绘制。了解Matplotlib库图形绘制方法及在数据可视化处理中的应用。9.1tkinter库的Canvas图形绘制方法9.1.1Canvas绘图的基本方法1.创建画布和颜色填充Canvas画布的坐标原点在左上角,默认单位是像素,x轴向右为正,y轴向下为正fromtkinterimport*root=Tk()root.geometry('320x240')mycanvas=Canvas(root,bg='red',height=200,width=280)mycanvas.pack()btn1=Button(root,text='关闭',command=root.destroy)btn1.pack()root.mainloop()【例9-1】在320×240的窗体上创建高200,宽280的画布,并填充红色。2.绘制图形【例9-2】在320×240的窗体上创建高200像素,宽300像素的画布,鼠标单击画布,依次绘出:从(90,10)到(200,200)点的矩形;从(90,10)到(200,200)点的内切椭圆并填充绿色;从(90,10)到(200,200)点的内切扇形并填充粉红色;连接(20,180)、(150,10)和(290,180)三点形成蓝色框线且无色填充的三角形;从(10,105)到(290,105)点的红色直线;以(50,10)为起点用RGB#123456颜色绘制文本标签“我的画布”。单击“清空”按钮删除所有图形fromtkinterimport*root=Tk()root.geometry('320x240')defdraw(event):#画矩形mycanvas.create_rectangle(90,10,200,200)#画椭圆,填充绿色mycanvas.create_oval(90,10,200,200,fill='green')#画扇形mycanvas.create_arc(90,10,200,200,fill='pink')#画多边形(三角形),前景色为蓝色,无填充色mycanvas.create_polygon(20,180,150,10,290,180,outline='blue',fill='')#画直线mycanvas.create_line(10,105,290,105,fill='red')#写文字,颜色为十六进制RGB字符串mycanvas.create_text(50,10,text='我的画布',fill='#123456')defdelt():#删除画布上的所有图形mycanvas.delete(ALL)mycanvas=Canvas(root,width=300,height=200)mycanvas.pack()mycanvas.bind('Button-1',draw)#画布绑定鼠标单击事件btnclear=Button(root,text='清空',command=delt)btnclear.pack()root.mainloop()3.呈现位图图像Canvas画布支持呈现位图图像文件,文件类型包括GIF(无动画)、PNG等格式,但不支持JPG格式。【例9-3】在320×240的窗体上创建画布,并呈现C:\1.gif图像fromtkinterimport*root=Tk()root.geometry('320x240')mycanvas=Canvas(root)mycanvas.pack()photo=PhotoImage(file='c:/1.gif')mycanvas.create_image(100,100,image=photo)root.mainloop()4.利用鼠标事件绘图利用按住鼠标左键移动的鼠标事件,不断读取鼠标当前位置,每次扩张1个像素绘制椭圆点,即可在画布上留下鼠标轨迹。【例9-4】在320×240的窗体上创建画布,并以蓝色笔创建鼠标画板。fromtkinterimport*root=Tk()defmove(event):x=event.xy=event.yw.create_oval(x,y,x+1,y+1,fill='blue')w=Canvas(root,width=320,height=240)w.pack()w.bind('B1-Motion',move)root.mainloop()9.1.2Canvas画布上的函数图形绘制用create_line()方法可在画布上绘制直线,而随着变量的变化,用该方法连续绘制微直线,即可得到函数的图形“分而治之”的计算思维原则【例9-5】在窗体上创建320×240的画布,以画布中心为原点,用红色绘制带箭头的x和y坐标轴,用蓝色笔绘制正弦曲线y=sinx的函数图形。其中,x、y轴的放大倍数均为40倍,即:x=40t。t以0.01的步长在-~范围内变化取值。fromtkinterimport*importmathroot=Tk()w=Canvas(root,width=320,height=240)w.pack()w0=160#半宽h0=120#半高#画红色的坐标轴线w.create_line(0,120,320,120,fill=red,arrow=LAST)w.create_line(160,240,160,0,fill=red,arrow=LAST)#标题文字w.create_text(w0+50,10,text='y=sin(x)')#x轴刻度foriinrange(-3,4):j=i*40w.create_line(j+w0,h0,j+w0,h0-5,fill=red)w.create_text(j+w0,h0+5,text=str(i))#y轴刻度foriinrange(-2,3):j=i*40w.create_line(w0,j+h0,w0+5,j+h0,fill=red)w.create_text(w0-10,j+h0,text=str(-i))#计算xdefx(t):x=t*40#x轴放大40倍x+=w0#平移x轴returnx#计算ydefy(t):y=math.sin(t)*40#y轴放大40倍y-=h0#平移y轴y=-y#y轴值反向returny#连续绘制微直线t=-math.piwhile(tmath.pi):w.create_line(x(t),y(t),x(t+0.01),y(t+0.01),fill=blue)t+=0.01root.mainloop()【例9-6】设置坐标原点(x0,y0)为画布的中心(x0,y0分别为画布宽、高的一半),以红色虚线绘制坐标轴,并按以下公式绘制函数曲线:x=(w0/32)×(cost-tsint)y=(h0/32)×(sint+tcost)式中,w0是画布宽的一半,h0是画布高的一半。t的取值范围为0~25,步长为0.01。fromtkinterimport*importmathroot=Tk()w=Canvas(root,width=600,height=600)w.pack()#画红色的坐标轴线(虚线)w.create_line(0,300,600,300,fill=red,dash=(4,4))w.create_line(300,0,300,600,fill=red,dash=(4,4))w0=300h0=300defx(t):x=(w0/32)*(math.cos(t)-t*math.sin(t))x+=w0#平移x轴returnxdefy(t):y=(h0/32)*(math.sin(t)+t*math.cos(t))y-=h0#平移y轴y=-y#y轴值反向returnyt=0.0while(t25):w.create_line(x(t),y(t),x(t+0.01),y(t+0.01),fill=blue)t+=0.01root.mainloop()9.2turtle库的图形绘制方法turtle也是内置库Python图形绘制库,其绘制方法更为简单,原理如同控制一只“小龟”以不同的方向和速度进行位移而得到其运动轨迹9.2.1turtle绘图的基本方法1.坐标位置和方向setup()方法用于初始化画布窗口大小和位置,参数包括画布窗口宽、画布窗口高、窗口在屏幕的水平起始位置和窗口在屏幕的垂直起始位置用turtle创建的画布与Canvas不同,其原点(0,0)在画布的中心,坐标方向与数学定义一致,向右、向上为正。2.画笔方法color()用于设置或返回画笔颜色方法pensize()或width()用于设置笔触粗细3.画笔控制和运动方法penup()、pu()或up()为抬笔,当笔触移动时不留墨迹;方法pendown(),pd()或down()为落笔,当笔触移动时会留下墨迹。画笔的移动方法有:向箭头所指方向前进forward()、fd();逆箭头所指方向后退backward(),bk()或back()。画笔的原地转角方法有:箭头方向左转left()或lt();箭头方向右转right()或rt()。位移至某点的方法:goto(),setpos()或setposition();画圆的方法:circle();返回原点的方法:home()。位移速度方法speed(),其取值范围从慢到快为1~10。注意:取0为最快(无移动过程,直接显示目标结果)。绘图完毕通常用方法done()结束进程。4.文字输出文字标签用write()方法,默认参数为输出文本,可选参数有:对齐方式align(left,center,right),font元组型字体设置(字体、字号、字形)【例9-7】从原点出发至坐标点(-100,100),改为红色,沿光标指向(默认方向为水平向右)前进200像素,改为蓝色,后退100像素,以动画模式输出文字(黑体,36磅,斜体)。fromturtleimport*setup(640,480,300,300)reset()pensize(5)goto(-100,100)color('red')fd(200)color('blue')bk(100)write('turtle绘图',move=True,font=('黑体',36,'italic'))done()1.简单形状图形用循环结构可自动重复绘制步骤得出规则图形。【例9-8】以5像素笔触重复执行“前进100像素,右转60度”的操作共6次,绘制红色正六边形;再用circle()方法画半径为60像素的红色圆内接正六边形;然后抬笔移动至(-50,200)点落笔,重复执行“右转144度,前进400像素”的操作共5次,绘制五角星。fromturtleimport*reset()pensize(5)#画正六边形,每步右转60度foriinrange(6):fd(100)right(60)#用circle方法画正六边形(半径为60的圆内接正六边形)color('red')circle(60,steps=6)#抬笔移动位置up()goto(-50,200)down()#画五角星,每步右转144度foriinrange(5):right(144)fd(400)done()2.函数图形用turtle库也可以完成较为复杂的函数二维图形。其方法是:抬笔至图形起点,根据起点、终点、步长及画布的半宽、半高,利用循环逐点计算(x,y)的坐标并移动笔触至该点,最终得到函数图形。【例9-9】创建800×800的turtle画布,以画布中心为原点画出坐标轴,并按以下公式绘制函数曲线:x=(w0/4)×(-2sint+sin2t)y=(h0/4)×(2cost-cos2t)式中,w0是画布宽的一半,h0是画布高的一半。t的取值范围为0~2,步长为0.01。importmathimportturtle#自定义从(x