2017-07-29 3 views
1

Je me demande pourquoi polygon() fonctionne très bien avec une courbe à deux faces (photo du bas), mais ne fonctionne pas correctement avec une moitié de cette même courbe (image en haut)?Pourquoi le polygone dans R fonctionne-t-il avec une courbe complète mais pas avec une demi-courbe?

J'apprécie une courte explication.

par(mfrow = c(2, 1)) 

gg = curve(dnorm(x), -4, 0) # Not working! 
polygon(gg, col = 2) 

gg = curve(dnorm(x), -4, 4) # Working! 
polygon(gg, col = 2) 

enter image description here

Répondre

3

Un curve

Depuis le début polygon connecte et la fin de votre courbe, il crée une forme bizarre. De ?polygon nous pouvons voir que

"On suppose que le polygone doit être fermé en joignant le dernier point au premier point."

Les premiers et derniers points sont donnés par les valeurs from et to dans curve. Dans votre premier cas, ce sont -4 et 0.

Il suffit d'ajouter xlim et xaxs = "i" à curve()

gg = curve(dnorm(x), -4, 4, xlim = c(-4,0), xaxs = "i") # Working! 
polygon(gg, col = 2) 

enter image description here

plusieurs curve s dans une parcelle

Lorsque vous voulez mettre plusieurs courbes dans une parcelle, vous pourriez faire face au problème Vous ne pouvez pas limiter vos axes comme indiqué ci-dessus. Ainsi, nous devons creuser plus profondément dans la structure d'un objet courbe (ici gg).

Créons d'abord deux courbes.

gg = curve(dnorm(x), -4, 4) ; 
polygon(gg, col = 2) ; 
gg = curve(dnorm(x), -4, 0, xlim = c(-4,0), xaxs = "i", add = T) ; 

Maintenant, nous avons un oeil à gg:

gg 
# $x 
# [1] -4.00 -3.96 -3.92 -3.88 -3.84 -3.80 -3.76 -3.72 -3.68 -3.64 -3.60 -3.56 -3.52 -3.48 -3.44 -3.40 -3.36 -3.32 -3.28 
# [20] -3.24 -3.20 -3.16 -3.12 -3.08 -3.04 -3.00 -2.96 -2.92 -2.88 -2.84 -2.80 -2.76 -2.72 -2.68 -2.64 -2.60 -2.56 -2.52 
# ..... 
# $y 
# [1] 0.0001338302 0.0001569256 0.0001837125 0.0002147280 0.0002505784 0.0002919469 0.0003396012 0.0003944025 0.0004573148 
# [10] 0.0005294147 0.0006119019 0.0007061107 0.0008135212 0.0009357722 0.0010746733 0.0.0014106023 0.0016122275 
# ..... 

Nous voyons que gg est juste une liste de $x et $y coordonnées. Ainsi, nous pouvons ajouter une coordonnée au 0, 0 au second gg pour simuler la fin de la deuxième courbe qui se chevauche. Ensuite, les deux courbes sont tracées correctement.

gg$x <- c(gg$x, 0) 
gg$y <- c(gg$y, 0) 
polygon(gg, col = 4) 

enter image description here

1

Loki vous montre comment remplir la courbe que vous voulez, mais n'explique pas pourquoi la courbe moitié remplit comme il le fait, ce qui est important si vous cherchez à utiliser cette fonction aller de l'avant. Parce que vous donnez polygon() une seule ligne courbe, elle ferme les deux extrémités en dessinant une ligne droite pour les relier. Ensuite, il remplit les espaces entre la courbe et la nouvelle ligne.

La distribution complète augmente et descend au même point sur l'axe des ordonnées, créant ainsi une belle courbe assez remplie. En s'arrêtant en haut de la courbe, la ligne est tirée à travers les changements de direction en laissant des espaces ouverts entre la courbe et la ligne des deux côtés, ce qui les remplit tous les deux.

+0

Merci, une solution rapide à 'polygon()' (n'utilisant pas 'plot()') pour ne pas dessiner cette dernière ligne droite? Je suppose que vous avez la courbe recto-verso complète, alors vous décidez d'ombrer la queue gauche en utilisant la demi-courbe. – rnorouzian