工程郵袋
第 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});
)}
)
)
);