Problema
Ho voluto creare questa figura per una pubblicazione

Soluzione
Per creare le curve normali ombreggiate/riempite e troncate orientate verticalmente, ho utilizzato la funzione grafica Polygon().La sfida era riuscire a creare facilmente e ripetutamente quel poligono che fosse ridimensionato e posizionato in modo appropriato su un grafico.L'ho fatto usando questa funzione
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
)
);
); i primi due argomenti della funzione specificano "l'origine" o la posizione della distribuzione da tracciare (ovvero la posizione (x,y) per la base centrale della distribuzione).I secondi due argomenti facoltativi sono il ridimensionamento della dimensione delle distribuzioni.La dimensione predefinita si basa su una distribuzione normale standard e il ridimensionamento è relativo alla direzione x e alla direzione y.
Il risultato della funzione è un'espressione valutata utilizzata da uno script grafico per disegnare la distribuzione come un poligono.
esempi:
func_VNormalShape(1,3) crea l'istruzione del poligono per una distribuzione normale standard orientata verticalmente centrata su x=1, y=3.
func_VNormalShape(2,4, 0.5, 1.5) crea la distribuzione centrata su x=2, y=5, ma la larghezza orizzontale viene ridotta di un fattore 0,5 e la larghezza verticale viene ridotta di un fattore 1,5.
Discussione
Ecco lo script completo che crea parte della grafica complessiva.Ho salvato l'output di questo script come file immagine e poi l'ho importato in powerpoint per aggiungere alcune annotazioni e sono arrivato al grafico mostrato nella parte superiore del post
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)};output risultante:

Guarda anche
Volevo condividerlo di nuovo da solo, perché è stato davvero utile oggi quando l'ho tirato fuori per fare la mia figura.