Python绘图Turtle库,改变原点坐标,建立平面直角坐标系(一)

        今天本人用Python里的Turtle库,画了如上图的一个时序图,开始考虑的是用 matplotlib 模块,matplotlib有方便的数据可视化功能,能轻松画出柱状图和直方图等统计图。但是因为matplotlib模块里的操作繁多,相对于Turtle库,另外时序图的画法也很符合turtle模块的绘图思路。

       要在画布上画出一个相对横轴较长的单象限平面直角坐标系,先确定坐标系原点(-300,0),画布初始原点是在画布正中心的。所以以后每次使用goto方法进行坐标移动的时候都要在横坐标进行一个 - 300操作,我们不妨将‘画布原点’与坐标系原点重合。

def D(x, y):
    '''将画布坐标原点重置为(-300,0)位置'''
    return x - 300, y

     这样进行坐标移动时就可以不用 - 300了,比如画笔移动到坐标原点处可以写为trutle.goto(D(0, 0)) ,不用写为trutle.goto(-300, 0)了。

 

以下为绘制坐标轴函数:

import turtle


def x_y(pen, x_name='x', y_name='y'):
    '''绘制直角坐标系'''
    pen.pensize(2)
    pen.up()
    pen.goto(D(0, 0))
    pen.down()
    pen.goto(D(600, 0));pen.goto(D(595, 5));pen.goto(D(600, 0));pen.goto(D(595, -5))
    pen.up();pen.goto(D(600, -20));pen.write(x_name)
    pen.goto(D(0, 0))
    pen.down()
    pen.goto(D(0, 300));pen.goto(D(-5, 295));pen.goto(D(0, 300));pen.goto(D(5, 295))
    pen.up();pen.goto(D(-28, 305));pen.write(y_name)
t = turtle.Pen()
t.ht()
x_y(t)

      上面的x_y函数就是绘制一个如上图所示横轴为x,纵轴为y的坐标系。运行x_y完成绘制。                                                      函数的后两个默认参数是横轴、纵轴含义单位,默认为x、y。函数中第6和第7行为横坐标轴绘制,第10和第11行为纵坐标轴绘制。

 

——四月二十六日更新Python绘图Turtle库,改变原点坐标,建立自定义坐标象限和刻度的平面直角坐标系(二)——

 

 

      最后附上第一张图的完整代码:

import turtle, time
from datetime import datetime
import csv


def D(x, y):
    '''将画布坐标原点重置为(-300,0)位置'''
    return x - 300, y

def Int(num):
    '''文件数据转换为整形数据'''
    return int(float(num))

def x_y(pen, x_name='T / a', y_name='Magnitude / ML'):
    '''绘制直角坐标系'''
    pen.pensize(2)
    pen.up()
    pen.goto(D(0, 0))
    pen.down()
    pen.goto(D(600, 0));pen.goto(D(595, 5));pen.goto(D(600, 0));pen.goto(D(595, -5))
    pen.up();pen.goto(D(600, -20));pen.write(x_name)
    pen.goto(D(0, 0))
    pen.down()
    pen.goto(D(0, 300));pen.goto(D(-5, 295));pen.goto(D(0, 300));pen.goto(D(5, 295))
    pen.up();pen.goto(D(-28, 305));pen.write(y_name)

t = turtle.Pen()
t.ht()
x_y(t)

# 画纵坐标刻度
t.pensize(2)
t.goto(D(0, 100));t.down();t.goto(D(-10, 100));t.up();t.goto(D(-20, 92.50));t.write('6')
t.goto(D(0, 175));t.down();t.goto(D(-10, 175));t.up();t.goto(D(-20, 167.5));t.write('7')
t.goto(D(0, 250));t.down();t.goto(D(-10, 250));t.up();t.goto(D(-20, 242.5));t.write('8')
t.pensize(1)
t.goto(D(0,  62.5));t.down();t.goto(D(-5,  62.5));t.up();t.goto(D(-20,  55));t.write('5.5')
t.goto(D(0, 137.5));t.down();t.goto(D(-5, 137.5));t.up();t.goto(D(-20, 130));t.write('6.5')
t.goto(D(0, 212.5));t.down();t.goto(D(-5, 212.5));t.up();t.goto(D(-20, 205));t.write('7.5')

# 画横坐标刻度
t.goto(D(0, 0))
for a in range(1990, 2020):
    if a % 2 == 0:
        t.pensize(1)
        t.goto(D(20 * (a - 1990), 0))
        t.down()
        t.goto(D(20 * (a - 1990), -5));t.up();t.goto(D(20 * (a - 1990), -20));t.write(f'{a}')
    # 画纵轴辅助虚线
    elif a % 2 != 0:
        t.pensize(0.25)
        t.goto(D(20 * (a - 1990), 100));t.down();t.goto(D(20 * (a - 1989), 100));t.up()
        t.goto(D(20 * (a - 1990), 175));t.down();t.goto(D(20 * (a - 1989), 175));t.up()

# 导入数据
t.pensize(0.8)
filepath = ['C:/Users/pro/Documents/大学期间课程/毕业设计/program/csv/Taiwan_earthquake6_7ML.csv',
'C:/Users/pro/Documents/大学期间课程/毕业设计/program/csv/Taiwan_earthquake7_8ML.csv']
grosstimestamp = datetime(2020, 1, 1, 0, 0).timestamp() - datetime(1990, 1, 1, 0, 0).timestamp()
grossMagnitude = 2

for _ in (0, 1):
    
    with open(filepath[_], newline='') as f:
        f_csv = csv.reader(f)
        for row in f_csv:
            break
        for row in f_csv:
            dt = datetime(Int(row[0]), Int(row[1]), Int(row[2]), Int(row[3]), Int(row[4]), Int(row[5])).timestamp()
            row_x = 600 * ((dt - datetime(1990, 1, 1, 0, 0).timestamp()) / grosstimestamp)
            try:
                ml = float(row[11])
            except:
                ml = float(row[10])
            row_y = 150 * ((ml - 6) / 2) + 100
            t.goto(D(row_x, row_y));t.down();t.goto(D(row_x, 0));t.up()


t.getscreen().getcanvas().postscript(file='M-t.eps')
time.sleep(5)

因为这是本人毕业论文所需要用到的数据资料,所以最后的导入数据部分读者是没办法复制运行成功的。

本文供读者在需要用turtle库时,方便地画出一个简单的直角坐标系。当然简单改动坐标原点函数D,和函数x_y,可以画出你需要形式的坐标系。

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值