Duplicata possible:
Formes concentriques ombrées et pilotées par équation
Comment pourrais-je tracer un cœur symétrique en R comme je tracerais un cercle (en utilisant plotrix) ou un rectangle?
Je voudrais du code pour cela afin que je puisse le faire moi-même et pouvoir le généraliser à des besoins futurs similaires. J'ai vu des intrigues encore plus élaborées que cela, donc c'est assez faisable, c'est juste que je n'ai pas les connaissances pour le faire.
Ceci est un exemple de tracé d'une "équation paramétrique", c'est-à-dire un appariement 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 cardiaques paramétriques (et implicites et polaires)
Vous pouvez également "chauffer" en utilisant la fonction "fill" de la fonction polygon
:
with(dat, polygon(x,y, col="hotpink"))
Et si vous voulez juste que des petits coeurs saupoudrent à divers endroits, vous pouvez utiliser la version de police Symbol de "heart" après avoir regardé la page help(points)
et utilisé la fonction TestChars
:
points(c(10,-10, -15, 15), c(-10, -10, 10, 10), pch=169, font=5)
Les utilisateurs de Windows voudront peut-être voir si l'ajout du package Cairo permet d'accéder aux symboles de la carte, y compris les "cœurs" (lorsque j'ai testé la fonction TestChars sur le "côté" WinXP de mon MacPro, je n'ai pas eu de cœurs et j'ai paginé via le "spécial"). symboles "dans MS-Word n'a rien découvert. J'ai donc fait une recherche sur Rhelp et j'ai trouvé une publication récente par Ivo Welch. Il signalait un bug, mais ils ont l'air correct sur ma machine.) Note supplémentaire ... Je pense que le les codes des coeurs et des diamants é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] ) }
# Also try this
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') ) )
À partir d'un article de blog:
Résoudre l'équation paramétrique pour y (SO permet-il le formatage 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)
Piratage simple et laid:
plot(1, 1, pch = "♥", cex = 20, xlab = "", ylab = "", col = "firebrick3")
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()
Et l'intrigue du cœur (liée 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)
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
Si vous voulez être plus "mature", essayez ce qui suit (posté sur R-help il y a quelques années):
thong<-function(h = 9){
# set up plot
xrange=c(-15,15)
yrange=c(0,16)
plot(0,xlim=xrange,ylim=yrange,type='n')
# draw outer envelope
yr=seq(yrange[1],yrange[2],len=50)
offsetFn=function(y){2*sin(0+y/3)}
offset=offsetFn(yr)
leftE = function(y){-10-offsetFn(y)}
rightE = function(y){10+offsetFn(y)}
xp=c(leftE(yr),rev(rightE(yr)))
yp=c(yr,rev(yr))
polygon(xp,yp,col="#ffeecc",border=NA)
# feasible region upper limit:
# left and right defined by triple-log function:
xt=seq(0,rightE(h),len=100)
yt=log(1+log(1+log(xt+1)))
yt=yt-min(yt)
yt=h*yt/max(yt)
x=c(leftE(h),rightE(h),rev(xt),-xt)
y=c(h,h,rev(yt),yt)
polygon(x,y,col="red",border=NA)
}
Quelques autres variétés:
Je ne sais rien de R, mais si vous tracez cette fonction, vous obtiendrez un cœur:
x^2+(y-(x^2)^(1/3))^2=1