使用 gnuplot 科学作图 – Gnuplot 中文教程



Similar documents
I

何 秋 琳 张 立 春 视 觉 学 习 研 究 进 展 视 觉 注 意 视 觉 感 知

说 明 为 了 反 映 教 运 行 的 基 本 状 态, 为 校 和 院 制 定 相 关 政 策 和 进 行 教 建 设 与 改 革 提 供 据 依 据, 校 从 程 资 源 ( 开 类 别 开 量 规 模 ) 教 师 结 构 程 考 核 等 维 度, 对 2015 年 春 季 期 教 运 行 基

Microsoft Word - 第3章.doc

《C语言基础入门》课程教学大纲

Microsoft Word - 第7章 图表反转形态.doc

龚 亚 夫 在 重 新 思 考 基 础 教 育 英 语 教 学 的 理 念 一 文 中 援 引 的 观 点 认 为 当 跳 出 本 族 语 主 义 的 思 维 定 式 后 需 要 重 新 思 考 许 多 相 连 带 的 问 题 比 如 许 多 发 音 的 细 微 区 别 并 不 影 响 理 解 和

<4D F736F F D C4EAB9A4B3CCCBB6CABFCAFDD1A7D7A8D2B5BFCEBFBCCAD4B4F3B8D9D3EBD2AAC7F3>

深圳市新亚电子制程股份有限公司

导 数 和 微 分 的 概 念 导 数 的 几 何 意 义 和 物 理 意 义 函 数 的 可 导 性 与 连 续 性 之 间 的 关 系 平 面 曲 线 的 切 线 和 法 线 导 数 和 微 分 的 四 则 运 算 基 本 初 等 函 数 的 导 数 复 合 函 数 反 函 数 隐 函 数 以

马 克 思 主 义 公 正 观 的 基 本 向 度 及 方 法 论 原 则!! # #

修改版-操作手册.doc

<433A5C446F63756D656E E E67735C41646D696E F725CD7C0C3E65CC2DBCEC4CFB5CDB3CAB9D3C3D6B8C4CFA3A8BCF2BBAFA3A95CCAB9D3C3D6B8C4CF31302D31392E646F63>

( ) 信 号 与 系 统 Ⅰ 学 科 基 础 必 修 课 教 周 2016 年 06 月 13 日 (08:00-09:35) ( )

,,,,, :,, (.,, );, (, : ), (.., ;. &., ;.. &.., ;, ;, ),,,,,,, ( ) ( ),,,,.,,,,,, : ;, ;,.,,,,, (., : - ),,,, ( ),,,, (, : ),, :,


第2章 数据类型、常量与变量


第二讲 数列

评 委 : 李 炎 斌 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

2006年顺德区高中阶段学校招生录取分数线

<433A5C C6B73625C B746F705CB9FABCCAD6D0D2BDD2A9D7A8D2B5B8DFBCB6BCBCCAF5D6B0B3C6C6C0C9F3C9EAC7EBD6B8C4CFA3A CDA8D3C3B0E6A3A92E646F63>

第 期 李 伟 等 用 方 法 对 中 国 历 史 气 温 数 据 插 值 可 行 性 讨 论

登录、注册功能的测试用例设计.doc

0 年 上 半 年 评 价 与 考 核 细 则 序 号 部 门 要 素 值 考 核 内 容 考 核 方 式 考 核 标 准 考 核 ( 扣 原 因 ) 考 评 得 3 安 全 生 产 目 30 无 同 等 责 任 以 上 道 路 交 通 亡 人 事 故 无 轻 伤 责 任 事 故 无 重 大 质 量


HSK( 一 级 ) 考 查 考 生 的 日 常 汉 语 应 用 能 力, 它 对 应 于 国 际 汉 语 能 力 标 准 一 级 欧 洲 语 言 共 同 参 考 框 架 (CEF) A1 级 通 过 HSK( 一 级 ) 的 考 生 可 以 理 解 并 使 用 一 些 非 常 简 单 的 汉 语

一 公 共 卫 生 硕 士 专 业 学 位 论 文 的 概 述 学 位 论 文 是 对 研 究 生 进 行 科 学 研 究 或 承 担 专 门 技 术 工 作 的 全 面 训 练, 是 培 养 研 究 生 创 新 能 力, 综 合 运 用 所 学 知 识 发 现 问 题, 分 析 问 题 和 解 决

教师上报成绩流程图

国债回购交易业务指引

类 似 地, 又 可 定 义 变 下 限 的 定 积 分 : ( ). 与 ψ 统 称 为 变 限 积 分. f ( ) d f ( t) dt,, 注 在 变 限 积 分 (1) 与 () 中, 不 可 再 把 积 分 变 量 写 成 的 形 式 ( 例 如 ) 以 免 与 积 分 上 下 限 的

<4D F736F F D20B9D8D3DAB0BABBAAA3A8C9CFBAA3A3A9D7D4B6AFBBAFB9A4B3CCB9C9B7DDD3D0CFDEB9ABCBBE C4EAC4EAB6C8B9C9B6ABB4F3BBE1B7A8C2C9D2E2BCFBCAE92E646F6378>

抗 战 时 期 国 民 政 府 的 银 行 监 理 体 制 探 析 % # % % % ) % % # # + #, ) +, % % % % % % % %

¹ º ¹ º 农 业 流 动 人 口 是 指 户 口 性 质 为 农 业 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个 月 及 以 上 的 流 动 人 口 非 农 流 动 人 口 是 指 户 口 性 质 为 非 农 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个

Microsoft Word - 资料分析练习题09.doc

随着执业中医师资格考试制度的不断完善,本着为我校中医学专业认证服务的目的,本文通过对我校中医类毕业生参加2012年和2013年的中医执业医师考试成绩及通过率、掌握率进行分析,并与全国的平均水平进行差异比较分析,以此了解我校执业中医师考试的现状,进而反映我校中医类课程总体教学水平,发现考核知识模块教学中存在的不足,反馈给相关学院和教学管理部门,以此提高教学和管理水平。

评 委 : 徐 岩 宇 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

目 录 关 于 图 标... 3 登 陆 主 界 面... 3 工 单 管 理... 5 工 单 列 表... 5 搜 索 工 单... 5 工 单 详 情... 6 创 建 工 单... 9 设 备 管 理 巡 检 计 划 查 询 详 情 销 售 管



18 上 报 该 学 期 新 生 数 据 至 阳 光 平 台 第 一 学 期 第 四 周 至 第 六 周 19 督 促 学 习 中 心 提 交 新 增 专 业 申 请 第 一 学 期 第 四 周 至 第 八 周 20 编 制 全 国 网 络 统 考 十 二 月 批 次 考 前 模 拟 题 第 一 学

伊 犁 师 范 学 院 611 语 言 学 概 论 全 套 考 研 资 料 <2016 年 最 新 考 研 资 料 > 2-2 语 言 学 纲 要 笔 记, 由 考 取 本 校 本 专 业 高 分 研 究 生 总 结 而 来, 重 点 突 出, 借 助 此 笔 记 可 以 大 大 提 高 复 习 效

 编号:

( 二 ) 现 行 统 一 高 考 制 度 不 利 于 培 养 人 的 创 新 精 神,,,,,,,,,,,,, [ ],,,,,,,,,,, :, ;,,,,,,? ( 三 ) 现 行 统 一 高 考 制 度 不 利 于 全 体 学 生 都 获 得 全 面 发 展,, [ ],,,,,,,,,,,

Microsoft Word - 文件汇编.doc

黄 金 原 油 总 持 仓 增 长, 同 比 增 幅 分 别 为 4.2% 和 4.1% 而 铜 白 银 以 及 玉 米 则 出 现 减 持, 减 持 同 比 减 少 分 别 为 9.4%,9.4% 以 及 6.5% 大 豆, 豆 粕 结 束 连 续 4 周 总 持 仓 量 增 长, 出 现 小 幅

3 月 30 日 在 中 国 证 券 报 上 海 证 券 报 证 券 时 报 证 券 日 报 和 上 海 证 券 交 易 所 网 站 上 发 出 召 开 本 次 股 东 大 会 公 告, 该 公 告 中 载 明 了 召 开 股 东 大 会 的 日 期 网 络 投 票 的 方 式 时 间 以 及 审

证券代码: 证券简称:长城电脑 公告编号:

全国艺术科学规划项目

际 联 考 的 非 美 术 类 本 科, 提 前 批 本 科 体 育 类 第 一 批 第 二 批 第 三 批 的 理 工 类 和 文 史 类 本 科 平 行 志 愿, 考 生 可 以 填 报 6 所 院 校 志 愿 符 合 贫 困 地 区 专 项 计 划 和 农 村 考 生 专 项 计 划 报 考

珠江钢琴股东大会

精 勤 求 学 自 强 不 息 Born to win! 解 析 : 由 极 限 的 保 号 性 知 存 在 U ( a) 当 a 时 f ( ) f ( a) 故 f ( ) 在 点 a 不 取 极 值 f ( ) f ( a) f ( ) f ( a) lim lim a a a a ( a)

世华财讯模拟操作手册

金 不 少 于 800 万 元, 净 资 产 不 少 于 960 万 元 ; (3) 近 五 年 独 立 承 担 过 单 项 合 同 额 不 少 于 1000 万 元 的 智 能 化 工 程 ( 设 计 或 施 工 或 设 计 施 工 一 体 ) 不 少 于 2 项 ; (4) 近 三 年 每 年

一 从 分 封 制 到 郡 县 制 一 从 打 虎 亭 汉 墓 说 起

目 录 一 系 统 访 问... 1 二 门 户 首 页 申 报 用 户 审 核 用 户... 2 三 系 统 登 录 用 户 名 密 码 登 录 新 用 户 注 册 用 户 登 录 已 注 册 用

<4D F736F F D20B3D6B2D6CFDEB6EEB1EDB8F1D7EED6D52E646F63>

名 称 生 命 科 学 学 院 环 境 科 学 1 生 物 学 仅 接 收 院 内 调 剂, 初 试 分 数 满 足 我 院 生 物 学 复 试 最 低 分 数 线 生 命 科 学 学 院 生 态 学 5 生 态 学 或 生 物 学 生 命 科 学 学 院

目 录 一 激 活 账 号... 2 二 忘 记 密 码 后 如 何 找 回 密 码?... 3 三 如 何 管 理 学 校 信 息 及 球 队 学 生 教 师 等 信 息... 6 四 如 何 发 布 本 校 校 园 文 化? 五 如 何 向 教 师 发 送 通 知? 六

课程类 别

3 复 试 如 何 准 备 4 复 试 成 绩 计 算 5 复 试 比 例 6 复 试 类 型 7 怎 么 样 面 对 各 种 复 试 04 05

一 六 年 级 下 册 教 科 书 总 体 说 明 ( 一 ) 教 学 内 容 本 册 教 科 书 一 共 安 排 了 5 个 教 学 单 元, 其 中 前 4 个 单 元 为 新 知 识, 第 五 单 元 是 对 整 个 小 学 阶 段 所 学 数 学 知 识 系 统 的 整 理 和 复 习

正 规 培 训 达 规 定 标 准 学 时 数, 并 取 得 结 业 证 书 二 级 可 编 程 师 ( 具 备 以 下 条 件 之 一 者 ) (1) 连 续 从 事 本 职 业 工 作 13 年 以 上 (2) 取 得 本 职 业 三 级 职 业 资 格 证 书 后, 连 续 从 事 本 职 业

中 国 软 科 学 年 第 期!!!

附 件 : 上 海 市 建 筑 施 工 企 业 施 工 现 场 项 目 管 理 机 构 关 键 岗 位 人 员 配 备 指 南 二 一 四 年 九 月 十 一 日 2

2014年中央财经大学研究生招生录取工作简报

全国教师资格认定管理信息系统

ETF、分级基金规模、份额变化统计


上海证券交易所会议纪要

《应用数学Ⅰ》教学大纲

年 8 月 11 日, 公 司 召 开 2015 年 第 五 次 临 时 股 东 大 会, 审 议 通 过 了 关 于 公 司 <2015 年 股 票 期 权 激 励 计 划 ( 草 案 )> 及 其 摘 要 的 议 案 关 于 提 请 股 东 大 会 授 权 董 事 会 办 理 公

中 日 信 息 化 的 比 较 与 合 作 一 中 日 信 息 化 的 规 模 比 较

·岗位设置管理流程

Template BR_Rec_2005.dot


<443A5C6D B5C30312EB9A4D7F7CEC4B5B55C30322EBACFCDACCEC4B5B55C C30342EC8CBC9E7CCFC5C31332ECFEEC4BFC5E0D1B55C E30385C322EB2D9D7F7CAD6B2E12E646F63>

用节点法和网孔法进行电路分析

<4D F736F F D D323630D6D0B9FAD3A6B6D4C6F8BAF2B1E4BBAFB5C4D5FEB2DFD3EBD0D0B6AF C4EAB6C8B1A8B8E6>

微 积 分 ( 二 ) 教 学 大 纲 2 (2010 版 ) 课 程 编 码 : 课 程 名 称 : 微 积 分 学 时 / 学 分 :36/2 先 修 课 程 : 初 等 数 学 立 体 几 何 平 面 解 析 几 何 微 积 分 ( 一 ) 适 用 专 业 : 人 力 资 源 管

i 1) 系 统 运 作 前 设 定 *1. [2.1 网 页 主 机 名 称 设 定 ] -- 设 定 校 务 系 统 的 主 机 IP 地 址, 以 供 其 他 个 人 电 脑 连 接 及 使 用 该 系 统 *2. [2.3.1 输 入 / 修 改 学 校 资 料 ] -- 输 入 系 统 使

年 第 期 % %! & % % % % % % &

第 一 部 分 MagiCAD for Revit 安 装 流 程

Your Child is Myopic

一 开 放 性 的 政 策 与 法 规 二 两 岸 共 同 的 文 化 传 承 三 两 岸 高 校 各 自 具 有 专 业 优 势 远 见 杂 志 年 月 日

!!

讲 授 为 主, 讲 练 与 研 讨 相 结 合 第 一 节 向 量 及 其 线 性 运 算 1. 理 解 向 量 的 概 念, 掌 握 几 种 特 殊 且 重 要 的 向 量, 理 解 共 线 与 共 面 向 量 的 特 征 ; 2. 掌 握 向 量 的 线 性 运 算 及 几 何 意 义 ; 3

中 中 中 中 部 中 岗 位 条 件 历 其 它 历 史 师 地 理 师 生 物 师 体 与 健 康 师 从 事 中 历 史 工 从 事 中 地 理 工 从 事 中 生 物 工 从 事 中 体 与 健 康 工 2. 课 程 与 论 ( 历 史 ); 2. 科 ( 历 史 )

全国建筑市场注册执业人员不良行为记录认定标准(试行).doc

<4D F736F F D20BFC9B1E0B3CCD0F2BFD8D6C6CFB5CDB3C9E8BCC6CAA6B9FABCD2D6B0D2B5B1EAD7BC2E646F63>


第 六 章 债 券 股 票 价 值 评 估 1 考 点 一 : 债 券 价 值 的 影 响 因 素 2

一、资质申请

4.3.3 while 语 句 用 于 无 限 循 环 当 while 语 句 的 表 达 式 永 远 不 会 为 布 尔 假 时, 循 环 将 永 远 不 会 结 束, 形 成 无 限 循 环, 也 称 死 循 环 使 用 while 语 句 构 成 无 限 循 环 的 格 式 通 常

生产支援功能 使用说明书(IP-110 篇)

!!!!!!!!!!

( 此 页 无 正 文, 为 广 东 东 方 精 工 科 技 股 份 有 限 公 司 关 于 提 供 资 料 真 实 准 确 和 完 整 的 承 诺 函 之 签 署 页 ) 广 东 东 方 精 工 科 技 股 份 有 限 公 司 法 定 代 表 人 : 唐 灼 林 2016 年 7 月 28 日

第三章 作业

4 进 入 交 互 区 设 置 的 组 件 管 理, 在 组 件 管 理 中, 教 师 可 以 选 择 课 程 空 间 中 的 所 有 组 件, 并 通 过 点 击 启 用 或 不 启 用 选 定 组 件 在 课 程 空 间 中 的 显 示 5 进 入 工 作 室 管 理 的 工 作 室 首 页,

上证指数

Transcription:

使 用 gnuplot 科 学 作 图 Gnuplot 中 文 教 程 版 本 1.0 马 欢 February 9, 2012 目 录 前 言 4 1 安 装 5 2 启 动 5 3 数 学 表 达 式 6 4 简 单 函 数 绘 图 6 5 坐 标 取 值 范 围 及 刻 度 9 6 简 单 数 据 绘 图 11 7 点 线 风 格 14 8 多 组 数 据 绘 图 16 9 输 出 eps 图 片 18 10 输 出 pdf 和 png 图 片 21 11 Enhanced 文 本 模 式 23 12 插 入 L A TEX 公 式 26 13 栅 格 以 及 方 程 数 值 解 估 算 27 14 第 二 坐 标 轴 29 使 用 gnuplot 科 学 作 图 Gnuplot 中 文 教 程 by Huan Ma is licensed under a Creative Commons Attribution- NonCommercial-ShareAlike 3.0 Unported License. Copyright c 2011 Huan Ma. 欢 迎 反 馈 :yusufma77@yahoo.com 1

15 Gnuplot 的 坐 标 系 统 及 标 签 31 16 箭 头 33 17 边 框 和 坐 标 轴 34 18 图 例 36 19 对 数 坐 标 38 20 图 像 尺 寸 40 21 极 坐 标 41 22 参 数 方 程 43 23 误 差 条 44 24 拟 合 46 25 简 单 3D 函 数 绘 图 47 26 数 据 文 件 存 储 格 式 50 27 3D 数 据 曲 面 绘 图 及 边 框 51 28 Pm3d 绘 图 53 29 色 板 (palette) 设 置 56 30 Image 绘 图 57 31 等 高 线 图 59 32 等 高 线 的 颜 色 61 33 Table 输 出 63 34 多 图 (multiplot) 64 35 曲 线 色 彩 填 充 66 36 填 充 风 格 68 37 柱 状 图 70 38 阶 梯 图 73 39 数 据 平 滑 74 40 统 计 直 方 图 76 2

41 三 元 算 符 和 分 段 函 数 78 42 几 何 图 形 对 象 80 43 地 图 及 圆 圈 数 据 图 81 44 for 循 环 83 45 动 画 和 reread 循 环 84 A 附 录 : 互 联 网 资 源 86 索 引 87 3

前 言 对 于 科 技 工 作 者 来 说,gnuplot 是 一 个 非 常 好 用 的 绘 图 软 件 因 为 感 慨 于 gnuplot 中 文 资 料 和 文 档 的 缺 乏, 我 于 数 月 之 前 在 科 学 网 博 客 开 始 撰 写 谈 谈 gnuplot 系 列 博 文, 至 今 已 写 了 四 十 五 篇 虽 然 还 有 不 少 细 节 问 题 没 有 涉 及, 但 是 我 觉 得 这 些 博 文 已 经 可 以 构 成 一 个 比 较 完 整 的 gnuplot 中 文 教 程 对 大 多 数 用 户 来 说, 这 一 系 列 博 文 已 经 涵 盖 了 日 常 应 用 的 需 要 为 了 方 便 大 家 阅 读, 我 现 在 将 这 一 系 列 博 文 集 结 编 辑 成 为 此 教 程, 以 CC BY-NC-SA 知 识 共 享 协 议 发 布 如 果 有 朋 友 对 这 一 系 列 文 章 有 什 么 建 议, 欢 迎 提 出 来, 我 们 可 以 不 断 完 善 和 补 充 希 望 我 的 这 些 文 章 对 推 广 开 源 软 件 和 减 少 盗 版 软 件 的 使 用 能 有 所 帮 助 4

1 安 装 gnuplot 是 一 个 小 巧 实 用 的 数 据 处 理 工 具, 主 要 用 来 绘 制 2D/3D 的 数 据 或 者 函 数 图 像, 但 是 也 包 含 数 学 计 算 拟 合 等 功 能 虽 然 它 的 名 字 里 有 个 gnu, 但 是 它 和 大 名 鼎 鼎 的 GNU 没 什 么 关 系, 使 用 的 授 权 协 议 也 不 是 GNU GPL, 所 以 这 里 的 gnu 是 小 写, 全 名 应 该 读 作 new plot 所 有 的 主 流 Linux 发 行 版 都 包 含 gnuplot, 因 此 在 Linux 上 安 装 很 简 单, 只 要 用 各 相 应 发 行 版 的 软 件 安 装 工 具 直 接 安 装 就 可 以 了 在 苹 果 电 脑 上 的 安 装 也 不 复 杂 MacPorts 项 目 把 很 多 Linux 上 的 应 用 程 序 移 植 到 了 苹 果 系 统 上, 其 中 就 包 括 gnuplot 只 需 要 在 苹 果 电 脑 上 安 装 MacPorts, 之 后 就 能 通 过 port 命 令 安 装 包 括 gnuplot 在 内 的 各 种 Linux 应 用 程 序 了 在 Windows 下, 可 以 直 接 到 gnuplot 在 sourceforge 的 下 载 网 页 下 载 最 新 版 本 ( 文 件 名 包 含 win32 的 那 个 ), 解 压 之 后 到 binary 目 录 里 找 到 gnuplot.exe 直 接 执 行 就 可 以 了 2 启 动 gnuplot 是 基 于 命 令 行 的 交 互 式 绘 图 软 件 打 开 一 个 终 端, 输 入 gnuplot, 随 着 程 序 启 动, 会 出 现 下 面 的 信 息 :( 如 果 是 在 Windows 电 脑 上, 双 击 gnuplot.exe 后 会 自 动 打 开 一 个 命 令 行 窗 口 ) 这 里 包 含 gnuplot 的 版 本 系 统 版 权 等 信 息 最 关 键 的 是 最 后 一 条 : Terminal type set t o wxt 什 么 是 terminal? 在 gnuplot 中,terminal 就 是 说 你 打 算 用 什 么 方 式 输 出 图 片 这 里 默 认 的 terminal 是 wxt, 也 就 是 直 接 输 出 到 电 脑 屏 幕 上 gnuplot 支 持 七 十 多 种 terminal, 没 必 要 都 记 住 我 们 以 后 会 挑 主 要 的 几 种 讲 一 下 提 示 信 息 之 后, 是 gnuplot 的 提 示 符 : gnuplot > 在 提 示 符 之 后 输 入 各 种 命 令, 就 可 以 开 始 画 图 了 如 果 要 退 出 程 序, 只 需 要 输 入 quit 或 者 exit 命 令 5

3 数 学 表 达 式 在 我 们 开 始 画 图 之 前, 需 要 知 道 gnuplot 里 面 是 如 何 表 达 数 学 公 式 的 加 减 乘 除 乘 方 分 别 用 +,-,*,/,** 表 示 整 数 和 浮 点 数 和 C 语 言 类 似,gnuplot 对 整 数 和 浮 点 数 ( 实 数 ) 区 别 对 待, 整 数 的 运 算 结 果 还 是 整 数 所 以 在 处 理 整 数 除 法 时 要 尤 其 小 心, 例 如 7/2 的 结 果 是 3 而 不 是 3.5 复 数 gnuplot 支 持 复 数 运 算, 复 数 用 包 含 在 花 括 号 内 的 一 对 实 数 表 示, 例 如 {3,5} 表 示 3 + 5i 数 学 函 数 gnuplot 含 有 丰 富 的 数 学 函 数, 格 式 和 C 语 言 几 乎 相 同 对 于 实 数 和 复 数, 函 数 名 是 一 样 的 下 面 的 链 接 可 以 看 到 预 定 义 的 函 数 列 表 : http://www.gnuplot.info/docs_4.2/gnuplot.html#x1-5300013.1 自 定 义 函 数 自 定 义 函 数 很 容 易, 例 如 f(x)=x+1 定 义 一 个 一 元 函 数,f(x,y)=x+y 定 义 一 个 二 元 函 数 π( 圆 周 率 ) π 在 gnuplot 里 用 pi 表 示 这 里 是 一 些 例 子 : 这 里 用 到 了 print 命 令, 就 是 把 结 果 输 出 到 屏 幕 上 有 了 这 些 知 识 做 准 备, 我 们 就 可 以 正 式 开 始 画 图 了 4 简 单 函 数 绘 图 终 于 可 以 开 始 画 图 了! 先 从 简 单 的 函 数 图 像 入 手 吧 gnuplot 里 面 的 2D 作 图 命 令 是 plot 先 试 着 画 一 个 正 弦 函 数 : gnuplot> plot sin (5 x ) 6

这 个 正 弦 函 数 看 着 有 点 别 扭, 是 吧? 这 是 因 为 gnuplot 默 认 的 函 数 取 样 为 100 个 点, 对 于 快 速 振 荡 的 函 数, 这 个 取 样 率 有 点 低 函 数 取 样 数 目 由 samples 这 个 参 数 控 制 在 gnuplot 里 面, 所 有 参 数 赋 值 都 由 set 命 令 完 成 我 们 把 函 数 取 样 数 目 改 为 500: gnuplot > set samples 500 gnuplot > replot 怎 么 样, 现 在 看 起 来 好 多 了 吧? 这 里 用 到 了 replot 命 令 顾 名 思 义,replot 就 是 把 刚 才 的 plot 命 令 重 新 执 行 一 遍 图 像 右 上 角 的 图 例 ( 就 是 那 个 sin(5*x) 后 面 带 一 段 横 线 ) 看 起 来 有 点 碍 眼 在 gnuplot 里 面, 这 个 图 例 叫 做 key 对 于 同 时 包 含 多 组 数 据 的 图 像 来 说, 图 例 是 必 要 的 但 是 现 在 图 像 只 包 含 一 个 函 数, 而 且 这 个 图 例 的 位 置 也 不 那 么 对 劲 儿, 我 们 先 把 它 去 掉 : 7

gnuplot> unset key gnuplot > replot 这 里 我 们 看 到, 可 以 用 unset 命 令 取 消 一 个 参 数 设 置 现 在 碍 眼 的 图 例 没 有 了, 但 是 随 之 而 来 的 问 题 是, 我 们 不 知 道 这 个 图 像 究 竟 表 示 什 么 意 思 为 了 让 它 成 为 一 个 完 整 的 科 学 作 图, 我 们 给 它 加 上 标 题 和 坐 标 轴 标 签 : gnuplot> set t i t l e " s i n (5 x ) 函 数 图 像 " gnuplot > set xlabel "X" gnuplot > set ylabel "Y" gnuplot > replot 8

xlabel 和 ylabel 分 别 表 示 横 轴 和 纵 轴 的 标 签 在 gnuplot 里, 很 多 跟 坐 标 有 关 的 参 数, 都 有 相 应 的 x 和 y 版 本 title 虽 然 可 以 给 图 像 加 上 标 题, 但 是 在 真 正 的 科 学 论 文 里 意 义 不 大, 因 为 所 有 论 文 插 图 都 要 求 配 有 文 字 说 明 (Caption) 引 号 内 的 内 容 为 字 符 串, 大 多 数 情 况 下 双 引 号 和 单 引 号 没 有 区 别, 除 非 遇 到 特 殊 字 符 ( 例 如 换 行 符 \n), 这 时 候 单 引 号 会 把 特 殊 字 符 当 成 一 般 字 符 处 理, 而 双 引 号 会 按 照 特 殊 字 符 的 意 义 将 其 展 开 这 里 我 们 注 意 到, 字 符 串 里 也 可 以 包 含 中 文 究 竟 是 否 支 持 中 文, 和 terminal 的 种 类 有 关 系 有 些 terminal 对 Unicode 支 持 不 那 么 好, 这 时 候 显 示 中 文 就 不 那 么 容 易 了 好 在 我 们 可 以 选 择 那 些 比 较 有 利 的 terminal 现 在 我 们 有 了 一 个 简 单 的 函 数 图 像 了 虽 然 看 起 来 还 不 尽 人 意, 但 是 没 关 系, 我 们 以 后 会 把 它 逐 渐 完 善 5 坐 标 取 值 范 围 及 刻 度 我 们 从 上 一 讲 结 束 时 的 图 像 开 始 这 里 默 认 的 x 取 值 范 围 是 从 -10 到 10 我 们 现 在 希 望 x 的 取 值 范 围 从 -2π 到 2π, 这 样 函 数 图 像 可 以 正 好 包 括 十 个 周 期 横 坐 标 取 值 范 围 由 xrange 参 数 控 制 还 记 得 gnuplot 里 面 所 有 参 数 都 由 set 命 令 控 制 吗? 取 值 范 围 由 方 括 号 内 的 一 对 数 表 示, 两 个 数 之 间 用 冒 号 隔 开 : gnuplot> set xrange [ 2 pi : 2 pi ] gnuplot > replot ( 不 要 忘 记, 每 一 个 和 x 坐 标 有 关 的 参 数, 都 对 应 有 一 个 和 y 有 关 的 参 数, 所 以 纵 坐 标 的 取 值 范 围 由 yrange 控 制 ) 现 在 横 坐 标 取 值 范 围 已 经 符 合 我 们 的 要 求 了, 但 是 横 轴 上 的 刻 度 并 不 是 我 们 想 要 的 我 们 不 想 要 刻 度 出 现 在 整 数 位 置 上, 而 是 希 望 刻 度 为 π 的 整 倍 数 另 外, 我 们 还 希 望 两 个 主 刻 度 之 间 π/2 的 位 置 有 一 个 分 刻 度, 分 刻 度 只 要 有 刻 度 就 可 以, 没 必 要 标 出 数 字 了 gnuplot 里 面, 横 轴 主 刻 度 和 分 刻 度, 分 别 用 xtics 和 mxtics 表 示 (m 表 示 minor) 我 们 试 试 下 面 的 命 令 : gnuplot> set xtics pi gnuplot > set mxtics 2 9

gnuplot > replot 这 里 的 命 令 表 示 : 横 轴 主 刻 度 间 隔 为 π, 每 两 个 主 刻 度 之 间 被 分 刻 度 分 为 2 份 这 组 命 令 得 到 的 图 像 如 下 : 现 在 刻 度 间 隔 对 了, 但 是 显 示 的 数 字 并 不 是 我 们 想 要 的 我 们 希 望 显 示 字 符 π, 而 不 是 小 数 3.14159 其 实,set xtics 命 令 的 形 式 并 不 是 唯 一 的 我 们 试 试 下 面 的 形 式 : gnuplot> set xtics ( " 2π" 2 pi, "" 1.5 pi 1, " π" pi, \ > "" 0.5 pi 1, "0" 0, "" 0.5 pi 1, "π" pi, "" 1.5 pi 1,\ > "2π" 2 pi ) gnuplot > replot 这 里 set xtics 命 令 直 接 规 定 了 每 个 刻 度 的 位 置 和 显 示 的 字 符 每 一 个 刻 度 对 应 三 个 参 数 : 显 示 字 符 刻 度 位 置 刻 度 等 级 刻 度 等 级 为 0 时 表 示 主 刻 度, 等 级 为 1 时 表 示 分 刻 度 对 于 主 刻 度 ( 等 级 为 0 时 ), 表 示 等 级 的 参 数 也 可 以 省 略 不 写 各 个 刻 度 的 参 数 之 间 用 逗 号 隔 开 从 上 面 的 例 子 我 们 还 看 出, 显 示 字 符 可 以 为 空, 也 就 是 只 标 刻 度, 不 显 示 字 符 另 外, 如 果 命 令 太 长, 需 要 把 一 条 命 令 分 为 多 行 来 写, 可 以 在 换 行 时 末 尾 加 上 反 斜 杠 (\), 表 示 这 条 命 令 还 没 有 结 束 这 组 命 令 得 到 的 图 像 如 下 : 10

现 在 横 轴 坐 标 已 经 完 全 符 合 我 们 要 求 了, 我 们 把 纵 轴 坐 标 也 调 整 一 下, 因 为 我 们 不 需 要 这 么 细 的 划 分 纵 轴 刻 度 : gnuplot> set ytics 1,0.5,1 gnuplot > replot 这 里 又 用 了 set ytics 命 令 的 另 一 种 形 式 ( 再 次 提 醒 一 下,xtics 和 ytics 语 法 是 完 全 一 样 的 ): 后 面 跟 了 逗 号 隔 开 的 三 个 参 数 这 三 个 参 数 分 别 表 示 : 最 小 主 刻 度 主 刻 度 步 长 最 大 主 刻 度 图 像 如 下 : 现 在 我 们 完 成 了 对 于 坐 标 轴 的 一 些 微 调, 图 像 看 起 来 更 顺 眼 了 6 简 单 数 据 绘 图 之 前 讲 过 了 简 单 的 函 数 绘 图, 而 实 际 科 研 中 更 多 用 到 的 是 数 据 绘 图 11

在 讲 如 何 用 gnuplot 进 行 数 据 绘 图 之 前, 我 们 先 介 绍 一 个 gnuplot 里 最 有 用 的 命 令 :help gnuplot 内 含 一 个 非 常 有 用 的 帮 助 系 统 随 着 我 们 学 习 的 命 令 越 来 越 多, 记 住 所 有 命 令 的 用 法 不 太 现 实, 所 以 我 们 会 更 多 的 依 赖 这 个 帮 助 系 统 例 如, 我 们 想 知 道 set xtics 命 令 的 用 法, 只 要 在 gnuplot 里 输 入 : gnuplot> help set xtics 就 能 得 到 完 整 的 set xtics 用 法 及 实 例 好 了, 下 面 我 们 讲 数 据 绘 图 首 先 介 绍 我 们 的 数 据 文 件 这 是 一 个 关 于 北 京 市 一 年 中 每 月 平 均 降 水 量 的 数 据, 我 们 的 数 据 以 纯 文 本 方 式 储 存 在 文 件 名 为 datafile.dat 的 文 件 中, 文 件 全 文 如 下 : ### 文 件 开 始 ### # 北 京 月 平 均 降 水 量 (mm) # # 月 份 降 水 量 # ============== 1 2. 5 2 5. 1 3 10.2 4 25.4 5 27.9 6 71.1 7 175.3 8 182.9 9 48.3 10 17.8 11 5. 1 12 2. 5 ### 文 件 结 束 ### 数 据 分 为 两 列, 第 一 列 为 月 份, 第 二 列 为 降 水 量 以 # 符 号 开 始 的 各 行 为 注 释, 也 就 是 说, 这 些 行 对 绘 图 不 构 成 任 何 影 响 下 面 开 始 画 图 gnuplot> set xlabel " 月 份 " gnuplot> set ylabel " 降 水 量 ( 毫 米 )" gnuplot> set t i t l e " 北 京 市 月 平 均 降 水 量 " gnuplot> unset key gnuplot> set xrange [ 0. 5 : 1 2. 5 ] gnuplot> set xtics 1,1,12 gnuplot> plot " d a t a f i l e. dat " 12

这 里 我 们 看 到, 默 认 的 数 据 作 图 是 画 出 各 数 据 点 如 果 我 们 希 望 得 到 数 据 连 线 呢? 可 以 使 用 下 面 的 命 令 : gnuplot> plot " d a t a f i l e. dat " with l i n e s with 命 令 后 面 跟 的 是 画 图 方 式, 这 里 使 用 的 是 lines 方 式, 也 就 是 把 各 个 数 据 用 直 线 连 接 起 来 gnuplot 大 约 支 持 三 十 种 画 图 方 式, 默 认 为 points 方 式, 我 们 以 后 会 选 择 一 些 常 用 的 方 式 来 介 绍 现 在 问 题 来 了 : 如 何 既 得 到 连 线, 又 得 到 数 据 点 呢? 对 了, 用 with linespoints: gnuplot> plot " d a t a f i l e. dat " with l i n e s p o i n t s 13

好 了, 我 们 已 经 有 一 个 简 单 的 数 据 图 了 下 次 我 们 想 办 法 让 它 看 起 来 更 漂 亮 一 些 7 点 线 风 格 我 们 接 着 上 次 的 数 据 图 谈 起 上 次 我 们 得 到 了 一 个 点 线 图, 它 的 数 据 点 是 由 小 + 字 表 示 的, 但 是 似 乎 太 小 了, 有 点 看 不 清 楚 另 外, 如 果 我 们 想 在 做 报 告 时 把 这 个 图 用 到 幻 灯 片 中 去, 小 + 字 很 不 醒 目, 这 时 候 我 们 可 能 想 用 其 他 的 标 志 gnuplot 里 面 有 几 个 控 制 点 和 线 画 法 风 格 的 参 数 : linestyle 连 线 风 格 ( 包 括 linetype,linewidth 等 ) linetype 连 线 种 类 linewidth 连 线 粗 细 linecolor 连 线 颜 色 pointtype 点 的 种 类 pointsize 点 的 大 小 我 们 看 下 面 的 例 子 : gnuplot> plot " d a t a f i l e. dat " with l i n e s p o i n t s l i n e c o l o r 3 l i n e w i d t h 2\ > pointtype 7 pointsize 2 14

这 几 个 参 数 的 用 法 不 难 理 解, 直 接 跟 在 with 命 令 之 后 就 可 以 了, 但 是 2 3 7 这 些 数 字 都 代 表 什 么 意 思 呢? 这 些 数 字 是 代 表 不 同 画 法 风 格 的 代 码, 具 体 某 个 数 字 代 表 什 么 意 思, 这 个 依 赖 于 我 们 使 用 的 terminal( 还 记 得 我 们 在 第 二 讲 里 曾 经 讲 过 的 terminal 吗?) 拿 我 们 现 在 正 在 使 用 的 wxt terminal 举 例, 如 果 想 知 道 这 些 数 字 究 竟 代 表 什 么 意 思, 可 以 输 入 命 令 : gnuplot> test 这 样 当 前 terminal 会 输 出 一 个 测 试 图 : 测 试 图 中 包 含 当 前 terminal 的 风 格 代 码 实 例 例 如, 左 下 角 显 示 的 是 连 线 粗 细, 右 边 显 示 的 是 色 彩 和 数 据 点 显 示 风 格 对 应 代 码 最 后, 告 诉 大 家 一 个 好 消 息 :gnuplot 里 面 很 多 命 令 有 缩 写 形 式 例 如 上 面 例 子 中 的 绘 图 命 令 可 以 简 写 为 : gnuplot> plot " d a t a f i l e. dat " w lp l c 3 lw 2 pt 7 ps 2 15

至 于 其 他 参 数 命 令 的 缩 写 形 式, 相 信 不 难 猜 出 来, 大 家 可 以 试 验 一 下 猜 猜 看 8 多 组 数 据 绘 图 之 前 讲 了 如 何 用 gnuplot 进 行 数 据 绘 图 实 验 中 经 常 碰 到 的 情 况 是, 我 们 要 同 时 处 理 多 组 数 据 这 一 次 我 们 来 讲 一 讲, 怎 样 把 多 组 数 据 绘 制 到 同 一 个 图 上 还 拿 城 市 降 水 量 举 例, 下 面 是 我 们 的 数 据 文 件, 文 件 名 是 precipitation.dat : ### 文 件 开 始 ### # 各 城 市 月 平 均 降 水 量 (mm) # # 月 份 北 京 上 海 # ====================== 1 2. 5 38.1 2 5. 1 58.4 3 10.2 81.3 4 25.4 101.6 5 27.9 114.3 6 71.1 152.4 7 175.3 129.5 8 182.9 132.1 9 48.3 154.9 10 17.8 61.0 11 5. 1 50.8 12 2. 5 35.6 ### 文 件 结 束 ### 我 们 在 gnuplot 里 面 执 行 下 面 的 命 令 : gnuplot> set xlabel " 月 份 " gnuplot> set ylabel " 降 水 量 ( 毫 米 )" gnuplot> set t i t l e " 各 城 市 月 平 均 降 水 量 " gnuplot> set xrange [ 0. 5 : 1 2. 5 ] gnuplot> set xtics 1,1,12 gnuplot> plot " p r e c i p i t a t i o n. dat " using 1 : 2 w lp pt 5,\ > " p r e c i p i t a t i o n. dat " using 1 : 3 w lp pt 7 16

这 里 我 们 用 了 一 个 新 的 命 令 :using 在 我 们 的 数 据 文 件 包 含 超 过 一 组 数 据 时, 我 们 可 以 用 using 指 定 使 用 哪 列 数 据 例 如 using 1:2 表 示 使 用 第 一 列 和 第 二 列 数 据, 第 一 列 为 横 轴, 第 二 列 为 纵 轴 以 此 类 推,using 1:3 表 示 使 用 第 一 列 和 第 三 列 数 据 如 果 想 把 多 组 数 据 绘 制 到 一 个 图 上, 只 要 使 用 一 个 plot 命 令, 后 面 跟 多 组 数 据, 每 组 数 据 之 间 用 逗 号 隔 开 就 可 以 了 显 然, 这 里 的 图 例 又 把 图 像 搞 乱 了 我 们 没 有 像 以 前 那 样 把 图 例 去 掉, 因 为 这 里 有 两 组 数 据, 我 们 需 要 保 留 图 例 怎 么 办 呢? 我 们 来 使 用 下 面 的 命 令 : gnuplot> plot " p r e c i p i t a t i o n. dat " u 1 : 2 w lp pt 5 t i t l e " 北 京 ",\ > " p r e c i p i t a t i o n. dat " u 1 : 3 w lp pt 7 t i t l e " 上 海 " 注 意 到 了 吗? 这 里 我 们 使 用 了 字 母 u 作 为 using 的 缩 写 另 外, 这 里 用 了 新 的 参 数 title 这 里 的 title 和 之 前 我 们 用 过 的 set title 不 同 set title 指 定 的 是 整 个 图 的 标 题, 而 这 里 的 title 跟 在 每 一 组 数 据 参 数 后 面, 指 定 的 是 每 组 数 据 对 应 的 图 例 中 的 title 这 样, 我 们 的 图 看 起 来 整 洁 多 了 17

using 命 令 除 了 指 定 所 用 的 数 据 列, 还 可 以 对 数 据 进 行 运 算 操 作 例 如, 我 们 现 在 还 是 绘 制 上 面 的 数 据, 但 是 降 水 量 单 位 使 用 英 寸 而 不 是 毫 米 我 们 知 道,1 英 寸 =25.4 毫 米, 所 以 我 们 执 行 下 面 的 命 令 : gnuplot> set ylabel " 降 水 量 ( 英 寸 )" gnuplot> plot " p r e c i p i t a t i o n. dat " u 1 : ( $2 / 2 5. 4 ) w lp pt 5 t i t l e " 北 京 ",\ > " p r e c i p i t a t i o n. dat " u 1 : ( $3 / 2 5. 4 ) w lp pt 7 t i t l e " 上 海 " 在 对 特 定 列 的 数 据 进 行 运 算 操 作 时, 我 们 需 要 在 列 号 之 前 加 上 $ 符 号, 这 样 表 示 该 数 据 的 值 虽 然 这 里 的 例 子 是 同 一 个 文 件 里 的 多 组 数 据, 但 是 如 果 数 据 存 在 多 个 文 件 里, 这 里 的 命 令 同 样 适 用 9 输 出 eps 图 片 到 目 前 为 止, 我 们 所 有 的 gnuplot 作 图 都 只 是 输 出 到 电 脑 屏 幕 上 如 果 要 在 我 们 的 文 档 里 使 用 这 些 图 片, 我 们 必 须 把 它 们 以 某 种 文 件 格 式 存 储 下 来 前 面 已 经 介 绍 过,gnuplot 里 面 控 制 图 像 输 出 方 式 的 命 令 是 terminal 我 们 这 次 就 讲 一 下 如 何 把 图 片 输 出 为 eps 文 件 之 所 以 首 先 选 择 eps, 是 因 为 大 量 科 学 技 术 文 档 使 用 L A TEX 来 编 辑 排 版, 而 eps 是 L A TEX 最 常 用 的 图 片 格 式, 支 持 高 质 量 的 矢 量 图 形, 并 且 可 以 方 便 的 转 换 为 pdf svg 等 其 他 常 用 格 式 首 先, 让 我 们 看 看 如 何 设 置 terminal 在 gnuplot 里 输 入 下 面 的 命 令 : gnuplot> set terminal p o s t s c r i p t eps 这 里 的 terminal 其 实 是 postscript, 而 eps 是 作 为 postscript 的 一 个 参 数 这 并 不 奇 怪, 因 为 eps 本 来 就 是 postscript 衍 生 出 来 的 输 入 这 个 命 令 之 后,gnuplot 会 自 动 返 回 下 面 的 信 息 : 18

这 里 给 出 了 一 些 默 认 的 其 它 参 数 gnuplot 下 的 每 一 个 terminal 所 带 的 参 数 不 完 全 相 同, 一 些 参 数 只 针 对 某 一 terminal 我 们 只 需 要 知 道 一 些 常 用 terminal 的 常 用 参 数, 而 其 它 的 terminal 和 参 数, 我 们 可 以 在 使 用 的 时 候 通 过 help 命 令 查 询 现 在 我 们 暂 且 不 管 这 些 参 数, 先 画 一 个 图 试 试 还 是 用 我 们 上 次 用 过 的 降 水 量 数 据 文 件 : gnuplot > set xlabel "Month" gnuplot> set ylabel " P r e c i p i t a t i o n (mm) " gnuplot> set xrange [ 0. 5 : 1 2. 5 ] gnuplot> set xtics 1,1,12 gnuplot> set output " p r e c i p i t a t i o n. eps " gnuplot> plot " p r e c i p i t a t i o n. dat " using 1 : 2 w lp pt 5 t i t l e " B e i j i n g ",\ > " p r e c i p i t a t i o n. dat " using 1 : 3 w lp pt 7 t i t l e " Shanghai " gnuplot > set output gnuplot > set term wxt 这 里 我 们 没 有 使 用 中 文 标 签, 因 为 在 postscript 使 用 中 文 字 体 并 不 容 易 以 后 我 们 会 介 绍 如 何 绕 过 这 个 障 碍 第 五 行 有 一 个 新 命 令 :set output 这 没 什 么 多 说 的, 就 是 指 定 输 出 文 件 的 文 件 名 第 七 行 还 有 一 个 set output, 但 是 后 面 没 有 跟 任 何 文 件 名 这 其 实 是 告 诉 gnuplot, 这 个 文 件 已 经 输 出 完 毕, 可 以 关 闭 了 另 外 也 可 以 用 unset output, 其 实 是 相 同 作 用 之 所 以 这 么 做, 是 因 为 有 些 terminal 支 持 多 页 文 件, 所 以 在 画 完 图 之 后,gnuplot 并 不 自 动 关 闭 文 件, 等 待 你 输 入 下 一 页 内 容, 除 非 你 手 动 关 闭, 切 换 terminal, 或 者 退 出 gnuplot 程 序 最 后, 别 忘 了 把 terminal 切 换 回 屏 幕 显 示, 这 样 可 以 避 免 一 些 意 想 不 到 的 事 情 发 生 注 意 : 我 们 又 用 缩 写 了! 下 面 让 我 们 来 看 看 生 成 的 eps 文 件 吧 : 19

200 180 Beijing Shanghai 160 140 Precipitation (mm) 120 100 80 60 40 20 0 1 2 3 4 5 6 7 8 9 10 11 12 Month 这 个 图 像 可 能 并 不 是 我 们 想 要 的 有 几 个 地 方 我 们 想 要 修 改 一 下 : 这 个 图 是 黑 白 的! 我 们 想 要 彩 色 图 有 一 组 连 线 是 虚 线 这 也 难 怪, 黑 白 图 如 果 不 用 虚 线, 还 真 分 辨 不 出 来 但 我 们 想 要 彩 色 实 线 让 直 线 稍 微 加 粗 一 点 标 签 文 字 显 得 小 了 些, 我 们 想 要 大 一 点 的 字 体 我 们 来 重 新 画 一 下 这 个 图 : gnuplot> set terminal p o s t s c r i p t eps c o l o r s o l i d l i n e w i d t h 2 " H e l v e t i c a " 20 gnuplot> set output " p r e c i p i t a t i o n c o l o r. eps " gnuplot > replot gnuplot > set output gnuplot > set term wxt 这 里 我 们 用 color 参 数 表 示 我 们 要 彩 色 图,solid 表 示 我 们 要 实 线 不 要 虚 线,linewidth 参 数 指 定 2 倍 线 宽, 而 最 后 指 定 使 用 Helvetica 20 号 字 体 让 我 们 来 看 看 新 生 成 的 eps 文 件 : 20

200 180 Beijing Shanghai 160 Precipitation (mm) 140 120 100 80 60 40 20 0 1 2 3 4 5 6 7 8 9 10 11 12 Month 这 里 的 字 体 为 postscript level 2 字 体, 共 有 35 种 除 了 Helvetica, 常 用 的 还 有 Times- Roman 如 果 硬 要 多 记 两 个 字 体 名 字, 就 记 住 Courier 和 Symbol 吧 Courier 是 编 程 时 常 用 的 等 宽 字 体, 而 Symbol 字 体 可 以 用 来 显 示 希 腊 字 母 如 果 你 实 在 好 奇 还 有 哪 些 其 它 字 体, 可 以 看 看 下 面 的 网 页 链 接 : http://xfig.org/userman/attributes.html#font-panel 10 输 出 pdf 和 png 图 片 这 次 讲 讲 怎 样 把 图 片 输 出 为 pdf 和 png 格 式 上 次 讲 过 的 eps 文 件 其 实 很 容 易 转 换 为 pdf, 为 什 么 我 们 还 专 门 讲 一 下 pdf 格 式 输 出 呢? 因 为 在 postscript terminal 下 很 难 使 用 中 文 字 体, 而 在 pdf 下 面 就 容 易 多 了, 而 pdf 文 件 又 很 容 易 转 换 回 eps, 这 样 就 绕 开 了 eps 中 文 支 持 不 好 的 问 题 png 是 一 种 无 损 压 缩 位 图 格 式, 图 形 质 量 优 于 jpg 等 有 损 压 缩 格 式, 支 持 透 明 效 果, 可 以 生 成 非 常 小 体 积 的 文 件, 适 于 放 在 网 上 交 流 通 过 各 种 图 像 处 理 软 件,png 文 件 也 很 容 易 转 换 为 其 他 位 图 格 式 下 面 首 先 看 一 个 pdf 输 出 的 例 子, 咱 们 还 是 用 之 前 用 过 的 城 市 降 水 量 数 据 文 件 : gnuplot> set xlabel " 月 份 " gnuplot> set ylabel " 降 水 量 ( 毫 米 )" gnuplot> set t i t l e " 各 城 市 月 平 均 降 水 量 " gnuplot> set xrange [ 0. 5 : 1 2. 5 ] gnuplot> set xtics 1,1,12 gnuplot> set term p d f c a i r o lw 2 f o n t "Times New Roman, 8 " gnuplot> set output " p r e c i p i t a t i o n. pdf " gnuplot> plot " p r e c i p i t a t i o n. dat " u 1 : 2 w lp pt 5 t i t l e " 北 京 ",\ > " p r e c i p i t a t i o n. dat " u 1 : 3 w lp pt 7 t i t l e " 上 海 " gnuplot > set output 这 里 我 们 用 的 terminal 是 pdfcairo, 而 不 是 简 单 的 pdf 区 别 是 pdfcairo 使 用 了 cairo( 一 个 2D 图 形 程 序 库 ) 和 pango( 一 个 字 体 渲 染 程 序 库 ) 来 生 成 pdf 文 件, 优 点 是 更 好 的 国 际 支 持 有 了 之 前 的 经 验, 这 里 的 terminal 参 数 不 需 要 多 解 释 了 这 里 我 们 使 用 了 Times New Roman 8 号 字 体 21

和 eps 下 使 用 postscript 字 体 不 同, 这 里 可 以 是 电 脑 系 统 里 安 装 的 任 何 字 体 在 Linux 下, 可 以 使 用 fc-list 命 令 察 看 系 统 里 到 底 有 哪 些 字 体 可 用 下 面 我 们 来 看 生 成 的 pdf 图 片 : 这 里 有 一 个 小 问 题 : 虽 然 数 字 使 用 了 Times New Roman 字 体, 但 是 汉 字 使 用 了 其 他 字 体 ( 这 里 是 我 的 系 统 默 认 的 文 泉 驿 正 黑 ) 这 是 因 为 Times New Roman 本 来 就 不 是 中 文 字 体 如 果 我 们 想 让 中 英 文 混 排 时 字 体 统 一, 必 须 使 用 支 持 中 文 的 字 体 下 面 我 们 来 看 png 输 出 的 例 子 : gnuplot> set term pngcairo lw 2 f o n t "AR PL UKai CN, 1 4 " gnuplot> set output " p r e c i p i t a t i o n. png" gnuplot > replot gnuplot > set output gnuplot > set term wxt 基 于 和 上 面 同 样 的 原 因, 这 里 使 用 的 terminal 是 pngcairo 而 不 是 简 单 的 png, 而 字 体 是 AR PL UKai CN( 文 鼎 简 中 楷 ) 下 面 是 生 成 的 png 图 片 : 22

11 Enhanced 文 本 模 式 我 们 之 前 的 图 像 里 的 title xlabel 等 标 签 里 用 到 的 都 是 纯 文 本 字 符 串, 如 果 我 们 希 望 输 出 稍 复 杂 一 点 的 文 字 标 签, 例 如 字 母 加 角 标, 我 们 可 以 使 用 enhanced 文 本 模 式 gnuplot 里 面 好 多 terminal 都 支 持 enhanced 模 式, 使 用 方 法 就 是 在 set terminal 的 时 候, 在 后 面 加 上 enhanced 参 数 enhanced 模 式 里 有 一 些 表 达 特 殊 含 义 的 字 符, 利 用 这 些 字 符 可 以 构 成 一 些 比 较 复 杂 的 文 字 输 出 这 些 特 殊 字 符 主 要 包 括 : 1. ˆ: 表 示 后 面 的 字 符 为 上 角 标 2. _: 表 示 后 面 的 字 符 为 下 角 标 3. @: 表 示 后 面 的 字 符 不 占 任 何 宽 度 4. &{"string"}: 表 示 一 段 空 白, 空 白 的 长 度 等 于 花 括 号 内 那 段 字 符 串 所 占 宽 度 5. : 表 示 后 面 的 两 个 字 符 重 叠 打 印 ( 相 当 于 打 字 机 在 同 一 位 置 打 印 两 个 字 符 ); 也 可 以 在 第 二 个 字 符 前 加 上 一 个 数 字, 表 示 第 二 个 字 符 相 对 于 第 一 个 字 符 有 一 个 竖 直 方 向 的 移 动, 移 动 距 离 等 于 该 数 字 乘 以 字 符 尺 寸 上 面 提 到 的 字 符, 也 可 以 是 包 含 在 花 括 号 ({}) 内 的 字 符 串 除 了 上 面 这 些 特 殊 标 志, 还 可 以 临 时 改 变 字 符 ( 或 字 符 串 ) 的 字 体, 方 法 是 : {/ 字 体 名 = 字 体 大 小 字 符 } 下 面 我 们 看 一 些 例 子 : "a^x" "a_x" 23

"a^b_{cd}" 这 里 的 上 下 角 标 没 有 对 齐, 因 为 上 标 b 需 要 占 一 定 宽 度 "a^@b_{cd}" 这 里 我 们 看 到 了 @ 的 作 用 "abc&{de}fg" 这 里 & 后 面 的 字 符 没 有 显 示, 留 出 一 段 和 这 些 字 符 同 样 宽 度 的 空 白 "~a{1.2\\_}" 注 意 这 里 的 两 个 反 斜 杠 因 为 下 横 杠 (_) 是 一 个 特 殊 字 符, 需 要 在 前 面 加 反 斜 杠 \ 来 表 示 它 本 来 的 意 义, 而 反 斜 杠 本 身 也 是 一 个 特 殊 字 符, 需 要 在 它 前 面 再 加 一 个 反 斜 杠 我 们 在 第 四 讲 里 谈 到 过 双 引 号 和 单 引 号 的 区 别 如 果 我 们 在 这 里 用 单 引 号 而 不 是 双 引 号, 那 么 只 需 要 一 个 反 斜 杠 就 可 以 了 这 里 的 1.2 表 示 后 面 的 字 符 (_) 向 上 移 动 1.2 个 字 符 大 小 的 距 离 {/Symbol abc}abc 这 里 第 一 个 花 括 号 里 的 abc 使 用 了 Symbol 字 体, 而 后 面 括 号 外 的 abc 使 用 的 是 默 认 字 体 注 意 字 体 名 称 前 的 斜 杠 方 向 这 里 我 们 看 到,Symbol 字 体 里 的 英 文 字 母 对 应 显 示 的 是 希 腊 字 母 Symbol 字 体 里 还 包 括 了 一 些 其 它 符 号, 下 面 是 完 整 的 Symbol 字 体 列 表 : 24

上 面 图 中 显 示 的 是 Symbol 字 体 对 应 的 16 进 制 代 码 例 如 上 面 例 子 中 的 希 腊 字 母 αβχ, 对 应 的 16 进 制 代 码 分 别 为 61 62 63, 转 换 为 8 进 制 代 码 就 是 141 142 143 在 gnuplot 里, 我 们 可 以 直 接 用 字 符 的 8 进 制 代 码 表 示 这 个 字 符, 所 以 我 们 也 可 以 用 {/Symbol \141\142\143} 来 表 示 αβχ 根 据 上 面 的 内 容, 下 面 是 一 个 综 合 起 来 的 例 子 : gnuplot > set term wxt enhanced gnuplot > set xlabel "X" gnuplot > set ylabel "Y" gnuplot> set xrange [ 0 : 1 0 ] gnuplot> set xtics 0,1,10 gnuplot> unset key gnuplot> set t i t l e " f ( x ) = {/Symbol=16 \326}~{x^@3}{1.1{/ Symbol=16 \276}}&{aa }\ > 函 数 图 像 " gnuplot> plot sqrt ( x 3) 25

虽 然 利 用 enhanced 模 式 也 能 显 示 一 些 简 单 的 数 学 表 达 式, 但 是 对 于 稍 微 复 杂 一 点 的 公 式 来 说, 显 示 效 果 无 法 令 人 满 意 要 在 gnuplot 里 显 示 数 学 公 式, 终 极 方 案 还 是 要 用 L A TEX 12 插 入 L A TEX 公 式 上 一 次 我 们 谈 过, 在 gnuplot 里 使 用 enhanced 模 式 虽 然 可 以 生 成 一 些 简 单 的 数 学 表 达 式, 但 是 对 于 稍 复 杂 的 数 学 公 式 来 说,enhanced 模 式 没 办 法 生 成 令 人 满 意 的 结 果 这 里 我 们 介 绍 gnuplot 的 另 外 一 个 terminal:epslatex epslatex 和 我 们 之 前 介 绍 过 的 postscript eps 输 出 方 式 非 常 接 近, 因 此 它 们 很 多 参 数 都 是 相 同 的 区 别 在 于,epslatex 使 用 postscript eps 仅 生 成 图 形 存 于 eps 文 件, 而 所 有 文 字 标 签 包 含 在 另 外 一 个 L A TEX 文 件 中 在 gnuplot 完 成 输 出 之 后, 使 用 L A TEX 命 令 最 终 生 成 完 整 的 图 片 这 种 做 法 的 好 处 是 不 言 而 喻 的, 即 使 在 输 出 完 成 后, 我 们 仍 然 可 以 编 辑 L A TEX 文 件 获 得 我 们 想 要 的 显 示 效 果 下 面 我 们 看 例 子 : gnuplot > set xlabel X gnuplot > set ylabel Y gnuplot> set t i t l e Error f u n c t i o n $\ d i s p l a y s t y l e \mathrm{ e r f }( x ) = \ f r a c {2}{\ s q r t {\ pi }} \ int_0^x e^{ t ^2}\,\mathrm{d} t$ gnuplot> set xrange [ 4:4] gnuplot> set yrange [ 1. 1 : 1. 1 ] gnuplot> unset key gnuplot> set term e p s l a t e x standalone lw 2 c o l o r 11 gnuplot> set output " e r f. tex " gnuplot> plot erf ( x ) lw 2 gnuplot > set output 前 三 行 的 标 签 文 字, 我 们 使 用 了 单 引 号, 避 免 了 双 引 号 内 需 要 连 着 两 个 反 斜 杠 的 麻 烦 在 title 里 面, 我 们 使 用 了 L A TEX 数 学 公 式 在 set term 命 令 里,standalone 是 一 个 新 的 参 数, 它 表 示 生 成 完 整 的 L A TEX 文 件 如 果 没 有 这 个 参 数, 生 成 的 L A TEX 文 件 将 不 能 单 独 编 译, 必 须 把 代 码 插 入 其 它 的 L A TEX 文 件 中 编 译 set term 最 后 的 数 字 11 代 表 字 体 大 小 set output 只 需 指 定 L A TEX 文 件 名, 而 26

不 需 要 指 定 eps 文 件 名 我 们 谈 到 过 gnuplot 包 含 很 多 预 定 义 的 函 数, 这 里 的 erf 就 是 其 中 之 一, 表 示 误 差 函 数 我 们 通 过 epstopdf 命 令 将 生 成 的 eps 图 片 转 为 pdf, 然 后 用 pdflatex 命 令 可 以 把 图 片 直 接 编 译 为 pdf 文 件, 下 面 是 显 示 的 效 果 : 1 Error function erf(x) = 2 x e t2 dt π 0 0.5 Y 0-0.5-1 -4-3 -2-1 0 1 2 3 4 X 怎 么 样?L A TEX 的 数 学 公 式 效 果 真 不 是 盖 的 13 栅 格 以 及 方 程 数 值 解 估 算 我 们 现 在 来 画 一 个 0 阶 贝 塞 尔 函 数 J 0 (x): gnuplot > set term wxt enhanced gnuplot > set xlabel "X" gnuplot > set ylabel "Y" gnuplot> set xrange [ 0 : 1 0 ] gnuplot> set xtics 0,1,10 gnuplot> unset key gnuplot> set t i t l e "0 阶 贝 塞 尔 函 数 J_0( x ) " gnuplot> plot besj0 ( x ) 27

这 里 的 besj0(x) 就 是 gnuplot 里 面 预 定 义 的 0 阶 贝 塞 尔 函 数 如 果 现 在 请 您 从 这 个 图 上 估 计 出 [0, 10] 内 J 0 (x) 的 零 点 数 值, 也 就 是 方 程 J 0 (x) = 0 的 解, 恐 怕 您 很 难 说 的 准 确 但 是 如 果 为 这 个 图 加 上 栅 格 (grid), 就 容 易 多 了 : gnuplot > set grid gnuplot > replot 这 时 我 们 很 容 易 估 计 出 三 个 零 点 的 数 值 :2.4, 5.5, 8.6 通 过 查 表 我 们 可 以 知 道, 这 三 个 零 点 比 较 精 确 的 数 值 分 别 为 2.4048, 5.5201, 8.6537 这 和 我 们 的 估 计 值 差 不 太 多 如 果 我 们 想 更 精 确 的 估 计 数 值, 可 以 尝 试 改 一 下 xrange: gnuplot> set xrange [ 8 : 9 ] gnuplot> set xtics 8, 0. 1, 9 gnuplot > replot 这 相 当 于 把 图 像 在 零 点 附 近 放 大 了 把 鼠 标 放 在 画 图 区 域, 画 图 框 左 下 角 就 会 显 示 出 鼠 标 所 在 位 置 的 坐 标 现 在 我 们 把 鼠 标 放 在 函 数 图 线 和 X 轴 的 交 叉 点 上, 左 下 角 显 示 的 横 坐 标 为 8.65243, 这 和 我 们 查 表 所 得 的 数 值 更 接 近 了 如 果 想 进 一 步 让 结 果 精 确 一 些, 我 们 可 以 利 用 gnuplot 的 计 算 功 能 我 们 可 以 通 过 尝 试 计 算 的 方 法 获 得 方 程 的 数 值 解 : gnuplot> print besj0 ( 8. 6 5 ) 0.00101216621937318 gnuplot> print besj0 ( 8. 6 6 ) 0. 0017019446057587 gnuplot> print besj0 ( 8. 6 5 3 7 ) 7.5770361108123 e 06 gnuplot> print besj0 ( 8. 6 5 3 6 ) 3.47225104115535 e 05 gnuplot> print besj0 ( 8. 6 5 3 8 ) 1. 95681245811775 e 05 28

所 以 在 8.6 附 近,J 0 (x) = 0 精 确 到 小 数 点 后 4 位 的 数 值 解 为 8.6537, 这 和 我 们 查 表 的 结 果 一 模 一 样 由 于 我 们 已 经 通 过 图 像 知 道 了 数 值 解 的 大 概 位 置, 再 加 上 合 理 利 用 线 性 插 值, 我 们 可 以 很 快 得 到 精 确 的 结 果 14 第 二 坐 标 轴 回 首 看 看 我 们 以 前 所 有 的 作 图, 横 坐 标 都 标 示 在 底 部, 而 纵 坐 标 都 标 示 在 左 侧 其 实, 在 图 像 顶 部 和 右 侧, 还 隐 藏 着 一 对 不 太 引 人 注 意 的 坐 标 轴, 我 们 可 以 管 它 们 叫 做 第 二 坐 标 轴 平 时, 它 们 只 是 第 一 对 坐 标 轴 的 镜 像 ; 在 我 们 需 要 的 时 候, 它 们 可 以 用 来 表 示 不 同 的 物 理 量 有 时 候, 我 们 会 有 两 组 性 质 不 同 但 是 又 相 互 关 联 的 数 据, 这 时 候 我 们 或 许 想 把 他 们 画 在 同 一 副 图 上, 以 便 比 较 还 拿 北 京 市 月 平 均 降 水 量 举 例, 但 是 这 次, 我 们 把 温 度 也 加 上 下 面 是 我 们 的 数 据 文 件 weather_beijing.dat: ### 文 件 开 始 ### # 北 京 月 平 均 降 水 量 ( 毫 米 ) 及 气 温 ( 摄 氏 度 ) # # 月 份 降 水 量 气 温 # =================== 1 2.5-4 2 5.1-2 3 10.2 6 4 25.4 13 5 27.9 20 6 71.1 24 7 175.3 26 8 182.9 25 9 48.3 20 10 17.8 13 11 5.1 5 12 2.5-2 ### 文 件 结 束 ### 我 们 之 前 讲 过 的 所 有 有 关 坐 标 的 参 数, 在 第 二 坐 标 轴 上 均 适 用, 只 不 过 相 应 的 名 字 起 始 字 母 改 为 x2 或 者 y2, 例 如 ylabel 改 为 y2label 另 外,plot 命 令 有 一 个 新 的 参 数 axis, 用 来 控 制 使 用 哪 个 坐 标 轴, 例 如 axis x1y2 就 表 示 使 用 第 一 横 轴 和 第 二 纵 轴 现 在 我 们 来 看 用 上 面 数 据 作 图 的 例 子 : gnuplot> set xlabel " 月 份 " gnuplot> set ylabel " 降 水 量 ( 毫 米 )" gnuplot> set y 2 l a b e l " 气 温 ( 摄 氏 度 )" gnuplot> set t i t l e " 北 京 市 月 平 均 降 水 量 及 气 温 " gnuplot> set xrange [ 0. 5 : 1 2. 5 ] gnuplot> set xtics 1,1,12 gnuplot> plot " weather_beijing. dat " u 1 : 2 w lp pt 5 l c r g b c o l o r "#2B60DE"\ > a x i s x1y1 t " 降 水 量 ", " weather_beijing. dat " u 1 : 3 w lp pt 7\ > l c r g b c o l o r "#F62817" a x i s x1y2 t " 气 温 " 29

这 里 的 气 温 数 据 使 用 了 图 像 右 边 的 第 二 纵 轴 y2, 但 是 y2 轴 上 的 刻 度 并 没 有 变 化, 依 然 是 左 边 y1 轴 的 镜 像 我 们 在 这 里 有 两 件 事 要 做 : 1. 去 除 右 边 纵 轴 上 的 y1 刻 度 镜 像, 否 则 这 些 刻 度 标 记 将 和 新 的 y2 刻 度 标 记 混 起 来, 导 致 无 法 识 别 ; 2. 在 右 边 纵 轴 上 加 上 y2 刻 度 标 记 我 们 执 行 下 面 的 命 令 : gnuplot> set ytics nomirror gnuplot> set y 2 t i c s gnuplot > replot 好 了, 现 在 降 水 量 和 温 度 数 据 分 别 对 应 于 左 侧 和 右 侧 的 纵 坐 标 看 到 这 里, 我 们 可 能 有 点 怀 念 我 们 上 一 讲 谈 到 的 grid 如 果 能 加 上 栅 格, 数 据 图 示 就 更 清 楚 了 但 是 现 在 我 们 有 两 组 不 同 的 纵 坐 标, 如 果 都 开 启 栅 格, 还 不 乱 套 了?set grid 命 令 允 许 我 们 在 开 启 栅 格 时, 选 择 使 用 哪 一 组 坐 标 例 如 : 30

gnuplot> set grid xtics y 2 t i c s 会 开 启 x1 和 y2 的 栅 格 但 是 这 还 是 不 能 兼 顾 两 组 数 据 最 好 的 解 决 方 案 是, 让 两 个 纵 轴 有 相 同 数 目 的 分 格, 这 样 两 套 grid 也 就 重 合 了, 开 启 任 何 一 个 就 可 以 了 例 如, 上 面 的 图 中 左 侧 纵 轴 有 10 个 分 格, 我 们 让 右 侧 纵 轴 也 有 10 个 分 格 : gnuplot> set y2range [ 10:40] gnuplot> set y 2 t i c s 5 gnuplot > set grid gnuplot > replot 现 在 看 起 来 好 多 了 最 后, 不 知 道 大 家 注 意 到 没 有, 在 开 始 的 plot 命 令 里, 我 们 用 了 新 的 方 式 定 义 图 线 颜 色 在 第 七 讲 点 线 风 格 里, 我 们 提 到 过, 可 以 用 预 定 义 的 数 字 代 码 来 定 义 图 线 颜 色 但 是 在 这 里, 我 们 使 用 了 rgbcolor 来 定 义 颜 色, 这 很 大 程 度 上 增 加 了 颜 色 选 择 范 围, 允 许 更 好 的 显 示 效 果 而 其 用 法 也 很 简 单, 就 是 在 rgbcolor 之 后, 加 上 颜 色 的 RGB 代 码, 了 解 HTML 的 朋 友 应 该 对 这 个 不 陌 生 15 Gnuplot 的 坐 标 系 统 及 标 签 我 们 现 在 知 道 了 gnuplot 有 第 一 (first) 和 第 二 (second) 两 套 坐 标 系 统, 但 是 gnuplot 的 坐 标 系 统 还 不 止 于 此 除 此 之 外, 它 还 有 graph,screen 和 character 三 套 坐 标 系 统 graph 和 screen 都 是 归 一 化 的 坐 标 系 统 graph 以 坐 标 轴 包 围 区 域 为 界, 左 下 角 为 0,0, 右 上 角 为 1,1;screen 以 整 个 图 片 区 域 为 界, 左 下 角 为 0,0, 右 上 角 为 1,1 character 顾 名 思 义, 是 以 字 符 大 小 为 单 位 长 度 的 坐 标 系 统, 因 此 它 的 单 位 长 度 依 赖 于 字 体 大 小 它 的 原 点 位 置 和 screen 相 同 下 面 我 们 结 合 label 命 令 来 了 解 一 下 这 几 个 坐 标 系 统 我 们 之 前 讲 过 xlabel 和 ylabel 而 这 里 的 label 命 令, 是 在 图 中 任 何 地 方 插 入 文 字 标 签 还 是 来 看 例 子 : gnuplot> s i n c ( x ) = sin ( pi x ) /( pi x ) gnuplot > set xlabel "X" gnuplot > set ylabel "Y" gnuplot> unset key gnuplot > set samples 500 31

gnuplot> set xrange [ 5:5] gnuplot> set xtics 1 gnuplot> set x2range [ 0 : 1 0 ] gnuplot> set x 2 t i c s 1 gnuplot> set y2range [ 2:5] gnuplot> set y 2 t i c s 1 gnuplot > set grid gnuplot> set label 1 " Hello f i r s t " at 2, 0. 5 gnuplot> set label 2 " Hello second " at second 2, 0. 5 gnuplot> set label 3 " Hello graph " at graph 0. 2, 0. 5 gnuplot> set label 4 " Hello s c r e e n " at s c r e e n 0. 2, 0. 5 gnuplot> set label 5 " Hello c h a r a c t e r " at c h a r a c t e r 10,5 gnuplot> plot s i n c ( x ) 这 里 我 们 画 一 个 sinc 函 数 图 像 为 了 说 明 问 题, 我 们 把 第 二 坐 标 系 也 都 标 示 了 出 来, 虽 然 函 数 图 像 并 没 有 用 到 第 二 坐 标 其 他 命 令 前 面 都 讲 过 了, 这 里 只 看 五 个 set label 命 令 set label 之 后 紧 跟 的 那 个 整 数, 就 是 一 个 标 识 符, 用 以 区 别 各 个 label, 可 以 随 便 选 个 整 数 在 字 符 串 之 后,at 参 数 指 定 标 签 坐 标 默 认 为 first 坐 标 系 统, 也 可 以 使 用 其 它 坐 标 系 统 下 面 是 生 成 的 图 片 : 为 了 帮 助 大 家 理 解, 我 们 把 graph 和 screen 各 自 的 坐 标 区 域 分 别 用 绿 色 和 橙 色 表 示 了 出 来 标 签 文 字 的 默 认 对 齐 方 式 为 居 左, 也 就 是 指 定 的 坐 标 位 置 在 文 字 的 左 边 我 们 也 可 以 在 label 命 令 里 选 择 其 他 对 齐 方 式 除 此 之 外, 我 们 还 可 以 在 label 命 令 里 指 定 文 字 颜 色, 旋 转 文 字, 或 者 在 指 定 坐 标 位 置 处 加 一 个 点 下 面 例 子 中 的 每 个 参 数 不 必 一 一 解 释 了, 因 为 和 我 们 前 面 接 触 过 的 命 令 都 是 一 致 的 : gnuplot> set label 1 " Hello red l e f t " at 2, 0. 4 l e f t t e x t c o l o r rgb "#FF0000" gnuplot> set label 2 " Hello green c e n t e r " at 2, 0. 5 c e n t e r t e x t c o l o r rgb "#00 FF00" gnuplot> set label 3 " Hello blue r i g h t " at 2, 0. 6 r i g h t t e x t c o l o r rgb "#0000FF" gnuplot> set label 4 " Hello r o t a t e " at 2,0.4 r o t a t e by 45 gnuplot> set label 5 " Hello point " at 3,0.2 point pt 7 l c rgb "#FF9900" gnuplot > replot 32

16 箭 头 有 了 坐 标 系 的 知 识 打 底, 其 他 很 多 东 西 很 好 谈 了 我 们 的 图 上 除 了 标 签 之 外, 还 有 一 个 常 用 的 标 志 : 箭 头 关 于 箭 头 的 命 令 是 set arrow, 语 法 和 label 有 些 类 似, 包 括 以 下 这 些 常 用 参 数 : from... to... 箭 头 的 起 点 和 终 点 坐 标 如 果 把 to 换 成 rto, 第 二 个 坐 标 就 表 示 相 对 位 置 而 不 是 绝 对 坐 标 nohead, head, backhead, heads 分 别 表 示 : 没 有 箭 头 ( 其 实 就 是 线 段 ), 箭 头 在 终 点, 箭 头 在 起 点, 双 向 都 有 箭 头 size <length>,<angle>,<backangle> 箭 头 尺 寸, 默 认 长 度 单 位 为 first 坐 标 单 位 长 度 下 图 中 A,B,C 分 别 代 表 <length>,<angle>,<backangle> C B A filled, empty, nofilled 箭 头 的 三 种 填 充 风 格 : Filled Empty Nofilled 下 面 我 们 看 例 子, 还 是 画 sinc(x) 函 数 : gnuplot> set term wxt f o n t "DejaVu Sans, 1 2 " gnuplot> s i n c ( x ) = sin ( pi x ) /( pi x ) gnuplot > set xlabel "X" 33

gnuplot > set ylabel "Y" gnuplot> set yrange [ 0. 4 : 1. 2 ] gnuplot> set t i t l e " s i n c ( x ) 函 数 " gnuplot> unset key gnuplot > set samples 500 gnuplot> set arrow 1 from 2, 1. 0 5 to 0. 3, 1 f i l l e d size 0. 5, 1 5, 6 0 lw 2 gnuplot> set label 1 at 0,1 point pt 7 ps 1. 5 l c rgb "#F87217" gnuplot> set label 2 " 最 大 值 在 (0, 1)" at 2. 1, 1. 0 5 gnuplot> plot s i n c ( x ) lw 2 17 边 框 和 坐 标 轴 我 们 现 在 所 有 绘 图 的 坐 标 刻 度 均 标 在 图 像 边 框 上, 无 论 上 下 左 右 这 样 做 的 好 处 是 函 数 或 数 据 图 线 清 楚, 不 会 和 坐 标 标 注 混 在 一 起 其 实, 我 们 小 时 候 数 学 课 上 最 早 学 习 坐 标 系 的 时 候, 都 是 让 X 轴 和 Y 轴 正 交 于 原 点, 而 刻 度 标 注 在 坐 标 轴 上 这 样 的 图 像 在 定 性 表 现 函 数 关 系, 尤 其 有 一 定 对 称 性 的 函 数 关 系 时, 比 较 一 目 了 然 让 我 们 来 看 看 怎 样 用 gnuplot 得 到 这 样 的 效 果 1. 用 unset border 命 令 把 边 框 去 掉 ; 2. 用 set zeroaxis 命 令 画 出 正 交 于 原 点 的 坐 标 轴 ; 3. 在 设 定 坐 标 刻 度 时 加 上 axis 参 数, 这 样 刻 度 会 出 现 在 坐 标 轴 上 面, 而 不 是 边 框 上 为 了 避 免 审 美 疲 劳, 这 次 我 们 拿 高 斯 函 数 举 个 例 子 : gnuplot > set term wxt enhanced f o n t " Times New Roman, 1 6 " gnuplot> gauss ( x ) = exp( pi x x ) gnuplot> set t i t l e " 函 数 e^{ πx^2}" gnuplot > set samples 500 gnuplot> set xrange [ 3:3] gnuplot> set yrange [ 0. 2 : 1. 2 ] gnuplot> unset key gnuplot> unset border 34

gnuplot > set zeroaxis l t 1 lw 2 gnuplot> set xtics a x i s 2,1,2 gnuplot> set ytics a x i s 0,1,1 gnuplot> plot gauss ( x ) lw 3 例 子 中 的 参 数 前 面 都 介 绍 过, 如 果 不 记 得 了, 可 以 复 习 一 下 坐 标 取 值 范 围 及 刻 度 和 点 线 风 格 等 章 节 这 里 的 图 像 已 经 很 像 模 像 样 了, 除 了 标 签 位 置 还 不 那 么 理 想, 而 且 坐 标 轴 没 有 箭 头 幸 好, 我 们 上 一 讲 刚 刚 谈 到 过 箭 头, 下 面 来 试 试 做 一 下 微 调 : gnuplot> set t i t l e " 函 数 e^{ πx^2}" o f f s e t 12, 5 gnuplot> set xtics a x i s 2,1,2 o f f s e t 0. 4, 0 gnuplot> set ytics a x i s 0,1,1 o f f s e t 0, 0. 4 gnuplot> set arrow 1 from 2,0 to 3. 2, 0 f i l l e d size 0. 2, 1 5, 6 0 lw 2 gnuplot> set arrow 2 from 0,1 to 0, 1. 2 2 f i l l e d size 0. 2, 1 5, 6 0 lw 2 gnuplot > set rmargin 4 gnuplot> set label 1 "X" at 3.0, 0.1 gnuplot> set label 2 "Y" at 0.3,1.2 gnuplot > replot 35

这 里 有 几 个 命 令 同 时 用 到 了 新 的 参 数 :offset 它 的 作 用 就 是 把 命 令 里 提 到 的 标 签 文 字 平 移 一 段 距 离 在 这 里,offset 默 认 的 坐 标 系 统 是 character 我 们 慢 慢 会 体 会 到 这 种 做 法 的 好 处, 它 使 得 我 们 很 多 时 候 改 变 字 体 大 小, 而 不 必 重 新 设 置 offset 另 外,set rmargin 命 令 用 于 设 置 图 像 右 边 空 白 宽 度, 单 位 也 是 character 一 般 情 况 下, 四 边 空 白 宽 度 都 是 自 动 设 置 的 现 在 我 们 在 右 边 增 加 了 箭 头, 而 绘 图 显 示 区 域 不 会 因 此 自 动 扩 大, 这 样 会 导 致 箭 头 无 法 完 整 显 示, 所 以 要 手 动 改 一 下 设 置 相 应 的, 上 左 下 边 的 空 白 宽 度, 分 别 由 tmargin,lmargin,bmargin 参 数 控 制 18 图 例 在 同 一 图 像 中 包 含 多 组 数 据 或 函 数 时, 图 例 是 必 要 的 我 们 这 一 次 谈 一 谈 图 例 的 微 调 这 次 来 画 前 3 阶 的 第 一 类 贝 塞 尔 函 数 J n (x) 在 gnuplot 里,0 阶 和 1 阶 贝 塞 尔 函 数 已 经 定 义 了, 分 别 为 besj0(x) 和 besj1(x), 而 2 阶 贝 塞 尔 函 数 可 以 通 过 递 推 关 系 构 造 出 来 下 面 是 例 子 : gnuplot > set term wxt enhanced gnuplot> b e s j 2 ( x ) = besj1 ( x ) 2/x besj0 ( x ) gnuplot> set xrange [ 0 : 2 0 ] gnuplot> set xtics 2 gnuplot > set xlabel "X" gnuplot > set ylabel "Y" gnuplot> set t i t l e " B e s s e l Functions o f the F i r s t Kind" gnuplot > set grid gnuplot> set style l i n e 1 lw 2 l c rgb "#F62217" gnuplot> set style l i n e 2 lw 2 l c rgb "#D4A017" gnuplot> set style l i n e 3 lw 2 l c rgb "#2B60DE" gnuplot> plot besj0 ( x ) l s 1 t "J_0( x ) ", besj1 ( x ) l s 2 t "J_1( x ) ", b e s j 2 ( x ) l s 3 t "J_2( x ) " 之 前 我 们 讲 过,plot 命 令 后 面 可 以 跟 随 一 些 参 数 ( 例 如 linewidth, linecolor 等 ) 来 改 变 点 线 风 格 在 上 面 的 例 子 中, 我 们 把 这 些 参 数 单 独 拿 出 来 放 到 了 set style 命 令 里, 定 义 了 三 个 linestyle, 然 后 在 plot 命 令 里 再 调 用 这 些 linestyle 这 样 子 做 和 我 们 之 前 的 做 法 效 果 上 没 什 么 不 同, 唯 一 的 区 别 是 让 plot 命 令 短 了 一 些 另 外, 改 变 风 格 可 能 容 易 一 点 上 面 是 默 认 的 图 例, 下 面 让 我 们 进 行 微 调 36

1. 为 图 例 加 上 边 框 gnuplot > set key box gnuplot > replot 2. 改 变 图 例 显 示 位 置 gnuplot> set key c e n t e r at 1 0, 0. 7 gnuplot > replot 3. 把 图 例 的 title 和 图 线 示 例 调 换 位 置 gnuplot> set key gnuplot > replot r e v e r s e 4. 调 整 图 例 边 框 宽 度 width( 或 高 度 height) 37

gnuplot > set key width 1 gnuplot > replot 5. 调 整 title 文 字 对 齐 方 式 (Left 或 者 Right, 注 意 首 字 母 大 写 ) gnuplot> set key L e f t gnuplot > replot 6. 调 整 图 例 行 间 隔 gnuplot> set key spacing 1. 2 gnuplot > replot 7. 调 整 图 线 示 例 长 度 gnuplot > set key samplen 2 gnuplot > replot 这 些 并 不 是 set key 的 全 部 参 数 在 gnuplot 里, 如 果 想 深 入 了 解 任 何 命 令 的 详 细 用 法, 不 要 忘 记 使 用 help 命 令 19 对 数 坐 标 我 们 这 次 来 谈 谈 怎 样 在 gnuplot 里 面 绘 制 对 数 坐 标 图 我 们 先 在 一 般 直 角 坐 标 系 里 画 一 下 函 数 3x 的 图 像 : gnuplot > set term wxt enhanced gnuplot > set xlabel "X" gnuplot > set ylabel "Y" gnuplot> unset key gnuplot> set t i t l e " 函 数 3^x 图 像 " gnuplot> set xrange [ 0. 1 : 2 0 ] gnuplot > plot 3 x lw 2 38

下 面 把 y 轴 改 为 对 数 坐 标 : gnuplot> set logscale y gnuplot > replot set logscale 命 令 用 于 指 定 对 数 坐 标 轴, 这 个 例 子 中 是 y 轴 如 果 要 使 用 双 对 数 坐 标, 只 需 执 行 : set logscale xy 这 里 y 轴 的 数 字 标 注 有 点 不 好 看, 因 为 默 认 情 况 下 gnuplot 根 据 数 字 大 小 自 动 选 择 数 字 格 式 我 们 希 望 用 一 致 的 方 式, 例 如 都 以 指 数 方 式 显 示 数 字 我 们 可 以 用 set format 命 令 来 指 定 数 字 显 示 格 式, 使 用 方 法 为 set format 加 上 坐 标 轴, 再 加 上 表 示 格 式 的 字 符 串 : gnuplot> set format y "%. 0 e " gnuplot > replot 39

后 面 表 示 数 字 格 式 的 字 符 串, 对 于 熟 悉 C 语 言 的 读 者 应 该 不 陌 生, 它 和 printf 函 数 中 表 示 数 字 格 式 的 字 符 串 非 常 类 似 常 见 的 有 以 下 几 个 : %f %e 小 数 格 式 指 数 格 式 %g 根 据 长 度 自 动 选 择 %f 或 者 %e %t %T 指 数 格 式 的 有 效 数 字 部 分 指 数 格 式 的 指 数 部 分 另 外, 各 特 殊 字 符 之 前 的 数 字 可 以 用 于 表 示 有 效 数 字 的 精 度 20 图 像 尺 寸 当 我 们 在 gnuplot 里 面 执 行 : gnuplot> set term pngcairo 我 们 会 发 现 有 如 下 的 返 回 信 息 : Terminal type set to pngcairo Options are s i z e 640, 480 这 表 示 输 出 的 png 图 片 默 认 大 小 是 640x480 像 素 如 果 我 们 想 改 变 输 出 图 片 的 大 小, 可 以 在 set term 命 令 之 后 加 上 size 参 数, 例 如 : gnuplot> set term pngcairo size 800,600 对 于 eps 和 pdf 输 出, 默 认 的 size 单 位 是 英 寸, 而 不 是 像 素 这 是 因 为 eps 和 pdf 均 是 矢 量 图 片, 像 素 值 没 什 么 意 义 除 了 在 设 置 terminal 的 时 候 可 以 指 定 size 参 数,gnuplot 里 面 还 有 一 个 单 独 的 set size 命 令 这 两 种 设 置 方 法 的 区 别 在 于 : set terminal 的 时 候 size 参 数 指 定 的 是 整 个 图 片 的 尺 寸, 包 括 标 签 标 题 四 边 空 白 等 等, 而 set size 命 令 指 定 的 仅 仅 是 绘 图 区 域 的 尺 寸 ; 40

set terminal 的 时 候 size 参 数 指 定 的 是 绝 对 尺 寸, 例 如 像 素 英 寸 等, 而 set size 命 令 指 定 的 是 相 对 尺 寸, 也 就 是 绘 图 区 域 相 对 于 整 个 图 片 大 小 的 比 例 例 如 set size 0.5,0.5 时, 绘 图 区 域 仅 占 整 个 图 片 大 小 的 四 分 之 一 由 于 上 述 第 二 点,set size 命 令 更 常 用 的 形 式 是 set size ratio, 这 时 只 需 给 出 绘 图 区 域 高 和 宽 的 比 例, 例 如 : gnuplot> set size r a t i o 0. 5 将 会 画 出 高 宽 比 为 1:2 的 图 像 而 高 宽 比 为 1 的 图 像 ( 也 就 是 正 方 形 ), 还 有 一 个 单 独 的 设 置 方 法 : gnuplot> set size square 在 gnuplot 旧 的 版 本 中, 这 两 种 设 置 尺 寸 的 方 法 比 较 混 乱 从 gnuplot 4.4 起, 基 本 上 都 统 一 为 上 述 方 式 21 极 坐 标 gnuplot 可 以 在 极 坐 标 下 绘 图, 相 应 命 令 是 : gnuplot > set polar 然 后 会 出 现 下 面 的 返 回 信 息 : dummy v a r i a b l e i s t f o r curves 这 表 明, 在 极 坐 标 下, 自 变 量 名 字 是 t, 这 不 同 于 直 角 坐 标 下 的 x, 需 要 注 意 t 本 身 代 表 角 度, 默 认 单 位 是 弧 度 (radians) 如 果 您 想 使 用 角 度 (degrees), 可 以 执 行 下 面 的 命 令 : gnuplot> set angles d e g r e e s 下 面 我 们 看 例 子 : gnuplot > set polar gnuplot> unset key gnuplot > set samples 1000 gnuplot> set xrange [ 40:40] gnuplot> set yrange [ 40:40] gnuplot> set size square gnuplot > plot t lw 2 41

从 这 里 我 们 看 出,t 默 认 的 取 值 范 围 是 是 [0:2*pi] 和 直 角 坐 标 类 似, 改 变 t 取 值 范 围 的 命 令 是 set trange: gnuplot> set trange [ 0 : 1 0 pi ] gnuplot > replot 极 坐 标 下 的 栅 格 和 直 角 坐 标 不 同, 应 该 是 按 一 定 角 度 分 隔 的 扇 区, 所 以 set grid 命 令 需 要 加 上 polar 参 数 默 认 扇 区 分 隔 角 度 是 30 度, 该 角 度 可 以 作 为 set grid polar 的 参 数 进 行 调 整 : gnuplot > set grid polar p i /5 gnuplot> plot 5+25 cos (5 t /2) lw 2 42

22 参 数 方 程 gnuplot 也 能 画 参 数 方 程 首 先 设 置 参 数 方 程 环 境 : gnuplot > set parametric 然 后 我 们 会 看 见 返 回 信 息 : dummy v a r i a b l e i s t f o r curves, u/v f o r s u r f a c e s 和 极 坐 标 类 似, 参 数 方 程 的 自 变 量 也 是 t 后 面 的 u/v 是 用 于 3D 绘 图 的 参 数 方 程 自 变 量, 我 们 目 前 暂 时 不 管 它 对 于 参 数 方 程 x = f(t), y = g(t), 绘 图 命 令 为 plot f ( t ), g ( t ) 下 面 我 们 看 一 个 例 子, 这 是 一 个 李 萨 如 (Lissajous) 曲 线 : gnuplot > set parametric gnuplot> set xrange [ 1. 2 : 1. 2 ] gnuplot> set yrange [ 1. 2 : 1. 2 ] gnuplot> set trange [ 0 : 2 pi ] gnuplot > set samples 1000 gnuplot> set size square gnuplot> unset key gnuplot> plot sin (3 t ), sin (4 t ) lw 2 43

23 误 差 条 Error bar 是 在 图 像 上 表 现 数 据 误 差 范 围 的 一 种 方 式 对 于 含 有 误 差 项 的 数 据, 除 了 通 常 的 x 轴 和 y 轴 两 列 数 据 外, 我 们 还 需 要 有 额 外 的 误 差 数 据 列 拿 x 数 据 列 举 例, 如 果 误 差 用 标 准 差 σ x 来 表 示, 那 么 数 据 取 值 范 围 可 以 表 示 为 [x σ x, x + σ x ], 这 时 候 只 要 增 加 一 列 误 差 项 就 行 了, 所 以 一 共 需 要 3 列 数 据 如 果 误 差 用 最 小 值 xmin 和 最 大 值 xmax 来 表 示, 那 么 数 据 取 值 范 围 可 以 表 示 为 [x min, x max ], 这 时 候 需 要 增 加 两 列 误 差 项, 所 以 一 共 需 要 4 列 数 据 对 于 y 数 据 误 差, 表 达 方 法 和 x 类 似 如 果 同 时 包 含 x 和 y 误 差, 就 需 要 把 两 者 结 合 起 来 在 gnuplot 里,error bar 的 基 本 使 用 方 法 是 : plot " 数 据 文 件 名 " using <using 参 数 > with <x e r r o r b a r s y e r r o r b a r s xyerrorbars > using 命 令 在 之 前 的 多 组 数 据 绘 图 博 文 里 已 经 介 绍 过, 目 的 是 选 择 哪 些 列 数 据 进 行 绘 图, 数 据 列 数 必 须 和 后 面 选 择 的 绘 图 方 式 对 应 with 命 令 后 面 跟 的 是 绘 图 方 式, 选 择 用 xerrorbars,yerrorbars, 还 是 xyerrorbars 根 据 不 同 绘 图 方 式, 所 需 数 据 列 数 分 别 为 : xerrorbars 3 列 :x y σ x 4 列 :x y x min x max yerrorbars 3 列 :x y σ y 4 列 :x y y min y max xyerrorbars 4 列 :x y σ x σ y 6 列 :x y x min x max y min y max 下 面 我 们 举 一 个 例 子, 这 是 一 个 测 量 在 液 体 中 聚 焦 的 脉 冲 激 光 在 焦 点 处 产 生 气 泡 几 率 的 实 验, 数 据 文 件 (probability.dat) 如 下 : 44

### 文 件 开 始 ### # Ave Energy Probability Min Energy Max Energy Energy SD # (micro J) (%) (micro J) (micro J) (micro J) # ======================================================================= 9.08 0 8.96 9.15 0.06 10.00 2 9.91 10.08 0.05 10.52 3 10.41 10.60 0.06 11.03 10 10.90 11.11 0.06 11.52 25 11.38 11.62 0.07 12.03 57 11.90 12.13 0.07 12.52 88 12.38 12.64 0.08 13.01 93 12.86 13.09 0.07 13.51 100 13.38 13.61 0.08 14.52 100 14.38 14.67 0.08 ### 文 件 结 束 ### x 轴 数 据 为 激 光 能 量,y 轴 数 据 为 气 泡 产 生 几 率, 这 里 只 有 x 误 差, 并 且 同 时 包 含 了 最 小 最 大 值 和 标 准 差 我 们 现 在 用 最 小 最 大 值 画 图 : gnuplot> set xrange [ 8 : 1 6 ] gnuplot> set yrange [ 5:105] gnuplot> unset key gnuplot> set xlabel " Laser Pulse Energy (µj ) " gnuplot> set ylabel "Bubble Formation P r o b a b i l i t y (%) " gnuplot> plot " p r o b a b i l i t y. dat " using 1 : 2 : 3 : 4 with x e r r o r b a r s 如 果 既 要 画 error bar, 又 要 连 线, 可 以 把 上 述 命 令 中 的 errorbars 换 为 errorlines: gnuplot> plot " p r o b a b i l i t y. dat " using 1 : 2 : 3 : 4 with x e r r o r l i n e s 45

24 拟 合 gnuplot 除 了 绘 图 功 能 之 外, 最 简 单 实 用 的 功 能 就 是 拟 合 了 gnuplot 可 以 进 行 单 变 量 甚 至 多 变 量 的 线 性 和 非 线 性 拟 合 虽 然 可 能 不 像 专 门 的 数 学 软 件 那 么 强 大, 但 是 足 以 对 付 日 常 需 要 了 我 们 拿 上 一 讲 里 的 数 据 来 举 例 子 首 先, 要 定 义 一 个 待 拟 合 的 函 数 : gnuplot> f ( x ) =50 (1+ erf ( a ( x b ) ) ) 这 里 使 用 了 误 差 函 数 erf(x), 有 两 个 待 定 的 参 数 :a, b 下 面 我 们 生 成 一 个 文 件 fit.par, 里 面 包 含 的 是 参 数 a 和 b 的 初 值 : a = 1 b = 12 初 值 的 选 择 要 尽 可 能 贴 近 结 果, 否 则 可 能 导 致 误 差 甚 至 无 法 收 敛 下 面 我 们 进 行 拟 合 : gnuplot> f i t [ 8 : 1 6 ] f ( x ) p r o b a b i l i t y. dat using 1 : 2 via f i t. par gnuplot 里 面 关 于 拟 合 的 命 令 是 fit, 后 面 的 自 变 量 取 值 范 围 不 是 必 需 的 f(x) 函 数 已 经 在 上 面 定 义 过 了, 数 据 文 件 probability.dat 也 已 经 在 上 一 篇 博 文 中 交 代 过 了 via 后 面 跟 的 是 参 数 变 量 列 表 文 件 执 行 fit 命 令 之 后,gnuplot 会 输 出 一 堆 结 果 我 们 忽 略 那 些 中 间 运 算, 只 把 最 后 结 果 贴 在 下 面 : After 5 iterations the fit converged. final sum of squares of residuals : 41.9399 rel. change during last iteration : -4.27973e-07 degrees of freedom (FIT_NDF) : 8 rms of residuals (FIT_STDFIT) = sqrt(wssr/ndf) : 2.28965 variance of residuals (reduced chisquare) = WSSR/ndf : 5.24249 Final set of parameters Asymptotic Standard Error ======================= ========================== 46

a = 1.15661 +/- 0.06331 (5.474%) b = 11.9027 +/- 0.02383 (0.2002%) correlation matrix of the fit parameters: a b a 1.000 b 0.014 2.000 这 段 文 字 说 明, 经 过 5 次 迭 代,gnuplot 得 到 了 收 敛 的 结 果 中 间 部 分 是 参 数 a 和 b 的 最 终 取 值 以 及 渐 近 标 准 差 (asymptotic standard error) 渐 近 标 准 差 的 计 算 是 基 于 线 性 拟 合 的, 对 于 非 线 性 拟 合, 渐 近 标 准 差 一 般 都 比 真 的 标 准 差 小, 所 以 这 个 数 字 只 能 用 于 定 性 分 析 而 最 后 给 出 的 相 关 矩 阵 (correlation matrix) 可 以 帮 助 我 们 确 认 渐 近 标 准 差 的 可 靠 度, 非 对 角 元 素 绝 对 值 越 小, 渐 近 标 准 差 越 接 近 真 实 标 准 差 好 了, 现 在 我 们 可 以 把 数 据 和 拟 合 曲 线 画 在 同 一 张 图 上 了 : gnuplot> set xrange [ 8 : 1 6 ] gnuplot> set yrange [ 5:105] gnuplot> unset key gnuplot> set xlabel " Laser Pulse Energy (µj ) " gnuplot> set ylabel "Bubble Formation P r o b a b i l i t y (%) " gnuplot> plot " p r o b a b i l i t y. dat " using 1 : 2 : 3 : 4 with x e r r o r bars, f ( x ) lw 2 l c rgb " orange " 25 简 单 3D 函 数 绘 图 终 于 谈 到 3D 绘 图 了 大 多 数 情 况 下 普 通 3D 曲 面 绘 图 并 不 是 一 个 好 的 选 择, 因 为 投 影 会 使 这 样 的 绘 图 很 难 表 达 定 量 关 系, 通 常 只 能 定 性 的 显 示 一 下 函 数 或 者 数 据 趋 势 这 种 情 况 下, 往 往 需 要 其 他 图 像 的 配 合 才 能 展 示 定 量 的 关 系 我 们 从 简 单 的 函 数 图 像 入 手, 介 绍 一 下 gnuplot 的 3D 绘 图 功 能 47

在 3D 情 况 下,gnuplot 的 绘 图 命 令 是 splot: gnuplot> f ( x, y )=sin ( sqrt ( x x+y y ) ) / sqrt ( x x+y y ) gnuplot > set xlabel "X" gnuplot > set ylabel "Y" gnuplot> set zlabel "Z" gnuplot> unset key gnuplot> splot f ( x, y ) 显 然, 默 认 的 网 格 有 点 过 大, 无 法 显 示 函 数 细 节 这 个 网 格 大 小 可 以 通 过 isosamples 参 数 来 调 节 另 外, 底 部 平 面 似 乎 离 曲 面 太 远 了, 留 了 很 大 一 段 空 白, 我 们 想 把 这 个 空 白 缩 小 一 些 底 部 平 面 的 位 置 由 xyplane 参 数 来 控 制, 可 以 用 : set xyplane at <z 坐 标 > 来 设 定 底 部 平 面 的 绝 对 位 置, 也 可 以 用 : set xyplane < 相 对 比 例 > 来 设 定 空 白 部 分 相 对 于 zrange 的 比 例 下 面 是 例 子 : gnuplot > set isosamples 50 gnuplot> set xyplane 0. 2 gnuplot > replot 由 于 网 格 是 透 明 的, 因 此 网 格 重 叠 部 分 显 得 比 较 混 乱 为 了 更 清 楚 的 显 示 函 数 图 像, 我 们 让 后 面 被 遮 挡 的 部 分 隐 藏 起 来 : 48

gnuplot > set hidden3d gnuplot > replot 除 了 用 网 格 表 示 曲 面, 我 们 还 可 以 用 色 彩 来 表 示 不 同 的 z 值,gnuplot 把 这 种 表 示 方 式 叫 做 pm3d(palette-mapped 3d): gnuplot > set pm3d gnuplot > replot 最 后, 既 然 是 3D 图 像, 就 要 涉 及 视 角 问 题 gnuplot 里 的 3D 视 角 用 set view 命 令 控 制, 默 认 视 角 是 60, 30, 分 别 表 示 绕 x 轴 和 z 轴 的 旋 转 角 度 另 外, 一 些 terminal 例 如 wxt, 支 持 直 接 用 鼠 标 拖 动 图 像 改 变 视 角 gnuplot> set view 45,20 gnuplot > replot 49

26 数 据 文 件 存 储 格 式 在 3D 数 据 绘 图 之 前, 我 们 先 谈 谈 gnuplot 数 据 文 件 的 存 储 格 式 为 什 么 在 2D 绘 图 时 我 们 没 有 涉 及 这 个 问 题 呢? 因 为 2D 绘 图 数 据 相 对 简 单, 只 要 有 x 和 y 两 列 数 据 就 可 以 了 而 3D 绘 图 数 据 量 成 平 方 增 长, 数 据 存 储 方 式 也 更 多 样 化 gnuplot 的 数 据 可 以 以 纯 文 本 或 者 二 进 制 方 式 存 储 之 前 我 们 在 2D 绘 图 中 均 使 用 纯 文 本 方 式 存 储 数 据, 这 样 的 好 处 是 简 单 直 观, 把 数 据 按 照 x 和 y 存 为 两 列 就 可 以 了 在 3D 情 况 下, 由 于 数 据 量 激 增, 纯 文 本 文 件 所 占 空 间 较 大, 读 写 速 度 也 较 慢, 所 以 很 多 时 候 用 二 进 制 存 储 数 据 更 方 便 无 论 纯 文 本 还 是 二 进 制, 存 储 数 据 的 方 式 都 不 是 唯 一 的, 我 们 这 里 只 介 绍 最 常 用 的 方 式 ( 一 ) 纯 文 本 格 式 : 2D 的 情 况 我 们 已 经 很 熟 悉 了, 这 里 说 说 3D 的 情 况 3D 情 况 下,x, y, z(x,y) 可 以 按 照 下 面 格 式 存 储 : <x0> <y0> <z0,0> <x0> <y1> <z0,1> <x0> <y2> <z0,2>......... <x0> <yn> <z0,n> <x1> <y0> <z0,0> <x1> <y1> <z0,1>......... 这 里 有 几 个 要 点 : 1. 每 行 存 储 x, y, z 三 个 数 据 2. 首 先 保 持 x 不 变, 让 y 逐 行 变 化 3. 当 y 遍 历 [y0, yn] 取 值 范 围 后,x 取 [x0, xn] 里 的 下 一 个 值, 重 复 过 程 2 4. 每 个 相 同 x 取 值 的 数 据 块 之 间, 保 留 一 个 空 行 ( 这 个 比 较 容 易 忽 视, 需 要 注 意 ) 然 后 就 可 以 用 splot 命 令 绘 制 3D 数 据 图 了 50

( 二 ) 二 进 制 格 式 : 假 设 有 NxM 个 数 据 (z 值 ), 数 据 逐 行 按 照 从 左 到 右 从 上 到 下 的 顺 序 存 储 在 二 进 制 文 件 中, 这 时 候 绘 制 数 据 文 件 的 命 令 为 : plot <filename > binary < 二 进 制 参 数 列 表 > splot <filename > binary < 二 进 制 参 数 列 表 > 可 能 有 人 会 问, 绘 制 3D 数 据 不 是 用 splot 吗? 为 什 么 这 里 还 会 用 plot? 我 们 暂 且 忽 略 这 个 问 题, 来 看 看 二 进 制 参 数 列 表 二 进 制 文 件 只 是 一 个 数 据 流,gnuplot 可 不 知 道 我 们 数 据 的 具 体 存 储 方 式, 这 需 要 我 们 通 过 各 个 参 数 告 诉 gnuplot 下 面 是 一 些 常 用 参 数 : 1. array=(n,m) 这 是 告 诉 gnuplot 我 们 数 据 中 x 和 y 各 自 的 维 数 2. format 我 们 的 数 据 是 16 位 还 是 32 位? 是 整 型 还 是 浮 点 数?format 参 数 负 责 告 诉 gnuplot 这 些 信 息 我 们 可 以 通 过 执 行 下 面 的 命 令 : show d a t a f i l e binary d a t a s i z e s 来 获 得 format 参 数 的 数 据 类 型 列 表 3. endian 对 于 多 字 节 数 据, 一 般 有 两 种 不 同 的 字 节 存 储 顺 序 :big 或 者 little 如 果 您 试 图 绘 制 一 个 二 进 制 数 据, 而 结 果 看 起 来 莫 名 其 妙, 很 可 能 就 是 endian 设 置 错 了 4. dx, dy, dz 这 其 实 就 是 x, y, z, 也 就 是 各 个 坐 标 的 比 例 系 数 例 如 设 置 dx=2, 而 数 据 文 件 中 x 的 取 值 范 围 是 [0:100], 那 么 所 绘 图 像 上 x 的 取 值 范 围 就 会 变 为 [0:200] 下 面 是 一 个 绘 制 二 进 制 数 据 的 例 子 : splot " d a t a f i l e. bin " binary array =(64,64) endian= l i t t l e format="% f l o a t " with l i n e s 27 3D 数 据 曲 面 绘 图 及 边 框 理 解 了 gnuplot 的 数 据 存 储 格 式, 我 们 可 以 来 学 习 3D 绘 图 了 我 们 拿 一 个 6X6 的 数 据 举 例, 该 数 据 以 纯 文 本 方 式 存 在 此 文 件 中 :data3d.dat 3D 数 据 曲 面 的 绘 制 和 3D 函 数 曲 面 的 绘 制 基 本 相 同, 所 以 我 们 无 需 多 加 解 释, 直 接 来 看 命 令 和 结 果 : gnuplot > set xlabel "X" gnuplot > set ylabel "Y" gnuplot> set zlabel "Z" gnuplot> set xyplane 0. 2 gnuplot > set hidden3d gnuplot> set view 45,30 gnuplot> unset key gnuplot> splot " data3d. dat " with l i n e s 51

曲 面 后 面 的 部 分 由 于 遮 挡, 看 不 到 没 关 系, 我 们 学 过 怎 样 调 整 视 角 : gnuplot> set view 45,210 gnuplot > replot 这 里 还 要 讲 讲 边 框 的 问 题 在 2D 情 况 下 我 们 曾 经 讲 过 可 以 通 过 unset border 命 令 取 消 边 框, 但 是 我 们 没 有 讲 set border 命 令, 因 为 这 个 只 有 在 3D 情 况 下 才 能 说 清 楚 2D 情 况 下 只 有 4 个 边 框, 而 3D 情 况 下, 除 了 底 部 4 个 边 框, 还 有 竖 直 4 个, 以 及 顶 部 4 个, 所 以 总 共 12 个 边 框 这 12 个 边 框 显 示 与 否, 由 一 个 12 bit 的 整 数 控 制, 例 如 : 0000 0000 1111: 只 显 示 底 部 4 个 边 框 0000 1111 0000: 只 显 示 竖 直 4 个 边 框 1111 0000 0000: 只 显 示 顶 部 4 个 边 框 不 难 看 出, 如 果 要 显 示 所 有 12 个 边 框, 对 应 的 二 进 制 数 就 是 :1111 1111 1111, 换 算 成 十 进 制 就 是 4095 set border 命 令 之 后 紧 跟 这 个 整 数, 就 可 以 控 制 显 示 哪 些 边 框 另 外, 以 前 曾 经 讲 过 的 和 linestyle 有 关 的 参 数, 都 可 以 用 来 控 制 边 框 的 显 示 风 格 : gnuplot > set border 4095 l c rgb "#2554C7" gnuplot > replot 52

28 Pm3d 绘 图 在 3D 函 数 绘 图 中 我 们 介 绍 过, 使 用 pm3d 模 式 可 以 用 色 彩 表 示 3D 函 数 值 的 大 小 数 据 绘 图 也 可 以 使 用 pm3d 模 式 我 们 这 次 就 稍 微 详 细 介 绍 一 下 pm3d pm3d 即 Palette Map 3D, 中 文 或 叫 色 板 映 射 我 们 还 是 拿 上 一 篇 文 章 中 的 数 据 文 件 来 举 例 子 : gnuplot > set xlabel "X" gnuplot > set ylabel "Y" gnuplot> set zlabel "Z" gnuplot> set xyplane 0. 2 gnuplot> unset key gnuplot > set hidden3d gnuplot > set pm3d gnuplot> set view 45,210 gnuplot> splot " data3d. dat " with l i n e s 我 们 看 到, 本 来 的 曲 面 被 加 上 了 颜 色, 不 同 的 色 彩 对 应 不 同 的 z 值, 这 个 对 应 关 系 显 示 在 右 边 的 色 彩 条 (color box) 中 这 里 有 个 问 题 : 我 们 的 数 据 是 6x6 的, 但 是 色 彩 块 只 有 5x5, 这 个 色 彩 是 怎 样 确 定 的 呢? 很 简 单, 每 个 块 的 四 个 顶 点 取 平 均 值, 对 应 的 色 彩 就 是 这 个 块 的 色 彩 这 个 取 值 方 法 不 是 唯 一 的, 可 以 用 corners2color 参 数 来 设 定, 详 情 请 用 help set pm3d 命 令 查 询 53

色 彩 图 除 了 画 在 曲 面 上, 还 可 以 画 在 底 部 或 顶 部 ( 还 记 得 3D 图 底 部 和 顶 部 都 有 border 吗?) 设 置 方 法 为 : set pm3d at b s t b,s,t 三 个 字 母 分 别 代 表 底 部 曲 面 和 顶 部,at 之 后 可 以 是 任 一 个 字 母, 也 可 是 三 个 字 母 的 任 意 组 合 例 如 : gnuplot> set pm3d at gnuplot > replot bst 当 然, 如 果 要 看 数 据 在 取 值 范 围 内 的 全 貌, 最 好 的 方 法 是 从 上 往 下 看 : gnuplot > set pm3d map gnuplot> set size square gnuplot > replot 我 们 之 前 介 绍 过 set view 命 令 调 整 视 角, 这 里 的 set pm3d map 其 实 是 包 含 set view map 命 令 在 内 的 一 系 列 命 令 组 合 54

我 们 注 意 到, 右 边 的 色 彩 条 取 值 范 围 是 [0.1:1], 这 是 gnuplot 自 动 设 置 的 如 果 我 们 想 手 动 设 置 这 个 范 围 呢? 可 能 有 人 会 想 到 set zrange, 但 是 zrange 控 制 的 是 画 图 时 z 的 取 值 范 围, 而 不 是 色 板 对 应 的 取 值 范 围 其 实, 色 板 对 应 的 取 值 范 围 是 cbrange(color Box range): gnuplot> set cbrange [ 0 : 1 ] gnuplot > replot 我 们 什 么 时 候 会 想 要 手 动 设 置 cbrange 呢? 例 如, 我 们 需 要 比 较 两 组 数 据 的 时 候, 我 们 一 定 希 望 两 张 图 上, 相 同 数 值 对 应 的 是 相 同 的 颜 色 最 后, 我 们 有 时 候 可 能 觉 得 这 样 像 马 赛 克 一 样 的 图 片 不 那 么 好 看 这 时 候, 我 们 可 以 利 用 插 值, 得 到 比 较 平 滑 的 彩 色 图 使 用 插 值 的 方 法 是 : set pm3d i n t e r p o l a t e N,M M 和 N 分 别 代 表 x 和 y 方 向 插 值 的 数 目 如 果 希 望 gnuplot 自 动 优 化 选 择, 就 让 M=N=0: gnuplot> set pm3d i n t e r p o l a t e 0,0 gnuplot > replot 55

29 色 板 (palette) 设 置 pm3d 绘 图 默 认 的 色 板 看 起 来 很 不 错, 但 是 我 们 有 时 候 还 是 希 望 能 自 己 定 义 不 同 的 色 彩, 这 次 我 们 谈 谈 怎 样 自 定 义 色 板 自 定 义 色 板 的 方 式 有 好 多 种, 我 们 这 里 只 谈 一 下 比 较 方 便 常 用 的 方 式 : 用 rgbformulae 定 义 RGB 色 彩 RGB 是 电 脑 中 最 常 用 的 色 彩 空 间 表 示 方 式, 而 rgbformulae 是 一 系 列 从 数 值 到 色 阶 的 数 学 映 射 公 式, 共 有 37 个 如 果 想 知 道 rgbformulae 到 底 包 含 哪 些 公 式, 可 以 使 用 gnuplot 命 令 : show p a l e t t e rgbformulae 由 于 RGB 有 三 个 颜 色 通 道, 所 以 每 一 个 色 板 需 要 三 个 公 式, 分 别 表 示 R(Red) G(Green) B(Blue) 色 板 的 设 置 方 法 为 : set p a l e t t e rgbformulae r, g, b 其 中 r, g, b 分 别 表 示 R, G, B 通 道 所 用 公 式 代 码 (0 到 36, 允 许 用 负 值 ) gnuplot 默 认 色 板 的 公 式 代 码 为 7,5,15 37 个 公 式 加 上 负 值 共 有 73 3 个 不 同 的 组 合 方 式, 并 不 是 每 个 组 合 都 有 好 的 显 示 效 果, 而 我 们 仅 凭 想 象 力 是 无 法 知 道 效 果 好 坏 的 这 时 候,test palette 命 令 可 以 帮 助 我 们 预 览 一 下 显 示 效 果 即 使 如 此, 找 到 一 个 好 的 色 板 设 置 组 合 并 不 是 一 件 很 容 易 的 事 情 下 面 这 些 常 用 的 组 合 可 以 给 我 们 提 供 一 些 帮 助 : 1. 7, 5, 15(pm3d 默 认 ) 2. 3, 11, 6( 绿 红 紫 ) 56

3. 23, 28, 3( 绿 蓝 白 ) 4. 21, 22, 23( 黑 红 黄 白 ) 5. 30, 31, 32( 黑 蓝 紫 黄 白, 可 以 用 于 黑 白 打 印 ) 6. 33, 13, 10( 彩 虹 色 ) 7. 22, 13, -31( 另 一 种 彩 虹 色 ) 8. 34, 35, 36( 黑 红 黄 白 ) 最 后, 如 果 我 们 不 想 用 彩 色, 而 只 是 想 用 黑 白 灰 度, 可 以 用 下 面 的 命 令 : set p a l e t t e gray 30 Image 绘 图 在 谈 到 pm3d 绘 图 时 我 们 说 过,NxM 的 数 据 只 能 画 出 (N-1)x(M-1) 的 图 像 有 没 有 这 样 一 种 方 式, 让 我 们 能 从 NxM 的 数 据 画 出 NxM 的 图 像 呢? 这 次 我 们 介 绍 一 种 新 的 画 图 风 格 :image 咱 们 还 是 用 以 前 用 过 的 数 据 文 件 data3d.dat: gnuplot> unset key gnuplot > set xlabel "X" gnuplot > set ylabel "Y" gnuplot> set size square gnuplot > plot " data3d. dat " with image 57

这 里 我 们 看 到, 色 块 数 目 等 于 数 据 点 数 目, 每 一 个 色 块 中 心 位 于 相 应 数 据 点, 而 色 块 色 彩 对 应 的 就 是 该 数 据 点 的 值 这 和 pm3d 不 同, 因 为 pm3d 绘 图 时 数 据 点 位 于 色 块 顶 点 位 置 另 外, 这 里 虽 然 用 的 是 plot 命 令, 但 是 图 像 反 应 了 3D 的 信 息, 所 以 我 们 把 它 放 在 3D 作 图 里 介 绍 这 两 种 方 式 无 法 简 单 判 断 优 劣, 只 能 根 据 实 际 需 要 选 择 当 像 素 比 较 多 而 数 据 又 比 较 平 滑 的 时 候, 其 实 两 者 差 别 不 大 除 了 image, 还 有 两 个 非 常 类 似 的 绘 图 方 式 :rgbimage 和 rgbalpha image 用 于 处 理 单 色 图 ( 只 有 一 个 z 值 ), 可 以 包 含 x,y,z 三 列 数 据 ;rgbimage 用 于 处 理 RGB 彩 色 图, 可 以 包 含 x,y,r,g,b 五 列 数 据 ;rgbalpha 在 rgbimage 基 础 上 增 加 了 alpha 通 道 ( 透 明 信 息 ), 可 以 处 理 透 明 RGB 彩 色 图 除 了 一 般 数 据 文 件, 上 述 画 图 方 式 还 支 持 直 接 读 取 png 格 式 图 片 : gnuplot> unset key gnuplot> set t i t l e " Function y = x^2" gnuplot > set xlabel "X" gnuplot > set ylabel "Y" gnuplot > set term wxt enhanced gnuplot > plot x 2 lw 2,\ > " tux. png" binary f i l e t y p e=png c e n t e r =(0,0) dx=0.002 dy=0.01 with rgbalpha, \ > " tux. png" binary f i l e t y p e=png c e n t e r =(1,1) dx=0.002 dy=0.01 with rgbalpha, \ > " tux. png" binary f i l e t y p e=png c e n t e r =(2,4) dx=0.002 dy=0.01 with rgbalpha, \ > " tux. png" binary f i l e t y p e=png c e n t e r =(3,9) dx=0.002 dy=0.01 with rgbalpha, \ > " tux. png" binary f i l e t y p e=png c e n t e r =(4,16) dx=0.002 dy=0.01 with rgbalpha 58

这 里 我 们 利 用 一 个 小 企 鹅 的 图 片 (tux.png) 画 了 一 个 二 次 平 方 函 数 binary 文 件 格 式 我 们 以 前 介 绍 过, 这 里 有 两 个 新 的 参 数 :filetype 和 center filetype 用 于 指 定 文 件 格 式, 而 center 用 于 指 定 图 片 中 心 位 置 31 等 高 线 图 等 高 线 图 是 另 一 类 重 要 的 3D 绘 图 方 式 为 了 说 明 gnuplot 里 面 等 高 线 图 的 绘 制 方 法, 我 们 使 用 下 面 这 个 数 据 文 件 作 为 例 子 :surface.dat 首 先 绘 制 普 通 曲 面 图 : gnuplot > set hidden3d gnuplot> splot " s u r f a c e. dat " with l i n e s 下 面 加 上 等 高 线 : gnuplot > set contour b a s e gnuplot> splot " s u r f a c e. dat " with l i n e s t i t l e "" 59

set contour 命 令 之 后 除 了 base 参 数 外, 还 可 以 使 用 surface 或 both 参 数, 分 别 表 示 等 高 线 画 在 底 面 曲 面 或 者 两 者 都 画 这 里 设 置 了 一 个 空 的 title, 是 为 了 在 图 例 中 不 要 显 示 文 件 名, 以 免 和 等 高 线 的 图 例 混 淆 如 果 我 们 想 在 平 面 中 显 示 等 高 线, 可 以 使 用 下 列 命 令 : gnuplot> unset surface gnuplot > set view map gnuplot> set size square gnuplot > replot 如 果 我 们 想 在 之 前 提 到 过 的 pm3d 图 上 显 示 等 高 线, 可 以 这 样 做 : gnuplot > set pm3d a t b gnuplot> set key at s c r e e n 0. 8, 0. 8 gnuplot > replot 60

这 里 我 们 把 图 例 的 位 置 做 了 调 整, 因 为 默 认 图 例 是 在 图 像 里 面 的, 这 样 可 能 影 响 我 们 的 图 像 显 示 最 后, 我 们 谈 谈 怎 样 手 动 设 置 等 高 线 数 值 和 间 距 等 高 线 的 数 值 间 隔 参 数 设 置 命 令 是 set cntrparam levels 默 认 情 况 下,gnuplot 自 动 设 置 等 高 线 数 值 如 果 要 进 行 手 动 设 置, 有 两 种 方 法 : 1. incremental <start>,<incr>,<end> 设 置 起 始 值 以 及 间 隔 大 小, 这 种 方 法 适 用 于 等 间 隔 的 等 高 线 ; 2. discrete <z1>,<z2>,<z3>,... 分 别 设 置 各 个 等 高 线 数 值, 这 种 方 法 适 用 于 间 隔 不 等 的 等 高 线 例 子 : gnuplot> set cntrparam l e v e l s incremental 2,0.5,2 gnuplot > replot 32 等 高 线 的 颜 色 上 一 讲 最 后 我 们 提 到 了 怎 样 改 变 等 高 线 的 数 值 间 距 不 同 等 高 线 是 由 颜 色 来 区 分 的, 而 默 认 的 颜 色 未 必 是 最 理 想 的 组 合, 我 们 还 用 上 次 的 数 据 文 件 举 例 : 61

gnuplot > set contour gnuplot> unset surface gnuplot> set size square gnuplot> set key at s c r e e n 0. 8, 0. 8 gnuplot > set view map gnuplot> splot " s u r f a c e. dat " with l i n e s t i t l e "" 这 里 有 些 默 认 的 颜 色 太 浅 了, 看 不 清 楚 下 面 我 们 想 办 法 把 它 们 加 深 加 粗 细 心 的 读 者 可 能 注 意 到, 这 里 默 认 的 等 高 线 颜 色 和 上 一 讲 中 的 不 同 等 高 线 的 默 认 颜 色 是 这 样 确 定 的 : 按 照 色 彩 编 号 ( 如 果 不 记 得 了, 请 复 习 一 下 我 们 以 前 讲 过 的 点 线 风 格 ) 从 低 到 高, 而 最 低 的 色 彩 比 曲 面 (surface) 颜 色 大 一 号 这 里 虽 然 曲 面 没 有 画 出 来, 但 是 仍 然 占 去 了 1 号 颜 色, 所 以 等 高 线 颜 色 从 2 号 颜 色 ( 绿 色 ) 开 始 而 上 一 讲 中, 我 们 设 置 了 hidden3d 参 数, 曲 面 上 下 面 分 别 使 用 不 同 的 颜 色, 因 此 曲 面 占 去 2 个 颜 色, 等 高 线 从 3 号 颜 色 ( 蓝 色 ) 开 始 我 们 现 在 要 做 的 就 是 要 gnuplot 使 用 我 们 自 定 义 的 颜 色, 而 不 是 系 统 默 认 的 颜 色 下 面 看 代 码 : gnuplot> set style l i n e 1 lw 2 l c rgb " red " gnuplot> set style l i n e 2 lw 2 l c rgb " f o r e s t green " gnuplot> set style l i n e 3 lw 2 l c rgb " blue " gnuplot> set style l i n e 4 lw 2 l c rgb "magenta" gnuplot> set style l i n e 5 lw 2 l c rgb "dark cyan" gnuplot> set style l i n e 6 lw 2 l c rgb " goldenrod " gnuplot> set style increment u s e r s t y l e s gnuplot > replot 62

我 们 这 里 首 先 自 定 义 了 一 系 列 linestyle( 参 考 第 十 八 讲 图 例 ), 然 后 用 set style increment userstyles 命 令 告 诉 gnuplot 使 用 我 们 自 己 定 义 的 曲 线 风 格, 而 不 是 默 认 风 格 这 样, 我 们 得 到 了 我 们 想 要 的 效 果 这 里 我 们 并 没 有 使 用 RGB 直 接 定 义 颜 色, 而 是 用 了 一 系 列 色 彩 的 名 字 (colornames), 这 些 colornames 是 gnuplot 预 定 义 的 一 些 RGB 颜 色 如 果 想 知 道 到 底 有 哪 些 预 定 义 的 颜 色, 可 以 使 用 下 面 的 命 令 : gnuplot> show p a l e t t e colornames 其 实 不 仅 限 于 等 高 线, 只 要 是 在 同 一 个 图 上 画 多 个 函 数 或 数 据, 都 可 以 用 这 种 方 法 设 置 显 示 风 格 33 Table 输 出 gnuplot 作 为 一 个 绘 图 软 件, 一 般 都 是 读 取 数 据, 把 图 像 输 出 到 指 定 的 terminal 但 是 gnuplot 也 可 以 把 图 像 以 table 形 式 存 储 到 一 个 数 据 文 件 中 这 样 做 的 好 处 是 方 便 我 们 对 图 像 数 据 进 行 进 一 步 处 理, 得 到 我 们 想 要 的 效 果 我 们 之 前 画 等 高 线 图 所 用 的 surface.dat 文 件, 其 实 就 是 通 过 这 种 方 式 得 到 的 还 以 surface.dat 数 据 的 等 高 线 图 为 例,contour 模 式 只 能 在 splot 命 令 中 使 用 如 果 我 们 把 等 高 线 图 预 先 以 table 格 式 存 入 一 个 文 件, 我 们 就 可 以 对 其 进 行 适 当 处 理, 并 且 可 以 用 plot 命 令 绘 图 : gnuplot > set contour b a s e gnuplot> unset surface gnuplot> set t a b l e cont. dat gnuplot> splot s u r f a c e. dat gnuplot> unset t a b l e gnuplot> unset key gnuplot> set size square gnuplot> set xrange [ 4:4] gnuplot> set yrange [ 4:4] gnuplot> plot s u r f a c e. dat with image, cont. dat with l i n e s lw 1. 5 l c rgb yellow 63

这 里 我 们 预 先 把 等 高 线 图 以 table 格 式 存 入 了 cont.dat 文 件, 随 后 用 plot 命 令 调 用 该 文 件, 把 等 高 线 画 在 了 surface.dat 数 据 的 image 图 上 ( 注 意 : 不 是 pm3d 图 ) 这 里 我 们 可 以 用 plot 命 令 的 图 线 风 格 参 数 控 制 等 高 线 的 粗 细 和 颜 色 这 里 我 们 没 有 像 以 前 那 样 用 不 同 颜 色 区 分 等 高 线, 而 是 所 有 等 高 线 使 用 了 同 一 颜 色 那 么 怎 样 区 分 各 个 等 高 线 呢? 我 们 可 以 用 label 标 注 等 高 线 数 值 label 的 使 用 方 法 我 们 在 第 十 五 讲 坐 标 系 统 及 标 签 里 介 绍 过, 但 是 直 接 手 动 设 置 label 有 点 麻 烦 下 面 这 个 网 页 里 的 label_contours.awk 文 件 是 一 个 AWK 脚 本 文 件, 可 以 帮 助 我 们 自 动 设 置 标 签 : http://gnuplot.sourceforge.net/ scripts/index.html#tricks-here 我 们 这 里 不 打 算 介 绍 AWK 脚 本 语 言, 也 不 打 算 介 绍 这 个 脚 本 的 具 体 使 用 方 法, 因 为 该 网 页 以 及 该 文 件 内 已 经 包 含 了 详 细 的 使 用 说 明 我 们 只 给 出 一 个 使 用 该 脚 本 得 到 的 带 标 注 的 等 高 线 图 : 34 多 图 (multiplot) 之 前 我 们 曾 用 plot 命 令 将 多 个 曲 线 画 在 同 一 张 图 上, 这 次 我 们 谈 谈 怎 样 将 多 个 图 画 在 一 起 这 样 做 的 主 要 目 的 是 把 不 同 的 信 息 放 在 一 起, 以 方 便 比 较 我 们 首 先 看 看 怎 样 把 几 张 图 像 矩 阵 一 样 排 列 起 来 : gnuplot> set m u l t i p l o t layout 2,2 64

gnuplot> plot sin ( x ) gnuplot> plot sin (2 x ) gnuplot> plot cos ( x ) gnuplot> plot cos (2 x ) gnuplot> unset m u l t i p l o t set multiplot 命 令 告 诉 gnuplot 进 入 多 图 模 式, 这 时 候 我 们 画 的 所 有 图 像 都 会 在 出 现 在 同 一 张 画 布 上 如 果 不 做 调 整, 所 有 图 像 将 重 叠 在 一 起 ; 如 果 适 当 调 整 每 个 图 像 的 位 置 和 大 小, 图 像 将 按 我 们 的 要 求 排 列 起 来 layout 参 数 可 以 自 动 将 几 幅 图 按 照 指 定 格 式 排 列 起 来, 例 如 这 里 的 4 幅 图 排 成 了 2 2 的 格 式 最 后,unset multiplot 命 令 退 出 多 图 模 式 之 前 我 们 用 过 的 绘 图 命 令 在 多 图 模 式 下 都 有 效, 包 括 将 图 片 输 出 为 不 同 格 式 如 果 不 用 layout 参 数, 我 们 还 有 更 灵 活 的 排 版 方 式, 例 如 下 面 这 个 画 中 画 的 例 子 : gnuplot > reset gnuplot> set m u l t i p l o t gnuplot> unset key gnuplot> plot spectrum. dat with l i n e s gnuplot> set xrange [ 6 6 0 : 7 4 0 ] gnuplot> set xtics 20 gnuplot> set yrange [ 200:2000] gnuplot> set ytics 500 gnuplot> set o r i g i n 0. 2, 0. 4 gnuplot> set size 0. 4, 0. 4 gnuplot > replot gnuplot> unset m u l t i p l o t 65

这 里 我 们 绘 制 了 一 组 光 谱 数 据 (spectrum.dat), 并 且 把 [660, 740] 这 个 区 间 内 的 数 据 单 独 绘 制 出 来, 嵌 套 在 大 图 内, 用 于 更 清 楚 的 展 示 细 节 这 里 的 set origin 命 令 用 于 设 置 绘 图 的 原 点,set size 命 令 以 前 已 经 讲 过, 用 于 设 置 图 像 大 小 这 两 个 命 令 均 使 用 screen 坐 标 系 统 ( 参 考 之 前 的 博 文 : 坐 标 系 统 及 标 签 ) 开 始 处 的 reset 命 令 正 如 它 的 名 字 所 暗 示 的 那 样, 用 于 让 人 工 设 置 的 参 数 恢 复 至 默 认 值 如 果 想 更 多 了 解 multiplot 命 令 的 用 法, 请 使 用 help multiplot 命 令 35 曲 线 色 彩 填 充 目 前 我 们 所 涉 及 的 主 题 都 是 比 较 基 本 的, 应 该 覆 盖 了 大 部 分 科 学 绘 图 的 需 要, 而 gnuplot 的 功 能 还 远 不 止 如 此 从 现 在 开 始, 我 们 介 绍 一 些 稍 微 高 级 些 的 应 用, 其 中 有 些 可 以 让 我 们 的 绘 图 更 加 丰 富 多 彩, 有 些 能 让 我 们 的 工 作 更 有 效 率 这 次 我 们 介 绍 一 下 填 充 曲 线 (filledcurves) 我 们 使 用 在 多 组 数 据 绘 图 中 用 过 的 数 据 文 件 precipitation.dat 作 为 例 子 : gnuplot> plot p r e c i p i t a t i o n. dat using 1 : 3 with f i l l e d c u r v e s 66

这 里 的 filledcurves 是 一 种 新 的 画 图 风 格, 它 会 在 数 据 ( 或 函 数 ) 曲 线 中 填 入 指 定 颜 色 默 认 情 况 下, 曲 线 是 自 我 封 闭 的 (closed), 所 以 这 里 的 例 子 中 首 尾 数 据 点 被 连 接 了 起 来 我 们 也 可 以 指 定 填 充 曲 线 和 某 条 水 平 或 竖 直 直 线 之 间 的 区 域 : gnuplot> plot p r e c i p i t a t i o n. dat using 1 : 3 with f i l l e d c u r v e s y1=0 这 里 曲 线 和 横 轴 之 间 的 区 域 被 填 充 了 颜 色 这 里 的 y1 也 可 以 是 x1, x2, y2, 它 们 所 代 表 的 意 义 在 第 二 坐 标 轴 中 介 绍 过 除 此 之 外, 也 可 以 指 定 曲 线 和 某 点 之 间 的 连 接 区 域 : gnuplot> plot p r e c i p i t a t i o n. dat using 1 : 3 with f i l l e d c u r v e s xy=6,60 如 果 提 供 两 组 数 据, 还 可 以 在 两 组 数 据 之 间 的 区 域 填 充 颜 色 : gnuplot> plot p r e c i p i t a t i o n. dat using 1 : 2 : 3 with f i l l e d c u r v e s 67

如 果 我 们 希 望 当 第 一 组 数 据 小 于 第 二 组 时 使 用 一 种 颜 色, 而 第 一 组 数 据 大 于 第 二 组 时 使 用 另 一 种 颜 色, 我 们 可 以 这 样 做 : gnuplot> plot p r e c i p i t a t i o n. dat using 1 : 2 : 3 with f i l l e d c u r v e s below, using 1 : 2 : 3 with f i l l e d c u r v e s above 这 里 的 below 和 above 参 数 表 示 只 填 充 相 应 ( 低 于 或 高 于 ) 的 区 域 plot 命 令 第 二 部 分 的 数 据 文 件 名 为 空, 这 是 因 为 该 文 件 和 第 一 部 分 是 相 同 的, 我 们 可 以 把 文 件 名 省 略 我 们 虽 然 得 到 了 具 有 填 充 色 的 曲 线, 但 是 这 样 大 红 大 绿 的 效 果 并 不 是 我 们 想 要 的 我 们 下 一 次 就 讲 讲 怎 样 设 置 填 充 风 格, 让 它 们 看 起 来 更 好 看 一 点 36 填 充 风 格 正 如 曲 线 风 格 的 设 置 命 令 是 set style line, 色 彩 填 充 风 格 的 设 置 命 令 是 set style fill 我 们 仍 然 以 precipitation.dat 文 件 举 例 : 68

gnuplot> set style f i l l s o l i d 0. 4 gnuplot> plot p r e c i p i t a t i o n. dat using 1 : 2 with f i l l e d c u r v e s y1=0 lw 2 l c rgb " orange red ", using 1 : 3 with f i l l e d c u r v e s y1=0 lw 2 l c rgb " purple " 这 里 的 solid 参 数 表 示 用 纯 色 填 充, 后 面 的 数 字 取 值 范 围 从 0 到 1, 表 示 色 彩 深 浅 默 认 情 况 下, 填 充 色 和 曲 线 颜 色 是 相 同 的 这 里 有 个 问 题 : 第 一 组 数 据 有 一 部 分 被 第 二 组 数 据 覆 盖 住 了 有 些 terminal( 例 如 wxt, png, pdf 等 ) 支 持 透 明 效 果, 可 以 解 决 这 个 问 题 gnuplot> set style f i l l t r a n s p a r e n t s o l i d 0. 4 gnuplot > replot 这 里 使 用 了 transparent 参 数, 相 应 的 solid 后 面 的 数 字 就 变 成 了 表 示 透 明 度 (alpha 值 ) 的 参 数 如 果 我 们 希 望 填 充 区 域 不 要 有 边 线 ( 曲 线 本 身 ), 那 么 可 以 使 用 noborder 参 数 : gnuplot> set style f i l l t r a n s p a r e n t s o l i d 0. 4 noborder gnuplot > replot 69

如 果 需 要 黑 白 打 印, 我 们 可 能 希 望 不 要 用 纯 色 填 充, 而 是 用 不 同 的 花 纹 填 充, 这 时 我 们 可 以 使 用 pattern 参 数 pattern 参 数 之 后 可 以 跟 一 个 数 字, 表 示 起 始 使 用 的 pattern 编 号 不 同 的 terminal 有 不 同 的 花 纹 效 果, 可 以 在 某 terminal 下 使 用 test 命 令 查 看 该 terminal 支 持 哪 些 花 纹 下 面 是 例 子 : gnuplot> set style f i l l t r a n s p a r e n t pattern 1 border gnuplot > replot 37 柱 状 图 除 了 点 线 图 外, 柱 状 图 也 是 一 种 常 用 的 作 图 方 式 我 们 还 用 前 两 讲 用 过 的 precipitation.dat 数 据 文 件 作 例 子 : gnuplot> set style data histogram gnuplot> set style histogram c l u s t e r e d gap 1 gnuplot> set style f i l l s o l i d 0. 4 border gnuplot> plot " p r e c i p i t a t i o n. dat " using 2, using 3 70

set style data histogram 命 令 告 诉 gnuplot 所 有 数 据 绘 图 都 使 用 histogram 风 格 set style histogram 命 令 设 置 histogram 作 图 的 参 数, 例 如 clustered 模 式 就 是 像 上 图 那 样, 把 几 组 数 据 并 排 画 在 一 起,gap 1 就 表 示 各 簇 数 据 之 间 空 白 的 宽 度 等 于 数 据 柱 宽 度 的 1 倍 填 充 风 格 命 令 (set style fill) 上 次 我 们 已 经 介 绍 过 了 这 里 我 们 发 现 一 个 histogram 和 一 般 点 线 作 图 的 不 同 : 一 般 点 线 作 图, 每 个 图 都 要 提 供 x,y 两 组 数 据, 而 histogram 图 只 需 要 提 供 一 组 数 据, 每 个 数 据 自 动 画 在 X 轴 上 的 非 负 整 数 位 置 这 时 候,X 轴 上 的 标 注 并 不 是 我 们 想 要 的, 图 例 中 的 标 注 也 不 符 合 我 们 的 要 求 我 们 以 前 在 坐 标 取 值 范 围 及 刻 度 和 多 组 数 据 绘 图 讲 过, 这 两 处 的 标 注, 可 以 分 别 用 set xtics 命 令 和 title 参 数 来 设 置 这 里 提 供 另 一 种 改 变 标 注 的 方 法, 我 们 把 precipitation.dat 文 件 稍 微 修 改 一 下 : ### 文 件 开 始 ### # 各 城 市 月 平 均 降 水 量 (mm) # 月 份 北 京 上 海 # ====================== 一 月 2. 5 38.1 二 月 5. 1 58.4 三 月 10.2 81.3 四 月 25.4 101.6 五 月 27.9 114.3 六 月 71.1 152.4 七 月 175.3 129.5 八 月 182.9 132.1 九 月 48.3 154.9 十 月 17.8 61.0 十 一 月 5. 1 50.8 十 二 月 2. 5 35.6 ### 文 件 结 束 ### 我 们 把 修 改 后 的 文 件 称 作 precipitation_v2.dat 和 原 文 件 相 比, 这 里 有 两 处 改 动 : 1. 原 文 件 中 包 含 城 市 名 称 的 一 行 是 注 释 掉 的, 新 文 件 里 这 一 行 表 示 注 释 的 # 字 符 被 去 掉 了 ; 2. 原 文 件 中 第 一 列 用 阿 拉 伯 数 字 表 示 的 月 份, 新 文 件 里 被 换 作 了 中 文 月 份 名 称 71

下 面 来 看 新 的 例 子 : gnuplot> plot " p r e c i p i t a t i o n _ v 2. dat " using 2 : x t i c l a b e l s ( 1 ) t i t l e columnheader ( 2 ), using 3 : x t i c l a b e l s ( 1 ) t i t l e columnheader ( 3 ) 这 里 using 参 数 的 数 据 列 号 后 面, 增 加 了 一 个 新 的 xticlabels(1), 这 表 示 使 用 第 1 列 的 内 容 作 为 每 个 数 据 的 X 轴 标 注 另 外,title 参 数 后 面 跟 了 一 个 columnheader(n) 函 数, 这 表 示 使 用 第 n 列 的 第 一 行 内 容 作 为 每 组 数 据 的 title 这 样, 我 们 可 以 把 每 组 数 据 的 横 轴 和 图 例 标 注 预 先 存 入 数 据 文 件 中, 画 图 时 再 调 用 除 了 clustered 模 式,histogram 作 图 还 有 rowstacked 模 式, 就 是 把 几 组 数 据 竖 着 垒 起 来 : gnuplot> set style histogram rowstacked gnuplot> set boxwidth 0. 8 r e l a t i v e gnuplot> set xtics r o t a t e by 45 gnuplot > replot rowstacked 模 式 没 有 gap 参 数, 我 们 这 里 使 用 set boxwidth 命 令 设 置 数 据 柱 相 对 宽 度 同 时,X 轴 标 注 被 旋 转 了 45 度 这 在 柱 状 图 里 很 常 见, 因 为 密 排 的 柱 状 图 往 往 没 有 足 够 的 空 间 显 示 X 轴 标 注, 旋 转 之 后 显 示 空 间 便 增 大 了 72

既 然 有 rowstacked, 有 没 有 columnstacked 呢? 答 案 是 有 的 rowstacked 逐 行 把 数 据 叠 加 显 示, 而 columnstacked 逐 列 把 数 据 叠 加 除 此 之 外, 还 有 errorbars 模 式, 在 clustered 基 础 上 增 加 误 差 条 由 于 这 两 种 模 式 和 之 前 讲 过 的 很 类 似, 所 以 就 不 举 例 了 38 阶 梯 图 和 柱 状 图 (histogram) 相 似 的, 还 有 阶 梯 图, 英 文 叫 做 step 或 者 stair 图 这 种 作 图 方 式 经 常 用 于 绘 制 数 字 化 的 离 散 变 量 gnuplot 里 面 有 三 种 对 应 的 作 图 方 式, 分 别 为 :steps,fsteps,histeps 另 外,gnuplot 里 面 还 有 一 种 和 histogram 更 为 相 似 的 方 式 :boxes, 我 们 在 这 里 一 并 介 绍 下 面, 我 们 还 是 用 precipitation.dat 数 据 文 件 作 为 例 子, 来 看 看 这 几 种 作 图 方 式 有 什 么 异 同 : gnuplot> set term wxt size 640,640 gnuplot> set xrange [ 0 : 1 3 ] gnuplot> set xtics 1 gnuplot> set ytics 50 gnuplot> set m u l t i p l o t layout 4,1 gnuplot > set tmargin 1 gnuplot> set style f i l l s o l i d 0. 5 gnuplot> plot p r e c i p i t a t i o n. dat u 1 : 3 with s t e p s t " S t y l e : s t e p s " gnuplot> plot p r e c i p i t a t i o n. dat u 1 : 3 with f s t e p s t " S t y l e : f s t e p s " gnuplot> plot p r e c i p i t a t i o n. dat u 1 : 3 with h i s t e p s t " S t y l e : h i s t e p s " gnuplot> plot p r e c i p i t a t i o n. dat u 1 : 3 with boxes t " S t y l e : boxes " gnuplot> unset m u l t i p l o t 73

我 们 可 以 看 出, 三 种 steps 作 图 方 式 基 本 相 同, 只 是 在 X 轴 方 向 上 略 有 平 移 steps 曲 线 先 沿 X 方 向 前 进, 再 沿 Y 方 向 前 进 ;fsteps 曲 线 先 沿 Y 方 向 前 进, 再 沿 X 方 向 前 进 虽 然 我 们 有 12 个 数 据 点, 但 是 steps 和 fsteps 都 只 有 11 段 表 示 Y 值 大 小 的 横 线 histeps 和 steps 类 似, 但 是 起 始 点 前 移 了 0.5 个 单 位 长 度, 因 此 histeps 具 有 全 部 12 段 表 示 Y 值 大 小 的 横 线 这 三 种 steps 方 式 都 不 具 有 填 充 风 格 boxes 和 histeps 几 乎 完 全 相 同, 不 同 点 在 于 boxes 可 以 使 用 填 充 风 格 另 外,boxes 的 柱 宽 可 以 通 过 set boxwidth 命 令 调 节 boxes 和 histogram 风 格 的 主 要 区 别 在 于,histogram 更 多 用 于 多 组 数 据 的 比 较, 而 boxes 更 多 用 于 单 组 数 据 的 展 示 39 数 据 平 滑 gnuplot 是 一 个 绘 图 软 件, 数 据 处 理 不 是 它 的 长 项, 但 是 它 也 可 以 做 一 些 简 单 的 数 据 处 理 工 作, 例 如 之 前 提 到 过 的 拟 合 这 次 我 们 谈 谈 另 一 种 常 用 的 数 据 处 理 : 数 据 平 滑 数 据 平 滑, 就 是 根 据 一 组 数 据, 绘 制 出 一 个 比 较 平 滑 的 曲 线 它 有 很 多 种 不 同 的 算 法, 一 般 可 分 为 两 类 : 1. 根 据 数 据 绘 制 出 一 个 近 似 的 平 滑 曲 线, 曲 线 没 必 要 通 过 每 一 个 数 据 点 ; 2. 曲 线 通 过 每 一 个 数 据 点, 在 数 据 点 之 外 通 过 插 值 获 得 平 滑 的 曲 线 gnuplot 里 面 数 据 平 滑 的 命 令 是 smooth, 后 面 紧 跟 着 一 个 表 示 具 体 算 法 的 参 数 下 面 我 们 来 看 例 子, 还 是 用 precipitation.dat 数 据 文 件 : 74

gnuplot> set xrange [ 0 : 1 3 ] gnuplot> plot p r e c i p i t a t i o n. dat u 1 : 2 smooth b e z i e r lw 2 t b e z i e r curve,\ > u 1 : 2 smooth c s p l i n e s lw 2 t c s p l i n e s curve,\ > u 1 : 2 w p o i n t s pt 7 t data p o i n t s 这 里 有 两 种 平 滑 算 法 :bezier 和 csplines, 分 别 对 应 上 述 两 个 类 别 smooth 默 认 使 用 lines 风 格 绘 图 另 外, 还 有 一 种 acsplines 算 法, 平 滑 方 式 介 于 上 述 两 者 之 间 这 种 算 法 除 了 x 和 y 两 组 数 据 外, 还 要 求 第 三 组 数 据, 作 为 权 重 (weight) 当 然, 我 们 的 文 件 里 没 有 这 一 组 权 重 数 据, 所 以 我 们 手 动 给 所 有 数 据 加 上 相 同 的 权 重 : gnuplot> plot p r e c i p i t a t i o n. dat u 1 : 2 : ( 1. 0 ) smooth a c s p l i n e s lw 2 t weight = 1. 0,\ > u 1 : 2 : ( 6. 0 ) smooth a c s p l i n e s lw 2 t weight = 6. 0,\ > u 1 : 2 : ( 6 0. 0 ) smooth a c s p l i n e s lw 2 t weight = 60.0,\ > u 1 : 2 w p o i n t s pt 7 t data p o i n t s 75

using 参 数 里 的 括 号 是 必 要 的, 否 则 gnuplot 会 把 括 号 内 的 数 字 当 成 列 编 号, 而 不 是 数 字 这 里 我 们 看 到, 在 acsplines 算 法 里, 数 据 的 权 重 越 小, 曲 线 越 平 滑, 越 像 bezier; 而 数 据 的 权 重 越 大, 曲 线 越 接 近 数 据 点, 也 就 越 像 csplines smooth 除 了 上 述 算 法, 还 有 其 他 选 项, 我 们 下 次 再 介 绍 40 统 计 直 方 图 gnuplot 里 的 histogram 命 令 只 是 一 种 作 图 风 格, 它 并 不 能 计 算 数 据 的 分 布 并 画 出 直 方 图 要 完 成 这 个 任 务, 我 们 需 要 借 助 smooth 命 令 上 次 我 们 介 绍 了 smooth 命 令 的 几 个 参 数 其 实 smooth 命 令 不 仅 可 以 做 数 据 平 滑, 也 可 以 进 行 一 些 统 计 计 算 这 次 我 们 介 绍 smooth 的 另 外 两 个 参 数 :frequency 和 cumulative 这 两 种 参 数 都 要 求 有 两 列 数 据 :X 和 Y 对 于 同 一 个 X 值 ( 例 如 X = x i ), 如 果 有 不 止 一 个 数 据 点 (y i1, y i2,... ), 那 么 frequency 参 数 就 会 把 X = x i 的 所 有 数 据 点 的 Y 值 相 加, 得 到 一 个 X = x i 处 Y 值 的 和 如 果 我 们 让 y i1 = y i2 =... = 常 数, 那 么 这 个 和 就 可 以 用 来 表 示 数 据 点 出 现 在 X = x i 的 频 率 如 果 用 cumulative 参 数, 那 么 所 有 X < x i 的 数 据 点 都 会 计 算 在 内 现 在 我 们 来 看 例 子 : gnuplot > set samples 300 gnuplot> set xrange [ 1 : 3 0 0 ] gnuplot> set format x "%. 0 f " gnuplot> set t a b l e "random i n t. dat " gnuplot> plot int (10 rand ( 0 ) ) gnuplot> unset t a b l e 这 里 我 们 生 成 了 300 个 0 到 9 之 间 的 随 机 整 数 的 序 列, 并 把 它 存 入 了 名 为 random-int.dat 的 文 件 这 里 的 rand() 是 gnuplot 自 带 的 伪 随 机 数 生 成 函 数, 能 生 成 0 到 1 之 间 的 随 机 数 int() 为 取 整 函 数 下 面 我 们 来 绘 图 : gnuplot > reset gnuplot > set boxwidth 1 gnuplot> set style f i l l s o l i d 0. 5 gnuplot> set grid ytics gnuplot> set xrange [ 1:10] gnuplot> plot random i n t. dat u 2 : ( 1 ) smooth frequency w boxes t " frequency " 76

在 plot 命 令 里, 我 们 用 生 成 的 随 机 数 作 为 X, 用 常 数 1 作 为 Y, 这 样 smooth frequency 就 给 出 了 0 到 9 之 间 各 个 数 字 出 现 的 次 数 我 们 再 来 看 cumulative: gnuplot> set yrange [ 0 : 3 5 0 ] gnuplot> plot random i n t. dat u 2 : ( 1 ) smooth cumulative w boxes t " cumulative " smooth cumulative 把 所 有 X 小 于 某 一 数 值 的 Y 值 累 计 起 来, 所 以 最 后 达 到 最 大 值 300, 正 好 是 样 本 总 数 上 面 的 例 子 是 整 数 样 本, 比 较 容 易 操 作 对 于 实 数 ( 浮 点 数 ) 样 本, 我 们 面 临 binning 的 问 题, 这 类 似 于 将 模 拟 信 号 转 换 为 数 字 信 号 下 面 我 们 用 gnuplot 源 文 件 中 自 带 的 demo 目 录 里 的 数 据 文 件 random-points 举 个 例 子 random-points 文 件 包 含 几 组 不 同 分 布 的 随 机 数, 其 中 第 2 列 为 正 态 分 布, 共 300 个 数 据 gnuplot > set autoscale gnuplot> bin ( x, s ) = s int ( x/ s ) gnuplot > set boxwidth 0. 0 5 gnuplot > set key l e f t top 77

gnuplot> plot random p o i n t s u ( bin ( $2, 0. 0 5 ) ) : ( 2 0 / 3 0 0. ) s f w boxes t " frequency ",\ > u 2 : ( 1 / 3 0 0. ) s cumul t " cumulative " lw 2 l c rgb " r o y a l b l u e " 注 意 : 我 们 这 里 的 plot 命 令 用 了 大 量 缩 写 我 们 先 定 义 了 一 个 函 数 bin(x,s), 用 于 将 模 拟 信 号 数 字 化, 其 中 s 是 每 个 bin 的 宽 度 ( 或 者 叫 做 样 本 间 隔 ) set boxwidth 设 定 图 中 每 个 柱 的 宽 度, 我 们 以 前 曾 经 用 它 设 定 过 相 对 宽 度, 这 里 设 定 的 是 绝 对 宽 度 在 frequency 图 中,X 是 数 字 化 之 后 的 数 据,Y 是 常 数 20/300. ( 注 意 这 里 的 小 数 点 ) 分 子 上 的 20 是 因 为 X 被 乘 了 0.05, 为 了 保 持 每 个 直 方 柱 面 积 不 变 ( 直 方 图 中 用 面 积 表 示 概 率 ), 我 们 把 Y 乘 以 20; 分 母 上 的 300 是 样 本 总 数, 用 于 归 一 化, 这 样 我 们 得 到 的 就 是 分 布 概 率, 而 不 是 某 区 间 内 数 据 点 的 个 数 在 cumulative 图 中,X 数 据 binning 没 有 必 要, 只 需 要 将 所 有 数 据 累 加 就 可 以 了, 而 Y 是 归 一 化 常 数 这 样, 这 两 种 图 的 意 义 就 非 常 清 楚 了 :frequency 给 出 的 是 概 率 密 度 函 数, 而 cumulative 给 出 的 是 累 计 分 布 函 数 41 三 元 算 符 和 分 段 函 数 分 段 函 数 在 若 干 区 间 上 有 不 同 的 表 达 式, 例 如 符 号 函 数 : 1 if x < 0 sgn(x) = 0 if x = 0 1 if x > 0 gnuplot 预 定 义 函 数 中 包 含 符 号 函 数 sgn(x), 下 面 我 们 试 着 画 一 下 函 数 图 像 : gnuplot > set samples 1000 gnuplot> set xrange [ 1. 5 : 1. 5 ] gnuplot> set yrange [ 1. 5 : 1. 5 ] gnuplot > plot sgn ( x ) lw 2 78

gnuplot 把 所 有 取 样 点 连 接 了 起 来, 这 样 函 数 图 像 在 零 点 成 了 连 续 的, 而 实 际 上 零 点 应 该 是 不 连 续 的 断 点 为 了 更 合 理 的 表 现 函 数 性 质, 我 们 需 要 用 到 三 元 算 符 (ternary) 三 元 算 符 的 形 式 是 : A?B:C A 一 般 是 一 个 逻 辑 表 达 式, 如 果 A 为 真, 那 么 整 个 表 达 式 的 值 为 B; 如 果 A 为 假, 那 么 整 个 表 达 式 的 值 为 C 这 和 C 语 言 的 问 号 表 达 式 完 全 相 同 下 面 我 们 看 如 何 用 三 元 算 符 构 造 分 段 函 数 : gnuplot> unset border gnuplot > set zeroaxis l t 1 gnuplot> set xtics a x i s 1,2,1 gnuplot> set ytics a x i s 1 o f f s e t 0, 0. 5 gnuplot> set arrow 1 from 0,0 to 1. 5, 0 f i l l e d gnuplot> set arrow 2 from 0,0 to 0, 1. 5 f i l l e d gnuplot> plus ( x ) = x>0? 1 : 1/0 gnuplot > minus ( x ) = x<0? 1 : 1/0 gnuplot> set label 1 at 0,0 point pt 7 ps 1. 5 l c rgb " red " f r o n t gnuplot> plot plus ( x ) lw 2 l c rgb " red " t i t l e " sgn ( x ) ", minus ( x ) lw 2 l c rgb " red " n o t i t l e 79

这 里 我 们 用 plug(x) 和 minus(x) 分 别 表 示 函 数 的 正 值 和 负 值 部 分, 用 1/0 表 示 函 数 值 没 有 定 义 在 零 点, 我 们 利 用 一 个 不 含 任 何 字 符 的 label 命 令 画 一 个 独 立 的 点 以 前 我 们 讲 过 label 命 令, 这 里 的 label 命 令 有 两 个 新 的 参 数 : point 参 数 允 许 在 label 所 在 坐 标 画 一 个 点 ; 而 front 参 数 表 示 将 label 放 在 前 景, 这 样 它 就 不 会 被 图 像 其 他 部 分 遮 盖, 类 似 于 图 形 处 理 软 件 中 调 整 layer 的 顺 序 和 front 类 似 的 参 数 还 有 back 42 几 何 图 形 对 象 通 过 设 置 对 象 (object), 可 以 让 gnuplot 在 图 中 绘 制 几 何 图 形 目 前 object 支 持 四 种 几 何 图 形 :rectangle( 长 方 形 ),ellipse( 椭 圆 形 ),circle( 圆 形 ) 和 polygon( 多 边 形 ) 下 面 通 过 实 例 说 明 它 们 的 用 法 : gnuplot > set grid gnuplot> set size square gnuplot> set o b j e c t 1 r e c t a n g l e from 0,0 to 4,3 lw 3 gnuplot> set o b j e c t 2 r e c t a n g l e at 4,3 size 4,3 behind gnuplot> set o b j e c t 3 e l l i p s e at 5, 5 size 6,3 angle 30 lw 2 \ > f i l l c o l o r rgb " red " f i l l s t y l e t r a n s p a r e n t s o l i d 0. 4 gnuplot> set o b j e c t 4 c i r c l e at 3, 3 size 3 f c rgb " blue " f s t r a n s p a r e n t s o l i d 0. 4 noborder gnuplot> set o b j e c t 5 c i r c l e at 5, 5 size 3 arc [ 0 : 6 0 ] f c rgb " orange " f s s o l i d gnuplot> set o b j e c t 6 c i r c l e at 5, 5 size 3 arc [ 6 0 : 2 0 0 ] f c rgb "brown" f s s o l i d gnuplot> set o b j e c t 7 c i r c l e at 5, 5 size 3 arc [ 2 0 0 : 3 6 0 ] f c rgb " f o r e s t green " f s s o l i d gnuplot > set o b j e c t 8 polygon from 1,1 \ > to 1,5 \ > to 3,8 \ > to 8,6 \ > to 5,4 \ > to 7,0 \ > to 1,1 lw 4 f c rgb " v i o l e t " gnuplot> plot [ 10:10][ 10:10] 15 n o t i t l e 80

这 里 共 设 置 了 8 个 对 象, 现 在 分 别 说 明 各 个 对 象 的 用 法 : 对 象 1 和 2 是 长 方 形, 既 可 以 通 过 对 角 顶 点 坐 标, 也 可 以 通 过 中 心 坐 标 和 宽 高 来 设 置 对 象 2 的 behind 参 数 类 似 之 前 讲 过 的 front 和 back behind 和 back 的 不 同 在 于,back 仅 仅 是 放 在 曲 线 和 label 之 后, 而 behind 是 放 在 所 有 图 像 元 素 之 后 对 象 3 是 椭 圆 形, 参 数 和 长 方 形 类 似, 多 了 旋 转 角 度 angle 和 填 充 风 格 对 象 4 是 圆 形, 通 过 圆 心 坐 标 和 半 径 设 置 对 象 5 6 7 也 是 圆 形, 但 是 多 了 arc 参 数 指 定 圆 弧 角 度, 所 以 其 实 画 出 的 是 扇 形 gnuplot 本 身 没 有 饼 图 (pie chart) 这 种 风 格, 所 以 利 用 圆 形 对 象 可 以 绘 制 简 单 饼 图 对 象 8 是 多 边 形, 通 过 指 定 各 顶 点 坐 标 来 设 置, 注 意 多 边 形 必 须 是 闭 合 的 设 置 的 各 个 对 象 必 须 通 过 plot 命 令 才 能 显 示 出 来, 而 我 们 又 不 希 望 画 什 么 其 它 图 像, 所 以 这 里 用 一 种 特 殊 方 式, 在 绘 图 区 域 仅 显 示 出 各 个 几 何 对 象 以 前 我 们 都 是 用 set xrange ( 或 yrange) 命 令 来 设 置 坐 标 取 值 范 围, 其 实 这 个 取 值 范 围 也 可 以 直 接 在 plot 命 令 中 给 出 这 里 我 们 通 过 在 取 值 范 围 之 外 画 一 条 直 线 的 方 式, 得 到 了 一 个 仅 包 含 各 几 何 对 象 的 图 43 地 图 及 圆 圈 数 据 图 上 次 我 们 讲 了 几 何 图 形 对 象, 这 次 我 们 介 绍 一 种 使 用 几 何 图 形 表 示 数 据 的 方 法 下 面 这 幅 图 来 自 美 国 地 质 调 查 局 网 站, 显 示 的 是 前 三 天 内 ( 至 本 文 写 作 时 ) 世 界 各 地 发 生 的 4 级 以 上 地 震 : 81

现 在, 我 们 用 gnuplot 绘 制 一 张 类 似 的 地 图, 用 圆 圈 大 小 和 颜 色 表 示 震 级, 在 地 图 上 标 注 各 地 震 发 生 的 位 置 gnuplot 的 demo 目 录 里 有 一 个 world.dat 文 件, 包 含 世 界 地 图 的 信 息, 我 们 就 用 它 来 绘 制 地 图 随 着 我 们 学 习 的 gnuplot 命 令 越 来 越 多, 绘 制 一 张 图 的 命 令 越 来 越 复 杂 我 们 可 以 把 所 有 命 令 预 先 存 入 一 个 文 件 中, 随 后 在 gnuplot 里 面 调 用 该 文 件, 这 样 可 以 方 便 我 们 重 复 使 用 这 些 命 令 我 们 把 下 面 这 些 命 令 存 入 名 为 commands.gnu 的 文 件 : rgb ( r, g, b ) =65536 int ( r ) +256 int ( g )+int ( b ) red ( x ) = 2/3.<=x && x<1? 255 (3 3 x ) : 255 green ( x ) = 0<=x && x <1/3.? 255 : x <2/3.? 255 (2 3 x ) : 0 blue ( x ) = 0<=x && x <1/3.? 255 (1 3 x ) : 0 c i r c l e c o l o r ( x ) = rgb ( red ( ( $3 2) / 5. 0 ), green ( ( $3 2) / 5. 0 ), blue ( ( $3 2) / 5. 0 ) ) unset key set xrange [ 180:180] set yrange [ 90:90] set style f i l l t r a n s p a r e n t s o l i d 0. 6 noborder set o b j e c t 1 r e c t a n g l e from graph 0,0 to graph 1,1 f c rgb " l i g h t cyan" behind plot world. dat with f i l l e d c u r v e s l c rgb " f o r e s t green ",\ earthquakes. dat using 1 : 2 : ( ( $3 3) 2) : ( c i r c l e c o l o r ( $3 ) ) with c i r c l e s l c rgb v a r i a b l e 随 后 启 动 gnuplot, 输 入 下 面 的 命 令 : gnuplot > load commands. gnu 这 里 的 load 命 令 用 来 调 用 刚 才 预 存 的 文 件 于 是, 我 们 得 到 下 面 这 幅 图 : 82

现 在, 我 们 来 解 释 刚 才 用 到 的 那 些 命 令 : 1 至 5 行 定 义 了 一 个 从 数 字 到 rgb 颜 色 的 映 射, 这 类 似 于 我 们 之 前 色 板 设 置 里 讲 过 的 rgbformulae, 只 不 过 在 这 里 我 们 使 用 了 自 己 定 义 的 函 数 从 这 里 我 们 也 可 以 看 到 rgbformulae 的 工 作 原 理 在 函 数 定 义 中 我 们 使 用 了 三 元 算 符 和 分 段 函 数 讲 过 的 问 号 表 达 式, 可 以 作 为 一 种 复 习 在 set object 命 令 里 我 们 定 义 了 一 个 布 满 整 个 绘 图 区 域 的 长 方 形, 并 且 放 置 到 了 behind 位 置, 相 当 于 为 图 像 增 加 了 一 个 背 景 颜 色 plot 命 令 里 的 前 半 部 分 用 于 绘 制 地 图 轮 廓, 后 半 部 分 用 于 绘 制 表 示 地 震 的 圆 圈 地 震 数 据 来 源 于 美 国 地 质 调 查 局 网 站, 存 于 名 为 earthquakes.dat 的 文 件 中 这 里 用 到 了 一 个 新 的 绘 图 风 格 :circles 圆 圈 的 大 小 由 using 参 数 的 第 3 列 数 据 指 定, 圆 圈 的 颜 色 由 linecolor 参 数 设 置 然 而, 这 里 没 有 指 定 具 体 的 颜 色, 而 是 用 了 一 个 特 殊 的 变 量 variable variable 的 值 由 额 外 的 一 列 数 据 ( 即 using 参 数 的 第 4 列 数 据 ) 指 定, 因 此 颜 色 会 随 着 不 同 数 据 改 变 把 我 们 用 gnuplot 绘 制 的 地 图 和 原 图 比 较 一 下, 地 震 的 位 置 是 一 致 的 44 for 循 环 作 为 一 个 具 有 脚 本 编 程 能 力 的 命 令 行 程 序, 循 环 语 句 是 必 不 可 少 的 gnuplot 具 有 和 C 语 言 类 似 的 for 循 环 结 构, 可 以 应 用 于 plot, splot, set 和 unset 命 令 for 命 令 的 基 本 结 构 是 : f o r [ i = begin : end : step ] 这 表 示 i 的 取 值 从 begin 到 end, 步 长 为 step 如 果 步 长 为 1,step 也 可 以 省 略 下 面 举 例 说 明 : gnuplot> f ( x, s ) = exp( x x / ( 2. s ) ) /( sqrt (2 pi s ) ) gnuplot > set term wxt enhanced gnuplot> set t i t l e "Normal D i s t r i b u t i o n " gnuplot > set samples 1000 gnuplot> set style f i l l t r a n s p a r e n t s o l i d 0. 3 noborder gnuplot> plot f o r [ i = 1 : 1 0 : 3 ] f ( x, i ) w f i l l e d c u r v e s t i t l e "σ^2 = ". i 83