# 图表

> 每张图表都带的那条工具栏、每个按钮做什么、刻度、统计和参考线面板、分离出去的图表窗口、图表在应用里出现在哪些地方，以及它们背后那唯一一个绘图引擎。

应用里的每一张图表，都由同一个引擎（ECharts）通过同一个图表视图画出来，不管是什么把它放上屏幕的：仪表画面上的[折线图](component-line-chart)、[柱状图](component-bar-chart)和[饼图](component-pie-chart)组件，[单元面板](view-unit-panels)的通道卡片，Process 页面上一次运行的实时图表，[历史](histories)里一次已记录运行的数据记录图表，一个[配方](process-recipes)或者一个流程里的配方曲线预览，一次[判定](process-evaluations)的判据预览，以及下面那两个分离出去的窗口。它们之间不同的是配置从哪里来，绝不是画法：数据里的空缺永远是线上的一个洞，绝不是一座桥，而图表写出的每一个数字和每一个时刻，都跟着工作站自己的[语言与格式](settings-localization)。PDF 报告画的是同一幅图形，只是没有本页上的任何工具。

## 工具栏 {#the-toolbar}

一张图表在它的绘图区上方带着一排按钮：到处都是同一条工具栏，只是逐张图表被告知要画哪些按钮。在一个仪表画面组件上，那份名单就是它属性里的**工具栏**分区（[仪表画面编辑器](view-editor#toolbox)）；没有人可问的界面（一次已记录的运行、一份配方预览）则提供一张时间图表做得到的每一个工具。一个工具都没有时，根本不画工具栏。

| 按钮（它的提示） | 作用 | 在哪些地方提供 | 在画面上是否默认打开 |
|---|---|---|---|
| 在另一个窗口中打开 | 在它自己的一个窗口里打开同一张图表（见下）。只在图表有自己的地址时提供：历史里一次已记录的运行、一份配方曲线。放在画面上的图表绝不提供。 | 已记录的运行、配方曲线 | 不提供 |
| 框选一块区域放大 | 启用框选放大：下一次在绘图区上拖动，框住它画出来的那个框，而不是平移。启用期间按钮一直亮着。 | 时间图表 | 是 |
| 还原缩放 | 把窗口退回到所绘制的全部。 | 时间图表 | 是 |
| 手动设定坐标范围 | 打开下面那块刻度面板。只要还钉着任何东西它就亮着，于是一把不再跟着数据走的刻度，不用打开面板也说得出来。 | 时间图表 | 否 |
| 所显示窗口的最小值、平均值和最大值 | 打开下面那块统计面板。只在面板打开期间测量。 | 时间图表 | 否 |
| 画一条参考线 | 打开下面那块参考线面板。只要画着任何一条线它就亮着。 | 时间图表 | 否 |
| 保存 PNG | 把图形按屏幕分辨率的两倍下载成一个 PNG，衬着主题的背景色，文件按图表的标题命名（没有标题时叫“chart”）。 | 全部图表 | 是 |
| 复制 PNG | 把同一个 PNG 放到剪贴板上。操作记录条回答“图表已作为图片复制。”；浏览器拒绝写入时说“浏览器拒绝了剪贴板，因此没有复制图表。”，根本没有剪贴板时说“这个浏览器没有提供剪贴板，因此没有复制图表。” | 全部图表 | 是 |
| 显示或隐藏系列 | 打开一份所绘制系列的列表，各带一个勾选框，直接从图表上读出来；取消勾选，就在这幅画面开着的这段时间里隐藏那个系列。什么也没画时写“没有系列”。 | 时间图表 | 是 |
| 数据提示已关闭 / 数据提示已打开 | 打开或者关闭悬停时的读数。它一开始是关的，好让一只手扫过绘图区时，绝不会拿一个谁也没要的方框把它盖住；这个选择在本次会话内有效。 | 时间图表 | 是 |
| 全屏 | 通过浏览器的元素全屏，让这一张图表铺满整个窗口；再按一次，或者按 Esc，就把窗口交还回去。在一幅已经全屏的仪表画面上，它把这张图表放大，而 Esc 会先离开图表，再离开仪表画面。 | 全部图表 | 是 |

一张柱状图或者饼图只做得到那一对 PNG 和全屏：一次读的是此刻的比较，没有可以走的坐标轴，没有可以测量的窗口，也没有可以往上放线的地方。**导航**设为“固定窗口”的折线图，不管勾没勾选，都拿不到“框选一块区域放大”和“还原缩放”：什么都不动的窗口没有缩放可以让它们回答，窗口重新可以移动时两个都会回来。同一时间只有一块面板打开，在别处按一下就把它关掉。图表矮得放不下一块面板时，面板在图表之内结束，放不下的部分可以滚动查看；图表很窄时，横跨面板表单的按钮（**载入所显示的窗口**、**画出这条线**）会折行，而不会超出边缘。

缩放和平移本身是图表的**导航**设置（固定窗口，滚轮和拖动，或者滚轮加拖动再加一条画在绘图区下面、标出窗口在整段记录里位置的导航条）；一张带上下排列绘图区的图表会让每个绘图区一起动，因为它们共用一条时间轴。手势绝不碰所存下的东西：图表画的是从可见范围到得了画布的那部分，所以放大之后看到的总是真实数据，而角上的一个标记可以说明这幅画面是测量本身，还是它的一次降采样（[折线图](component-line-chart#fidelity-and-performance)）。

## 手动设定坐标范围 {#set-the-scale-by-hand}

这块面板钉住时间轴的一段时段和数值轴的一段范围，两侧各自独立。每个字段在你离开它时提交；空着的字段表示那一侧仍然自由，照旧自行调整。

| 字段 | 它接受什么 |
|---|---|
| 时段 / 时段（从现在算起的秒数）/ 采样点 | 时间轴的两端，用这条轴画出来时所用的说法来问：时钟轴上是两个日期时间挑选器，相对时间轴上是两个秒数，采样点轴上是两个采样点计数。 |
| 数值轴，最小值和最大值 | 图表自己那条数值轴的两端。在带上下排列绘图区的图表上，这只是最上面那个绘图区的尺子；时段则让每个绘图区一起动。 |
| 自动（每条轴各一个） | 把那条轴交还给图表自己搭出来的窗口：滚动窗口重新滚动，写定了固定两端的轴回到那两端，没写定两端的轴回到它自由的自行调整。那条轴上什么也没钉住时它变灰。 |
| 载入所显示的窗口 | 用屏幕上实际显示的那个窗口填满全部四个字段，把你做过的每一次缩放和平移都算进去，于是把你正在看的东西钉住，只要按一下。 |

这次钉住属于这条连接上的这张图表：它绝不随画面一起保存，另一个浏览器看同一张图表时有它自己的一套，关掉这幅画面就把它释放掉。一个一个采样点也没装住的钉住窗口照样画出来，并在绘图区下面说明：“在你固定的刻度范围内没有测到任何数据。”

## 最小值、平均值和最大值 {#minimum-average-and-maximum}

这块面板是一张表，每个所绘制的系列一行（画面作者关掉的系列不在屏幕上，也不在这张表里；用图例隐藏起来的仍然在），按它的墨色上色，写出所显示窗口内那些采样点的**最小值**、**平均值**和**最大值**，按工作站书写数字的方式书写。表格上面那一行说明这是哪个窗口：“所显示的时间窗口，一直到最新的采样点。”，或者在你往回走进历史时写“所显示的时间窗口。最新的采样点在它的右边界之外。”一行的提示写出这个窗口的采样点里有多少个是读数；空缺算作这个窗口装住的一个采样点，在那三个数字里则什么也不算，所以绝不会跨过一个洞去取平均。什么也读不到的一行写出空缺，并说明这是哪一种沉默：“在所显示的窗口里，这个系列没有任何采样点。”或者“在所显示的窗口里，这个系列的每一个采样点都是空缺。”面板打开期间，这些数字跟着实时数据走，而且是对着采样点本身测量的，绝不是对着降采样之后的图形。

## 参考线 {#reference-lines}

一条参考线，是横贯绘图区画在某个数值上的一条线，或者纵贯绘图区画在某个时刻上的一条线，带着说明它为什么在那里的字，以及一种把它和下一条分开的颜色。面板列出已经画了什么，每一条带着自己的 ✕，还有**全部删除**；列表下面有一份小小的表单，用来画下一条：

| 字段 | 它接受什么 |
|---|---|
| 哪条坐标轴 | **在某个数值上**，或者用时间轴自己的说法：**在某个时刻**（一个日期时间挑选器）、**在某一秒（从现在算起）**或者**在某个采样点上**。换了坐标轴就把位置清空，因为一个数值和一个时刻不是同一个数。 |
| 线画在哪里 | 在那条轴上的位置。在它填好之前，**画出这条线**一直变灰。 |
| 线上写什么 | 画在线上的可选文字。 |
| 线的颜色 | 一个颜色挑选器；线一开始是琥珀色的。 |
| 画出这条线 | 把它画出来。位置和文字为下一条线清空；坐标轴和颜色留着。 |

这些线只属于你眼前这张图表，别的什么也不属于：它们不保存，画面的作者永远不会被告知，另一条连接看不到它们，关掉这幅画面它们也就没了。一条必须比这次观看活得更久的标注，属于一次运行，由那次运行自己的文件记录（[运行记录与备注](process-runs)）。

## 分离出去的图表窗口 {#the-detached-chart-window}

**在另一个窗口中打开**在一个新窗口里打开这张图表自己的路由：在工作站上是应用的一个真窗口，在远程浏览器里是一个新标签页。再按一次，是把已有的那个窗口调到前面来，而不是再开第二个。存在两个路由：

| 路由 | 它显示什么 | 从哪里打开 |
|---|---|---|
| `/chart/run/{id}` | 一次已记录运行的数据记录图表，从运行记录文件重新读出来：它的各个系列、标注、备注，以及它那个流程当前所配置的合格色带。id 解析不到任何东西时写“找不到运行记录”。 | [历史](histories)里一次运行的图表 |
| `/chart/recipe/{id}` | 一份配方的阶跃、斜坡和保持曲线，从保存下来的模型重新搭出来。id 解析不到任何东西时写“找不到配方”。 | 配方编辑器，以及一个流程的配方预览 |

这个窗口不带外壳绘制：没有导航栏，没有标题栏，没有状态栏，只有一条写着图表标题和 **X 轴与主图表同步**（“让 X 轴的缩放和平移跟随主图表”，默认打开）的顶栏，下面是带着完整工具栏的图表。同步打开期间，这个窗口加入一个按它的路由做键的通道，在时间轴上跟着主图表缩放和平移；关掉之后，它自己单独导航。每个路由各自要求什么样的身份才配看它画的东西：运行记录的窗口要的是查看历史，也就是放行它所来自的那个已记录运行浏览界面的同一项权限；配方的窗口要的是 Process 页面自己的那条规矩，Process 那四个开关中的任何一个或者查看历史都能打开它。没有自己这个路由所要之物的角色，或者在窗口开着期间被降权的角色，都不能凭地址读到那张图表。这个窗口是只读的：备注和标注在历史里编辑，不在这里。

## 这些工具不做什么 {#what-the-tools-do-not-do}

工具栏上的任何东西都不会改动这幅画面：隐藏的系列、一次钉住、一条线和数据提示的开关状态，全都是这条连接上这张图表的状态，明天重新打开这幅画面，它是干净的。工具栏上的任何东西都伸不到一份报告里：PDF 画的是它自己的生成器搭出来的那幅图形，没有钉住、没有参考线、也没有工具。工具栏不导出任何数据，只出图：一次运行的那些数字，是从[历史](histories)的各种导出里离开的。而且工具栏绝不提供一个这幅图形做不到的工具：一次按类别的比较永远得不到缩放、刻度、统计或者参考线，一张停在固定窗口里的折线图永远得不到那两个缩放按钮，而画面上的一张图表永远得不到属于自己的窗口。
