工程邮袋
第 3 集:约翰·雅各布·金格尔海默……史密斯图表!
我们的系统工程师时不时地会遇到有趣的问题,这些问题在某种程度上超出了典型的范围联合管理计划用法。 这些应用程序通常都很聪明,并且很多时候都让人们认识到使用数据不仅仅是为了解决业务或技术问题。 其他时候,这些问题只是意想不到的、具有挑战性的问题。 我称这些为“曲线球”。
我喜欢漂亮的曲线球。
我想分享这个特别的有几个原因。 首先,它是一个如何重新调整图形自定义用途以实现目标的示例。 其次,我将说明我在使用解决问题时经历的思维过程联合管理计划。 简而言之,这是旅程比结果更具启发性的案例之一。 因此,无需进一步限定,下面是来自纽约州另一位同事的一个非常好的曲线球示例,我认为分享它会很有趣。
……郑重声明,尼克,这不是一个“快速问题”! ;D
问题
迈克[JMP],快速提问 – 您知道 JMP 是否存在用于绘制极坐标类型图形的插件或脚本吗? 即希望在史密斯图上绘制等高线图,例如下面粘贴的示例,以进行一些射频阻抗分析...... 目前我们可以接受转换为直角坐标,但我认为值得询问一下您是否以前见过它或者认识 JMP 中可能提供帮助的人。


史密斯圆图模板 – 有没有办法将两个数据字段(实部和虚部坐标值)绘制到史密斯圆图上?
在谷歌上找到了等高线图的例子。 似乎 JMP 可以做一些事情......
谢谢,
尼克[用户]
我的回复:
嗨,尼克,你能分享一下你用来制作等值线图的数据吗?
我可能能够创建一个适合将网格覆盖在数据之上的法案的形状文件。 (没有承诺,但我需要数据来交叉检查我是否正确执行。)
最好的,
中号
史密斯圆图到底是什么?
当我看到这个问题的时候我也是这么想的。 说实话,我在社区里看到过他提到的问题。 我看了一眼社区问题,心想:“不。 那是给别人的。”显然,生活另有想法。 因此,经过适当的惩罚,我开始弄清楚这些情节是什么。 这是一本非常有趣的读物,但说实话,具体细节对于本次讨论来说并不重要。
从较高的层面来看,史密斯圆图是一种用于电气工程的极坐标图。 (这对我来说很有意义。 )事实证明,它们是由重叠的圆和圆弧组成的,其中给定圆的半径与测量的物理量有关。 (再说一遍——没问题,特别是因为一位好心的教授在他们的网站上发布了他们的讲义,其中包括将物理量与圆的半径联系起来所需的方程。 )此外,对于使用这些东西的人来说,将数据从极坐标系(以半径和角度绘制的数据点)转换为笛卡尔坐标系(以 x 和 y 绘制的数据点)以便于绘图是很常见的。
开发过程
当我完成研究时,我发现我需要以某种方式构建一组具有特定半径的圆,并且我需要这些半径与用户提供的数据集相匹配。 我想得越多,我最初为 Graph Builder 构建 shapefile 的想法似乎就越不合适。 一位同事进一步证实了这一点,他认为这会有问题。 但为什么? 首先,必须将数据重新调整为与 shapefile 坐标系相同的比例。 即使有详细的文档,这似乎也是一个充满问题的雷区。 最终要求我要么构建一个完全独立的插件来扩展幕后的所有内容,要么构建 shapefile,将其扔到栅栏上,并希望它运行时没有问题。 我对这两个选项都不感兴趣。 其次,我必须弄清楚如何将这些弧设置为在与圆的交点处正确地开始和结束。 这不是一件容易的事。
证据表明,在我获得所需的数据之前,我不得不放弃最初的想法! 我该去哪里? 回到最初! 我从一系列简单的问题开始重新审视我的问题。
- 我可以绘制数据吗? 是的,因为我可以预期用户会将数据转换为笛卡尔坐标,所以我可以使用标准平台之一(图形生成器或等值线图)来生成数据图。
- 我需要对绘图进行什么操作才能将其制作成史密斯圆图?我需要创建一系列圆、弧和线并给它们贴上标签。
- 我如何绘制所有这些?我有两个选择。 图形生成器允许我使用形状文件,但我们已经消除了该选项。 shapefile 也不能让我轻松使用文本标签。 图形脚本可用于注释现有绘图,但这需要编写脚本,这可能会让用户感到害怕。
- 如果我构建一个可以进行注释的小插件会怎么样?我越仔细地研究这个问题,就越意识到这是我必须走的方向。 但是,我还意识到,如果我致力于创建一个插件,我可以从我最新构建的半导体工具套件中回收大量支持代码。(孩子们,请务必保存您的代码!)
图形脚本
在 JMP 中打开绘图 – 任何 2D 绘图...继续,我会等待...。
准备好?
正确的! 右键单击图表区域并向底部看。 您看到“自定义...”选项了吗? 您曾经探索过这个选项吗? 大多数人都没有。 我预计这种情况会因为 JMP 14 而开始改变(边界图),但到目前为止,我认为这并不是 JMP 中非常常见的使用领域。 遗憾的是,因为您可以通过自定义做很多事情。 事实证明,通过将图形脚本添加到绘图的自定义中,史密斯圆图真的很容易创建。现在,你们中的一些人可能已经出了一身冷汗,因为我使用了“s-word”——不,不是那剑–我的意思是“脚本”。但是,请记住,我们需要的只是圆圈、直线和标签,而且这些很容易编写脚本。 我还将添加一个形状来在我们不需要的部分周围创建一个遮罩,并使标签更容易看到。 以下是我们如何制作每一个,如下面的史密斯圆图所示。
绘制数据图表
图形脚本首先需要一个图形。 所以,步骤 1(应该总是情况如此)就是将数据绘制成图表。 在本例中,我在等值线图中使用了平滑公式(更多关于这个小工作流程的信息:所有晶圆图都是错误的:半导体数据可视化的冒险)。 从那里,您可以打开图表的自定义。要将图形脚本添加到自定义中,只需按左侧图层列表中的“+”按钮即可。 这会在堆栈中提供一个新条目,并在右侧提供一个空白脚本字段。 如果需要,您可以通过双击标题来命名脚本(我建议您这样做 - 这是很好的组织)。 您可以在脚本字段上方的下拉列表中探索一些模板和示例,您可以使用它们来获得想法。 层在堆栈中出现的顺序决定了顶部的内容。 底部的层最接近您的眼球(注意 - 这是落后与大多数图形艺术软件的做法不同!)最后,虽然我使用了一些图形脚本,但还有其他脚本。 它们可以在脚本指南的图形组下找到(在 JMP - 帮助 > 脚本指南中。 选择“功能类别”以方便查找)。
画圆圈
圆圈使用圆({,},<半径>)图形脚本中的命令。 这是我在示例中用于圆心位于 y = 0 线上的圆的脚本(绿色文本描述了每个部分的作用)。
// make a list of circles using a desired step and range of resistances
inc = 0.2;
resCircs = Index( 0, 5, 0.2 );
// set line color and weight
Pen Color( "Gray" );
Pen Size( 1 );
// loop through the list of resistances, calculate and plot a circle for each one
For( i = 1, i <= N Items( resCircs ), i++,
Circle( {resCircs[i] / (1 + resCircs[i]), 0}, 1 / (1 + resCircs[i]) )
);
弧线的代码实际上也是圆。 (请记住,圆弧只是圆的一部分。)区别仅在于如何计算圆心和半径。 列表中的每个条目还会创建两个圆圈 - 一个用于正曲线,一个用于负曲线。
inc = 0.2;
reactCircs = Index( 0, 5, 0.2 );
Pen Color( "Gray" );
Pen Size( 1 );
For( i = 1, i <= N Items( reactCircs ), i++,
Circle( {1, 1 / reactCircs[i]}, 1 / reactCircs[i] );
Circle( {1, 1 / -reactCircs[i]}, 1 / -reactCircs[i] );
);
接下来,我将创建一个形状来遮盖不需要的圆圈部分。
绘制不规则形状(多边形)
不规则形状使用多边形([],[])命令。 您还可以使用 {x,y} 表示法定义每个顶点位置,但这使用起来很痛苦。 代码如下所示(为了便于阅读,删除了矩阵):
// define the fill color
Fill Color( "white" );
// define the polygon using matrices
Polygon([… xmatrix…],[…ymatrix…]);
省略的坐标定义了一个正方形,其中有一个从中心敲出的圆,其大小与以 y = 0 线为中心的最大圆相同。 将多边形脚本放在圆形脚本下方(即,更靠近堆栈顶部)会掩盖史密斯图不需要的圆形部分。
绘图标记和文本
标记(数据点)使用命令标记( 颜色状态(<颜色>), [], []) 。 颜色状态参数是可选的,但允许您独立于任何其他脚本来控制标记颜色。 将文本标签放置到图表上使用文本(<对齐方式>, {,}, <字符串>) 。 对齐参数是可选的,{x,y} 位置用于文本字段的中心。 在示例中,标记和文本之间的坐标是相同的,我只是合并了一些偏移和对齐调整以使内容正确对齐(这导致了最后那个毛茸茸的 if 语句)。 为了使这更容易,我使用了一个包含 x,y 坐标和数字标签的矩阵。
// coordinate matrix [x, y, label]
mat = [<MATRIX>];
// set line color and weight and the text size
Pen Color( "Gray" );
Pen Size( 1 );
Text Size( 8 );
// make the markers
Marker( Color State( "Gray" ), mat[0, 1], mat[0, 2] );
// make the labels using the matrix with some offsets and rounding
For( j = 1, j <= N Rows( mat ), j++,
If( Round( mat[j, 2], 1 ) < 0,
string = " -" || Char( Round( mat[j, 3] * 1, 2 ) ) || " ",
string = " " || Char( Round( mat[j, 3] * 1, 2 ) ) || " "
);
If(
Round( mat[j, 1], 1 ) <= 0 & Round( mat[j, 2], 1 ) > 0,
Text( Right Justified, {mat[j, 1], mat[j, 2] + 0.03}, string ),
Round( mat[j, 1], 1 ) > 0 & Round( mat[j, 2], 1 ) > 0 & mat[j, 3] <= 2,
Text( {mat[j, 1], mat[j, 2] + 0.03}, string ),
Round( mat[j, 1], 1 ) > 0 & Round( mat[j, 2], 1 ) < 0 & mat[j, 3] <= 2,
Text( {mat[j, 1], mat[j, 2] - 0.05}, string ),
Round( mat[j, 1], 1 ) <= 0 & Round( mat[j, 2], 1 ) < 0,
Text( Right Justified, {mat[j, 1], mat[j, 2] - 0.05}, string ),
Round( mat[j, 1], 1 ) <= 0 & Round( mat[j, 2], 1 ) == 0,
Text( Center Justified, {mat[j, 1], mat[j, 2] + 0.03}, string ),
Round( mat[j, 1], 1 ) > 0 & Round( mat[j, 2], 1 ) == 0 & mat[j, 3] <= 1.4,
Text( Center Justified, {mat[j, 1], mat[j, 2] + 0.03}, string )
);
);</MATRIX>
画线
一行使用命令线({,},{,}) 。在示例中,我将我的行与“勘误表”脚本中的其他一些片段放在一起:
// set line color and weight
Pen Color( "Gray" );
Pen Size( 1 );
// draw the line, circle, and center marker
Line( {-1, 0}, {1, 0} );
Circle( {0 / (1 + 0), 0}, 1 / (1 + 0) );
Marker( Color State( "red" ), {0, 0} );
将一切放在一起
使用半导体工具包的注释部分(它的作用与我们在这里所做的完全相同),将计算替换到现有代码中并使用应用程序生成器创建一个新应用程序(请始终回收您的代码,伙计们)是相当容易的!)。 自定义将应用到空白图形框作为预览。 当您对结果感到满意时,您可以单击注释按钮,将图形脚本复制到绘图的自定义中。

最后的想法
那么,我在这次小冒险中学到了什么? 第一——遵循事实;这包括问题的范围界定部分。 我最初的想法是完全错误的,但当我了解它有多么错误时,我正在收集获得正确解决方案所需的信息。 第二——不要害怕烧掉稻草人。 如果最初的想法行不通,不要害怕放弃它。 第三 – 我总是对定制可以做的事情感到惊讶。
这史密斯圆图生成器插件如果您想修改它,可以使用它。
作者的话
对于那些再次阅读本文的人,不,你没有疯,标题确实发生了一些变化。我收到了更新标题的请求,以便我们的搜索引擎更容易找到。我只能猜测这是因为有些搜索引擎是 19 世纪参考图书馆员的现代化身,没有幽默感。对于任何不便,我们深表歉意。-M
聚苯乙烯对于您可能遇到的任何“John Jacob Jingleheimer Schmit”耳虫,我们深表歉意。-M。
编者注:你读过吗我们的工程邮袋系列的其他部分? 了解 Mike 如何帮助正在使用的用户联合管理计划决定是否注册除雪服务并为 STEAM 教育项目开发独特的可视化效果。
图形生成器(
尺寸(466、456)、
显示控制面板( 0 ),
变量(X(:S11_r),Y(:S11_x)),
元素(点(X,Y,图例(7))),
发送至报告(
派遣(
{},
“S11_r”,
秤盒,
{最小值( -1 )、最大值( 1 )、增量( 0.5 )、小刻度( 1 )}
),
派遣(
{},
“S11_x”,
秤盒,
{最小值( -1 ), 最大值( 1 ), Inc( 0.2 ), 小刻度( 0 )}
),
派遣(
{},
“图表生成器”,
框架盒,
{添加图形脚本(
2、
Description( "Smith Chart" ), // 使用所需的步长和电阻范围制作圆列表
增量=0.2;
resCircs = {0, 0.33, 1, 2, 5};
// 设置线条颜色和粗细
笔颜色(“灰色”);
笔尺寸(1);
// 循环遍历电阻列表,计算并为每个电阻绘制一个圆
For( i = 1, i <= N 个项目( resCircs ), i++,
圆圈(
{resCircs[i] / (1 + resCircs[i]), 0},
1 / (1 + resCircs[i])
)
);
For( i = 1, i <= N 个项目( resCircs ), i++,
圆( {1, 1 / resCircs[i]}, 1 / resCircs[i] );
圆( {1, 1 / -resCircs[i]}, 1 / -resCircs[i] );
);
行( {-1, 0}, {1, 0} );
圆( {0, 0}, 1 );
标记(颜色状态(“红色”),{0.5,0});
)}
)
)
);