利用matplotlib作图

Python是一门面向对象的解释型语言,其优势在于易学习、易阅读、易扩展。Python现在已经越来越多地用于科学计算中,这得益于很多优秀的Python模块。主要有 numpymatplotlibscipy 等。比起把OpenSees生成的数据粘贴到excel中再作图,利用 matplotlib 作图是一个更方便快捷的选择。更重要的是,相比 matlab 高昂的费用, Python的科学计算模块都是开源和免费的。

下面针对Windows用户介绍如何安装和配置 matplotlib 作图环境。

安装

安装Python

这里介绍Python2.7的安装。

登陆 Python2.7下载页面 ,在 Download 部分找到自己系统适合的安装包下载。然后用管理员方式运行安装包完成安装。在出现下图界面时,请注意选择 Add python.exe to Path ,如下图所示。

_images/install_python.png

Warning

如果在安装时没有选择这一项,请自行将python.exe所在路径加入环境变量。

安装 numpymatplotlib

安装好了python之后,要安装python的科学计算库 numpymatplotlib 。打开 命令提示符 ,输入:

pip install numpy

屏幕上会显示安装信息。 pip 命令会自动从Python项目的包管理中心下载并安装合适版本的模块。如果屏幕出现提示:

Successfully installed numpy-x.xx.x

则说明安装成功。

按装 matplotlib 的方法类似。输入:

pip install matplotlib

看到成功的提示信息,安装完成。

Note

这种安装方法在windows中可能会缺失Fortran编译器,但这并不会影响两个库的使用。

使用Python

Python和 matlabTCL (参考 TCL语言入门 )类似,都是解释型语言。需要通过 脚本 来运行。我们用文本编辑器在D盘中新建一个文本文件,(如果没有文本编辑器,请参考: Sublime Text 3 使用方法 )。输入以下代码:

string = "Hello, world!"
print string

保存在D盘中,命名为 hello.py 。这样就创建了一个python脚本文件。打开命令提示符,输入:

D:

切换到D盘。如果建立了其它文件夹,可以用 cd 命令来切换工作目录,到你的脚本所在的文件夹。然后输入:

python hello.py

会看到命令提示符中打印了如下内容:

Hello, world!

说明脚本运行成功。

如果您使用 Sublime Text 作为文本编辑器,可以在保存文件之后选择 Tools - Build 。选择Python,可在底部弹出的对话框中看到输出的内容。

Python语言的学习很简单,这里推荐几个Python的教程:

从实践中学习Python也是一个不错的选择:

使用matplotlib

我们通过一个实例来介绍matplotlib入门。

第一个OpenSees脚本 中,我们建立了一个桁架结构的简单模型。这里我们把模型简单修改。将模型中最后的分析命令:

analyze 1

改成:

analyze 10

改完后的 代码下载

也就是分析10步。每一步的力是 pattern 中定义的力。此时结构中的力是 第一个OpenSees脚本 中的10倍。运行后打开输出文件 example.out 可以看到如下结果:

1 0.530093 -0.177894
2 1.06019 -0.355787
3 1.59028 -0.533681
4 2.12037 -0.711575
5 2.65046 -0.889468
6 3.18056 -1.06736
7 3.71065 -1.24526
8 4.24074 -1.42315
9 4.77083 -1.60104
10 5.30093 -1.77894

其中第一列是 time 在静力分析中可以理解为 倍数,即这一步骤分析结束后结构所受的力是 pattern 中定义力的倍数。第二列和第三列分别是4号节点在1和2自由度上的位移。下面我们输出水平力-水平位移关系。

example.out 相同的文件夹中建立文件 plot.py ,在文件中输入如下代码:

# import two modules and make alias.
import numpy as np
import matplotlib.pyplot as plt

# read data matrix from file
data = np.loadtxt("example.out")

# plot data
plt.figure()

# data[:, 0] means the first column of data matrix
plt.plot(data[:, 1], data[:, 0] * 100)

# show plot
plt.show()

plot.py代码下载

运行这一脚本,可以看到以下对话框弹出。

_images/matplotlib_figure.png

这样,如果OpenSees程序发生变化,生成新的结果后,直接运行这一脚本,就可以查看变化。

更加复杂地,如果同时输出两个图,描述两个方向的力-位移关系,代码如下:

# -*- coding: utf-8 -*-
# 支持中文的编码方式

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

# 设置中文字体
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

data = np.loadtxt("example.out")

# 设置图像大小。单位:英寸
plt.figure(figsize=(6, 3))

# subplot 1
plt.subplot(1, 2, 1)

# 画线
plt.plot(data[:, 1], data[:, 0] * 100)

# 设置坐标轴的范围
plt.xlim([0, 6])
plt.ylim([0, 1200])

# 设置坐标轴标题
plt.xlabel("displacement(in)")
plt.ylabel("force(kip)")

# 设置子图标题
plt.title("x direction")

# subplot 2
plt.subplot(1, 2, 2)

# 设置画线的颜色、标记和线型
plt.plot(data[:, 2], data[:, 0] * -50, "ro--")

# 中文坐标轴标题
plt.xlabel(u"位移(英寸)")

# 加入LaTeX公式的文字
plt.ylabel(r"Force$(\mathrm{kip})$")

plt.title(u"y方向")

# 设置横坐标分隔
plt.xticks([-2, -1, 0])
plt.yticks([-500, -400, -300, -200, -100, 0])

# 调整布局尺寸
plt.subplots_adjust(bottom=0.2, top=0.85, left=0.12, right=0.95,
                    wspace=0.4, hspace=0.2)

# 保存图片
plt.savefig("myfigure", dpi=300)

plot2.py代码下载

在当前目录下可以看到生成了一个名为 myfigure.png 的图像文件,如下图

_images/matplotlib_myfigure.png

会用 matlab 作图的读者可以发现,这个库的使用方法与之非常相似!

更多相关教程,请参照: