Problema
Quería crear esta figura para una publicación.

Solución
Para crear las curvas normales sombreadas/rellenas y truncadas orientadas verticalmente, utilicé la función de gráficos Polygon().El desafío era poder crear fácilmente y repetidamente ese polígono que estaba escalado y ubicado apropiadamente en un gráfico.Hice esto usando esta función
func_VNormalShape = Function( // create a polygon that looks like a vertically oriented normal distribution
{_xloc, _yloc, _xscale = 1, _yscale = 1},
{_VNormShapeX, _VNormShapeY},
// create a vector of y values to use for plotting the shape
_VNormShapeY = ((_yloc - 3 * _yscale) :: (_yloc + 3 * _yscale) :: (_yscale / 10))`;
// create the filled polygon boundary points
_VNormShapeX = V Concat(
J( 61, 1, _xloc ),
_xloc + Sqrt( 2 * Pi() ) * _yscale * _xscale * Normal Density(
Sort Descending( _VNormShapeY ),
_yloc,
_yscale
)
);
_VNormShapeY = V Concat(
_VNormShapeY,
Sort Descending( _VNormShapeY )
);
// substitute into the Polygon(function) the two vectors with the boundary point X and Y values
// and evaluate the function
Eval(
Substitute(
Expr(
Polygon( Expr( shape_x ), Expr( shape_y ) )
),
Expr( shape_x ), _VNormShapeX,
Expr( shape_y ), _VNormShapeY
)
);
); los dos primeros argumentos de la función especifican el "origen" o la ubicación de la distribución que se dibujará (es decir, la posición (x,y) de la base central de la distribución).Los segundos dos argumentos opcionales son la escala del tamaño de las distribuciones.El tamaño predeterminado se basa en una distribución normal estándar y la escala es relativa a la dirección x y la dirección y.
El resultado de la función es una expresión evaluada que un script de gráficos usó para dibujar la distribución como un polígono.
ejemplos:
func_VNormalShape(1,3) crea la declaración de polígono para una distribución normal estándar orientada verticalmente centrada en x=1, y=3.
func_VNormalShape(2,4, 0.5, 1.5) crea la distribución centrada en x=2, y=5, pero el ancho horizontal se reduce en un factor de 0,5 y el ancho vertical se aumenta en un factor de 1,5.
Discusión
Aquí está el guión completo que crea parte del gráfico general.Guardé el resultado de este script como un archivo de imagen y luego lo importé a PowerPoint para agregar algunas anotaciones y llegué al gráfico que se muestra en la parte superior de la publicación.
names default to here(1);
func_VNormalShape = Function( // create a polygon that looks like a vertically oriented normal distribution
{_xloc, _yloc, _xscale = 1, _yscale = 1},
{_VNormShapeX, _VNormShapeY},
// create a vector of y values to use for plotting the shape
_VNormShapeY = ((_yloc - 3 * _yscale) :: (_yloc + 3 * _yscale) :: (_yscale / 10))`;
// create the filled polygon boundary points
_VNormShapeX = V Concat(
J( 61, 1, _xloc ),
_xloc + Sqrt( 2 * Pi() ) * _yscale * _xscale * Normal Density(
Sort Descending( _VNormShapeY ),
_yloc,
_yscale
)
);
_VNormShapeY = V Concat(
_VNormShapeY,
Sort Descending( _VNormShapeY )
);
// substitute into the Polygon(function) the two vectors with the boundary point X and Y values
// and evaluate the function
Eval(
Substitute(
Expr(
Polygon( Expr( shape_x ), Expr( shape_y ) )
),
Expr( shape_x ), _VNormShapeX,
Expr( shape_y ), _VNormShapeY
)
);
);
_nw=new window("Figure",
_ob=Outline Box("Figure",
_gb=Graph Box(
suppressaxes,
x scale(0,5),
y scale(-1,11),
Xname(""),
Yname(""),
fill color("gray");
func_VNormalShape(1, 8, .75, .75);
line({1,8}, {1.75, 8});
func_VNormalShape(2, 6, .75, .75);
line({2,6}, {2.75, 6});
func_VNormalShape(3, 4, .75, .75);
line({3,4}, {3.75, 4});
func_VNormalShape(4, 2, .75, .75);
line({4,2}, {4.75, 2});
linestyle(1);
Pen Size(2);
line({0.5, 5}, {4.5, 5});
)
)
);
_gb[FrameBox(1)]<<{top(0), bottom(0), left(0), right(0)};salida resultante:

Ver también
Quería volver a compartirlo solo, ya que fue muy útil hoy cuando lo saqué para hacer mi figura.