La bolsa de correo de ingeniería
Episodio 3: John Jacob Jingleheimer… ¡Gráficos de Smith!
De vez en cuando, los ingenieros de sistemas nos topamos con preguntas interesantes que en cierto modo quedarían fuera del rango típico de JMP uso. Estas aplicaciones son generalmente inteligentes y muchas veces demuestran que el uso de datos no es sólo para problemas técnicos o comerciales. Otras veces, las preguntas son simplemente problemas inesperados y desafiantes. Yo las llamo "bolas curvas".
Me encanta una buena bola curva.
Quería compartir este en particular por un par de razones. Primero, es un ejemplo de cómo reutilizar las personalizaciones de gráficos para alcanzar un objetivo. Y, en segundo lugar, voy a ilustrar el proceso de pensamiento por el que paso cuando resuelvo problemas usando JMP . En definitiva, este es uno de esos casos en los que el camino es mucho más instructivo que el resultado. Entonces, sin más matizaciones, a continuación se muestra un ejemplo de una bola curva realmente buena de otro colega del estado de Nueva York que pensé que sería divertido compartir.
…Y para que conste, Nick, ¡¡esta no fue una “pregunta rápida"!! ;D
La pregunta
Mike [JMP],Pregunta rápida: ¿sabe si existe un complemento o un script para JMP para trazar tipos de gráficos de coordenadas polares? Es decir, buscar hacer trazados de contorno en un diagrama de Smith, ejemplo pegado a continuación, para algunos análisis de impedancia de RF.... Podemos vivir con la conversión a coordenadas rectangulares por ahora, pero pensamos que valía la pena preguntar si lo ha visto antes o si conoce a alguien en JMP que pueda ayudar.


Plantilla de gráfico de Smith: ¿hay alguna manera de trazar dos campos de datos (valores de coordenadas reales e imaginarios) en un gráfico de Smith?
Encontré un ejemplo de trazado de contorno en Google. Parece algo que JMP podría hacer...
Gracias,
Nick [Usuario]
Mi respuesta:
Hola, Nick,¿Puedes compartir los datos que has utilizado para hacer ese trazado de contorno?
I podría Ser capaz de crear un archivo de forma que se ajuste a la necesidad de superponer la cuadrícula sobre los datos. (No hay promesas, pero necesitaría los datos para verificar si lo hice correctamente).
Mejor,
METRO
¿Qué diablos es un gráfico de Smith?
Eso es exactamente lo que estaba pensando cuando vi esta pregunta. Para ser honesto, había visto las preguntas que mencionó en la Comunidad. Eché un vistazo a la pregunta de la comunidad y pensé: “No. Eso es para otra persona”. Al parecer, la vida tenía otras ideas. Entonces, debidamente castigado, comencé a descubrir cuáles eran esas conspiraciones. Es una lectura bastante interesante, pero para ser honesto, los detalles esenciales realmente no importan para esta discusión.
En un nivel alto, un diagrama de Smith es una versión del diagrama de coordenadas polares utilizado en ingeniería eléctrica. ( Eso tenía sentido para mí. ) También resulta que están hechos de círculos superpuestos y arcos de círculo donde el radio de un círculo dado está relacionado con cantidades físicas medidas. ( Nuevamente, no hay problema, particularmente porque un amable profesor había publicado sus notas de clase en su sitio web, que incluían las ecuaciones necesarias para relacionar las cantidades físicas con los radios de los círculos. ) Además, es bastante común que las personas que trabajan con estas cosas conviertan los datos del sistema de coordenadas polares (puntos de datos trazados en radio y ángulo) a un sistema cartesiano (puntos de datos trazados en x e y) para facilitar el trazado.
El proceso de desarrollo
Cuando terminé mi investigación, descubrí que de alguna manera necesitaba construir un grupo de círculos con radios específicos, y necesitaba que esos radios coincidieran con un conjunto de datos proporcionado por el usuario. Cuanto más pensaba en esto, menos parecía encajar bien mi idea inicial de crear un archivo de forma para Graph Builder. Esto fue validado aún más por un colega que pensó que sería problemático. ¿Pero por qué? Bueno, en primer lugar, los datos tendrían que reescalarse a la misma escala que el sistema de coordenadas del archivo de forma. Incluso con documentación detallada, esto parecía ser un campo minado de problemas. En última instancia, habría requerido que creara un complemento completamente autónomo que escalara todo detrás de escena o que creara el archivo de forma, lo arrojara por encima de la valla y esperara que se ejecutara sin problemas. No estaba entusiasmado con ninguna de esas opciones. En segundo lugar, tendría que descubrir cómo configurar esos arcos para que comiencen y terminen correctamente en las intersecciones con los círculos. No es una tarea fácil.
La evidencia indicó que tuve que desechar mi idea inicial, ¡antes incluso de tener los datos que pedí! ¿A dónde iría desde aquí? ¡De regreso al principio! Comencé con una simple línea de preguntas para reformular mi problema.
- ¿Puedo trazar los datos? Sí, como puedo esperar que los usuarios conviertan los datos a coordenadas cartesianas, puedo usar una de las plataformas estándar (Graph Builder o Contour Plot) para generar un gráfico de los datos.
- ¿Qué debo hacer con la trama para convertirla en un diagrama de Smith?Necesito crear una serie de círculos, arcos y líneas y etiquetarlos.
- ¿Cómo dibujo todo eso?Tengo dos opciones. Graph Builder me permitiría usar archivos de forma, pero ya eliminamos esa opción. Un archivo de forma tampoco me permitiría usar etiquetas de texto fácilmente. Se podrían utilizar scripts de gráficos para anotar la trama existente, pero eso requeriría scripts que podrían resultar intimidantes para el usuario.
- ¿Qué pasaría si creara un pequeño complemento que hiciera la anotación?Cuanto más de cerca miraba este problema, más me daba cuenta de que esa era la dirección que debía tomar. Pero también me di cuenta de que si me comprometía a crear un complemento, podría reciclar una gran cantidad de código de soporte de mi versión más reciente del Semiconductor Tool Kit.(¡Guarden siempre su código, niños!)
Guiones gráficos
Abra un gráfico en JMP, cualquier gráfico 2D... Continúe, esperaré...
¿Listo?
¡Bien! Haga clic derecho en el área del gráfico y mire hacia la parte inferior. ¿Ves la opción "Personalizar..."? ¿Alguna vez has explorado esa opción? La mayoría de la gente no lo ha hecho. Espero que eso comience a cambiar debido a JMP 14 ( Mapa de límites ), pero hasta ahora, no creo que haya sido un área de uso muy común en JMP. Lo cual es una lástima, porque puedes hacer mucho con las personalizaciones. Y resulta que un gráfico Smith es realmente fácil de crear agregando scripts gráficos a las personalizaciones de un gráfico.Ahora, algunos de ustedes probablemente habrán empezado a sudar frío porque usé la “palabra mierda” – no, no eso espada – Quise decir "guiones". Pero recuerde, todo lo que necesitamos son círculos, una línea y etiquetas, y son fáciles de escribir. También agregaré una forma para crear una máscara alrededor de los bits que no necesitamos y para que las etiquetas sean más fáciles de ver. Así es como hacemos cada uno de ellos, como se ve en el cuadro de Smith a continuación.
Graficar los datos
Los scripts de gráficos primero necesitan un gráfico. Entonces, el paso 1 (como debería siempre ser el caso) es graficar los datos. En este caso, utilicé una fórmula suavizada en un gráfico de contorno (más sobre ese pequeño flujo de trabajo aquí: Todos los mapas de obleas son incorrectos: una aventura en la visualización de datos de semiconductores ). Desde allí, abre las personalizaciones del gráfico.Para agregar un script de gráficos a las personalizaciones, simplemente presione el botón “+” en la lista de capas de la izquierda. Esto le brinda una nueva entrada en la pila y un campo de secuencia de comandos en blanco a la derecha. Puedes nombrar el guión, si lo deseas, haciendo doble clic en el título (te recomiendo que lo hagas, es simplemente una buena organización). Hay algunas plantillas y ejemplos que puedes explorar en los menús desplegables encima del campo de secuencias de comandos con los que puedes jugar para obtener ideas. El orden en que aparecen las capas en la pila determina lo que está encima. Las capas en la parte inferior están más cerca de su globo ocular (nota: esto es hacia atrás ¡De lo que hace la mayoría del software de artes gráficas!) Por último, mientras uso algunos de los Graphics Scripts, hay otros. Se pueden encontrar en el grupo Gráficos de la guía de secuencias de comandos (en JMP - Ayuda > Guía de secuencias de comandos). Seleccione la categoría Funciones para que sea más fácil de encontrar).
Dibujar círculos
Los círculos usan el Círculo({,},) comando en un script de gráficos. Este es el guión que utilicé para los círculos con sus centros en la línea y = 0 en el ejemplo (el texto verde describe lo que hace cada parte).
// 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]) )
);
El código para los arcos en realidad también son círculos. (Recuerde, un arco es solo una porción de un círculo). La diferencia está simplemente en cómo se calculan el centro y el radio. También se crean dos círculos por cada entrada de la lista: uno para la curva positiva y otro para la curva negativa.
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] );
);
A continuación, crearé una forma para enmascarar las partes de los círculos que no necesito.
Dibujar formas irregulares (polígonos)
Las formas irregulares utilizan el Polígono([],[]) dominio. También puedes definir la ubicación de cada vértice usando una notación {x,y}, pero fue complicado trabajar con eso. El código se ve así (con las matrices eliminadas para facilitar la lectura):
// define the fill color
Fill Color( "white" );
// define the polygon using matrices
Polygon([… xmatrix…],[…ymatrix…]);
Las coordenadas omitidas definen un cuadrado con un círculo extraído del centro del mismo tamaño que el círculo más grande centrado en la línea y = 0. Colocar la secuencia de comandos poligonal debajo de las secuencias de comandos circulares (es decir, más cerca de la parte superior de la pila) enmascara las partes de los círculos que no son necesarias para el diagrama de Smith.
Marcadores de dibujo y texto
Los marcadores (puntos de datos) usan el comando Marcador( Estado de color(), [], []) . El argumento Estado del color es opcional pero le permite controlar los colores del marcador independientemente de cualquier otra secuencia de comandos. Poner etiquetas de texto en un gráfico utiliza Texto(, {,}, ) . El argumento de justificación es opcional y la ubicación {x,y} es para el centro del campo de texto. En el ejemplo, las coordenadas son las mismas entre los marcadores y el texto y simplemente incorporé algunos desplazamientos y ajustes de justificación para alinear las cosas correctamente (lo que dio lugar a esa complicada declaración if al final). Para hacerlo más fácil, utilicé una única matriz que contenía las coordenadas x,y y la etiqueta como un número.
// 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>
Líneas de dibujo
Una línea usa el comando. Línea({,},{,}) .En el ejemplo, puse mi línea con algunos otros fragmentos en el guión de "Errata":
// 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} );
Poniendo todo junto
Usando la parte Anotar del Kit de herramientas de semiconductores (que hace exactamente lo mismo que estamos haciendo aquí), fue bastante fácil sustituir los cálculos en el código existente y crear una nueva aplicación usando el Generador de aplicaciones (siempre recicle su código, amigos). !). Las personalizaciones se aplican a un cuadro de gráfico en blanco como vista previa. Cuando esté satisfecho con los resultados, puede hacer clic en el botón Anotar que copiará los scripts de gráficos en las personalizaciones de sus gráficos.

Pensamientos finales
Entonces, ¿qué aprendí en esta pequeña aventura? Primero – siga los hechos; esto incluye la parte de alcance de un problema. Mi idea original era totalmente errónea, pero mientras aprendía lo errónea que era, estaba recopilando la información necesaria para encontrar una solución adecuada. Segundo, no tengas miedo de quemar al hombre de paja. No tengas miedo de abandonar tu concepto inicial si no va a funcionar. En tercer lugar, me sorprende constantemente lo mucho que se puede hacer con las personalizaciones.
El Complemento del generador de gráficos Smith está disponible si quieres jugar con él.
Una nota del autor
Para aquellos que lean esto nuevamente, no, no están locos, el título cambió un poco.Recibí una solicitud para actualizar el título para que fuera más fácil de encontrar para nuestros motores de búsqueda.Sólo puedo suponer que esto se debe a que algunos motores de búsqueda son encarnaciones modernas de bibliotecarios de referencia del siglo XIX sin sentido del humor.Disculpas por cualquier inconveniente.-METRO
PDMis más sinceras disculpas por cualquier problema de “John Jacob Jingleheimer Schmit” que pueda estar experimentando.-METRO.
Nota del editor: ¿Has leído el otras entregas de nuestra serie Engineering Mailbag ? Vea cómo Mike ayuda a un usuario que estaba usando JMP para decidir si inscribirse en un servicio de remoción de nieve y desarrollar visualizaciones únicas para programas educativos STEAM.
Generador de gráficos(
Tamaño (466, 456),
Mostrar panel de control (0),
Variables (X (: S11_r), Y (: S11_x)),
Elementos (Puntos (X, Y, Leyenda (7))),
Enviar a informe (
Despacho(
{},
"T11_r",
caja de escala,
{Min( -1 ), Max( 1 ), Inc( 0.5 ), Tics menores ( 1 )}
),
Despacho(
{},
"T11_x",
caja de escala,
{Min( -1 ), Max( 1 ), Inc( 0.2 ), Tics menores ( 0 )}
),
Despacho(
{},
"Creador de gráficos",
caja de marco,
{Agregar secuencia de comandos de gráficos (
2,
Descripción ("Gráfico de Smith"), // crea una lista de círculos usando el paso deseado y el rango de resistencias
aum = 0,2;
resCircs = {0, 0,33, 1, 2, 5};
// establece el color y el grosor de la línea
Color de la pluma ("Gris");
Tamaño de la pluma (1);
// recorre la lista de resistencias, calcula y traza un círculo para cada una
Para (i = 1, i <= N elementos (resCircs), i++,
Círculo(
{resCircs[i] / (1 + resCircs[i]), 0},
1 / (1 + resCircs[i])
)
);
Para (i = 1, i <= N elementos (resCircs), i++,
Círculo( {1, 1 / resCircs[i]}, 1 / resCircs[i] );
Círculo( {1, 1 / -resCircs[i]}, 1 / -resCircs[i] );
);
Línea ({-1, 0}, {1, 0});
Círculo( {0, 0}, 1 );
Marcador (estado del color ("rojo"), {0,5, 0});
)}
)
)
);