今天本人用Python里的Trutle库,画了如上图的一个时序图,开始考虑的是用 matplotlib 模块,matplotlib有方便的数据可视化功能,能轻松画出柱状图和直方图等统计图。但是因为matplotlib模块里的操作繁多,相对于Trutle库,另外时序图的画法也很符合trutle模块的绘图思路。
要在画布上画出一个相对横轴较长的单象限平面直角坐标系,先确定坐标系原点(-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,可以画出你需要形式的坐标系。