web-dev-qa-db-fra.com

fonctions de tracé avec symboles de point remplis et légende

Je veux tracer deux fonctions dans des couleurs et des styles de points différents avec une légende correspondante, en clair R.

J'ai plusieurs questions:

  1. J'utilise pch=21 Et pch=22. Je crois comprendre que ce sont des symboles "remplis". Ils apparaissent remplis comme prévu dans la légende, mais ils apparaissent creux sur le graphique lui-même. Qu'est-ce qui ne va pas?

  2. Puis-je obtenir plus d'espace entre les points sans spécifier manuellement une grille? peut-être en sélectionnant le nombre de points à imprimer?

  3. N'hésitez pas à ajouter tout type de conseil que vous souhaitez. Je suis très nouveau dans R. En particulier, existe-t-il une meilleure façon de tracer deux fonctions? par exemple. en définissant des vecteurs de fonctions? et n'y aurait-il pas un moyen de générer automatiquement la légende sans avoir à spécifier de couleurs et de formes, en R simple?

Voici mon code:

par(new=TRUE)
p1 <- plot(function(x){ x^(2)/2 }
       , 0, 100
       , xlab = "x"
       , ylab = "y"
       , ylim = c(0,5000)
       , las = 1
       , type = "p"
       , cex = 0.8
       , pch = 21
       , col = "red"
)
par(new=TRUE)
p2 <- plot(function(x){ (1-x^(2))/2 }
       , 0, 100
       , xlab = ""
       , ylab = ""
       , axes = FALSE
       , type = "p"
       , cex = 0.8
       , pch = 22
       , col = "blue"
)
par(new=TRUE)
l <- legend( "topleft"
         , inset = c(0,0.4) 
         , cex = 1.5
         , bty = "n"
         , legend = c("A", "B")
         , text.col = c("red", "blue")
         , pt.bg = c("red","blue")
         , pch = c(21,22)
)

Après diverses explorations, j'ai choisi d'utiliser la par(new=TRUE) "astuce" pour superposer les deux fonctions (plutôt que, par exemple, en utilisant matplot ou une combinaison de tracé et de points ou de disposition). Était-ce une mauvaise décision pour commencer? (Edit: oui, très mauvais, voir ci-dessous) +1 si vous ne me demandez pas de lire le manuel ;-)

enter image description here

Modifier: Résumé des solutions

Grâce à joran et Didzis Elferts, j'ai pu trouver une solution à plusieurs de mes problèmes. Pour mémoire, je voudrais résumer ici:

  1. Pour obtenir des symboles remplis sur le graphique, vous devez spécifier à la fois col (couleur) et bg (arrière-plan). Cela est vrai même pour pch=21 Et pch=22, Qui ne sont pas automatiquement remplis par la couleur spécifiée. Pour obtenir des symboles remplis dans la légende, vous devez spécifier à la fois col et pt.bg. Ici, bg seul n'est pas suffisant.

  2. c'est une très mauvaise idée d'utiliser par(new=TRUE) avec axes=FALSE, comme je l'avais fait initialement, car les tracés superposés n'utilisent pas nécessairement le même système de coordonnées. La fonction prévue pour le deuxième tracé était (100^2-x^2)/2 Mais j'ai par inadvertance écrit (1-x^2)/2 Et je ne l'ai pas réalisé car j'avais défini axes = FALSE.

Dans l'ensemble, voici ma solution préférée:

curve( x^2/2
  , from = 0
  , to = 100
  , n = 30
  , type = "p"
  , pch = 21 # alternatively pch=15 is a solid symbol
  , col = "red" # colors the outline of hollow symbol pch=21
  , bg = "red" # fills hollow symbol pch=21 with color
  , xlab = "x"
  , ylab = "y"
)
curve( (100^2-x^2)/2
  , from = 0
  , to = 100
  , n = 30
  , type = "p"
  , pch = 22  # alternative pch=16
  , col = "blue"
  , bg = "blue"
  , add = TRUE
)
legend( "topleft"
  , inset = c(0,0.4), 
  , cex = 1.5, 
  , bty = "n", 
  , legend = c("A", "B"), 
  , text.col = c("red", "blue"),
  , col = c("red", "blue"), 
  , pt.bg = c("red","blue")
  , pch = c(21,22)
)

Cela donne un complot comme celui montré par joran. Merci beaucoup à vous deux pour votre aide.

27
PatrickT

Je pense que vous auriez peut-être plus de chance en utilisant curve:

curve(x^(2) / 2,from = 0,to = 100,col = 'red',type = 'p',pch = 16,n = 20)
curve((1-x^(2))/2 + 5000,from = 0,to = 100,col = 'blue',type = 'p',pch = 15,add = TRUE,n = 20)
legend("topleft", 
        inset = c(0,0.4), 
        cex = 1.5, 
        bty = "n", 
        legend = c("A", "B"), 
        text.col = c("red", "blue"),
        col = c("red", "blue"), 
        pch = c(16,15))

enter image description here

Notez que j'ai dû légèrement modifier vos fonctions pour obtenir une sortie correspondant à votre image.

Pour éviter de spécifier la couleur et de remplir séparément (ce qui est généralement la façon dont les choses se font dans R), j'ai utilisé d'anciens symboles "hérités". L'utilisation de curve est souvent beaucoup plus simple pour tracer des fonctions ou des expressions. Cela vous donne également un moyen plus pratique de spécifier la grille de points à évaluer. Il a également un argument add qui vous permet d'ignorer le piratage maladroit par dans lequel vous vous êtes engagé.

8
joran

Vous devez ajouter l'argument bg="red" Ou bg="blue" Dans plot() pour obtenir les symboles remplis avec une couleur particulière.

7
Didzis Elferts