39 votes

Tracer un cœur en R

Possible Duplicate:
Formes concentriques ombragées en douceur, générées par équation

Comment pourrais-je tracer un cœur symétrique en R comme je trace un cercle (en utilisant plotrix) ou un rectangle?

J'aimerais avoir le code pour cela afin de pouvoir le faire moi-même et de pouvoir généraliser cela à des besoins futurs similaires. J'ai vu des tracés encore plus élaborés que cela donc c'est tout à fait faisable, c'est juste que je manque de connaissance pour le faire.

32 votes

La Saint-Valentin est encore à 3 mois, Cupidon a dû te frapper vraiment fort.

6 votes

Pas sûr de l'implémentation en r, mais vous serez probablement intéressé par l'équation polaire de la cardioïde, et / ou d'autres routes.

0 votes

J'ai utilisé la dernière équation sur la page Wolfram dans le lien ci-dessus comme source de l'équation paramétrique et ai simplement calculé sur 0 -> 2pi.

86voto

BondedDust Points 105234

Ceci est un exemple de traçage d'une "équation paramétrique", c'est-à-dire un couplage de deux équations distinctes pour x et y qui partagent un paramètre commun. Vous pouvez trouver de nombreuses courbes et formes courantes qui peuvent être écrites dans un tel cadre.

dat <- data.frame(t = seq(0, 2*pi, by = 0.1))
xhrt <- function(t) 16*sin(t)^3
yhrt <- function(t) 13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)
dat$y = yhrt(dat$t)
dat$x = xhrt(dat$t)
with(dat, plot(x, y, type = "l"))

Autres équations paramétriques (et implicites et polaires) de cœur

Vous pouvez également "chauffer" les choses en utilisant la fonction "remplissage" de la fonction polygon :

with(dat, polygon(x, y, col = "hotpink"))

Et si vous voulez juste de petits cœurs à saupoudrer à divers endroits, vous pouvez utiliser la version de police Symbol du "cœur" après avoir consulté la page d'aide de points et utilisé la fonction TestChars :

points(c(10, -10, -15, 15), c(-10, -10, 10, 10), pch = 169, font = 5)

description de l'image

Les utilisateurs de Windows peuvent essayer d'ajouter le package Cairo pour accéder aux symboles de cartes, y compris les "cœurs".( Lorsque j'ai testé la fonction TestChars sur le côté WinXP de mon MacPro je n'ai pas obtenu de cœurs, et le défilement des "symboles spéciaux" dans MS-Word n'a rien révélé. J'ai donc fait une recherche sur Rhelp et trouvé un message récent de Ivo Welch. Il signalait un bug, mais ils semblent corrects sur ma machine.) Note supplémentaire... je pense que les codes des cœurs et des carreaux dans son message étaient inversés.

library(Cairo)

clubs <- expression(symbol('\247'))
hearts <- expression(symbol('\251'))
diamonds <- expression(symbol('\250'))
spades <- expression(symbol('\252'))
csymbols <- c(clubs, hearts, diamonds, spades)

plot(0, xlim = c(0, 5), ylim = c(0, 2), type = "n")
clr <- c("black", "red", "red", "black")
for (i in 1:4) {
  hline <- function(yloc, ...) 
         for (i in 1:length(yloc)) 
             lines(c(-1, 6), c(yloc[i], yloc[i]), col = "gray")  
              hline(0.9); 
                hline(1.0);
                hline(1.1);
                hline(1.2)  
 text(i, 1, csymbols[i], col = clr[i], cex = 5)  
 text(i, 0.5, csymbols[i], col = clr[i])
}

# Essayez aussi ceci
plot(1, 1)
text(x = 1 + 0.2 * cos(seq(0, 2*pi, by = .5)), 
     y = 1 + 0.2 * sin(seq(0, 2*pi, by = .5)), 
     expression(symbol('\251')))

description de l'image

0 votes

Je veux en fait utiliser les petits symboles mais pch 169 sur ma machine est le symbole de copyright "©". Que dois-je faire pour obtenir un symbole de cœur avec points(x, y, pch)? Je pense que c'est une question de famille de police de caractères ou quelque chose comme ça mais je ne sais pas trop comment m'y prendre.

0 votes

Les liens dans mon commentaire (#2) sur la réponse de @aL3xa pourraient être utiles ...

0 votes

@Tyler Rinker: Définissez et exécutez la fonction TestChars(font=5) à la fin des exemples de la page d'aide (points). Elle affichera tous les glyphes Symbol pour votre système qui sont indexés par les nombres décimaux : c(32:126, 160:254)

18voto

Ben Bolker Points 50041

D'un article de blog :

Résoudre l'équation paramétrique pour y (est-ce que SO autorise la mise en forme mathématique ?)

x^2 + (5y/4-sqrt(abs(x)))^2 = 1

sqrt(1-x^2) = 5y/4 - sqrt(abs(x))

y = 4/5*(sqrt(1-x^2)+sqrt(abs(x)))

MASS::eqscplot(0:1,0:1,type="n",xlim=c(-1,1),ylim=c(-0.8,1.5))
curve(4/5*sqrt(1-x^2)+sqrt(abs(x)),from=-1,to=1,add=TRUE,col=2)
curve(4/5*-sqrt(1-x^2)+sqrt(abs(x)),from=-1,to=1,add=TRUE,col=2)

description de l'image ici

0 votes

D'accord. Savez-vous un moyen facile de générer du MathML? (Je suis gâté par CrossValidated, qui rend automatiquement le LaTeX ...

0 votes

1 votes

Il semble que j'avais tort. Voici la discussion MetaSO sur la raison pour laquelle MathJax ne sera pas activé : meta.stackoverflow.com/questions/252282/… Il semble que le demi-seconde supplémentaire de chargement n'est pas considérée comme intéressante pour ceux d'entre nous qui utilisons des langages de haut niveau où cela a du sens. Ce sont les utilisateurs de C qui décident.

17voto

aL3xa Points 10236

Simple et vilain hack :

plot(1, 1, pch = "♥", cex = 20, xlab = "", ylab = "", col = "firebrick3")

1 votes

AVERTISSEMENT: Je suis parfaitement conscient du fait que ce n'est pas ce que vous voulez, et j'aimerais vraiment voir le code réel que vous cherchiez. =)

2 votes

Mais cela pourrait en fait être un très bon point de départ si l'on voulait utiliser des cœurs comme caractères de tracé : voir stackoverflow.com/questions/5886018/...; et fileformat.info/info/unicode/char/...;

5 votes

Mais s'il se promène comme un cœur et cancane comme un cœur, il doit être un cœur. :)

11voto

Andrie Points 66979

Voici un cardioïde dans ggplot :

library(ggplot2)

dat <- data.frame(x=seq(0, 2*pi, length.out=100))
cardioid <- function(x, a=1)a*(1-cos(x))
ggplot(dat, aes(x=x)) + stat_function(fun=cardioid) + coord_polar()

entrer la description de l'image ici

Et le graphique du cœur (lié par @BenBolker) :

heart <- function(x)2-2*sin(x) + sin(x)*(sqrt(abs(cos(x))))/(sin(x)+1.4)
ggplot(dat, aes(x=x)) + stat_function(fun=heart) + coord_polar(start=-pi/2)

entrer la description de l'image ici

9voto

baptiste Points 19677

Une autre option,

xmin <- -5
xmax <- 10
n <- 1e3
xs<-seq(xmin,xmax,length=n)
ys<-seq(xmin,xmax,length=n)

f = function(x, y) (x^2+0.7*y^2-1)^3 - x^2*y^3
zs <- outer(xs,ys,FUN=f)

h <- contourLines(xs,ys,zs,levels=0)
library(txtplot)
with(h[[1]], txtplot(x, y))

     +---+-******----+----******-+---+
 1.5 + *****    **********     ***** +
   1 +**                           * +
 0.5 +**                           * +
     | ***                       *** |
   0 +   ****                 ****   +
-0.5 +      *****         *****      +
  -1 +          ***********          +
     +---+-----+-----*-----+-----+---+
        -1   -0.5    0    0.5    1

4 votes

L'art ASCII est tellement rétro.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X