titles plots mtext font r parametric-equations polar-coordinates

plots - Dibuja un corazón en R



text in r (8)

Posible duplicado:
Formas concéntricas sombreadas uniformemente con ecuación

¿Cómo podría trazar un corazón simétrico en R como trazo un círculo (usando plotrix) o un rectángulo?

Me gustaría tener un código para esto, así podría hacerlo por mi cuenta y poder generalizarlo para necesidades futuras similares. He visto tramas más elaboradas que esta, así que es bastante factible, es solo que no tengo el conocimiento para hacerlo.


Algunas variedades más:


Aquí hay un cardioide en 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()

Y la trama del corazón (vinculada por @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)


Este es un ejemplo de trazado de una "ecuación paramétrica", es decir, un emparejamiento de dos ecuaciones separadas para xey que comparten un parámetro común. Puede encontrar muchas curvas y formas comunes que se pueden escribir dentro de dicho marco.

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"))

Otras ecuaciones cardíacas paramétricas (e implícitas y polares)

También podría "calentarlo" utilizando la función "llenar" de la función de polygon :

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

Y si solo desea que los corazones pequeños salpiquen en varios lugares, puede usar la versión de la fuente Symbol de "corazón" después de mirar la página de help(points) y usar la función TestChars :

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

Los usuarios de Windows pueden querer ver si agregar el paquete de El Cairo ayuda a obtener acceso a los símbolos de la tarjeta, incluidos los "corazones". (Cuando probé la función TestChars en el "lado" de WinXP de mi MacPro, no conseguí corazones, y hojeé el símbolos "en MS-Word no descubrieron nada. Así que hice una búsqueda de Rhelp y encontré una publicación reciente de Ivo Welch. Estaba reportando un error, pero se ven bien en mi máquina.) Nota adicional ... Creo que los códigos de corazones y diamantes en su fueron invertidos.

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'') ) )


Hack simple y feo:

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


No sé nada sobre R, pero si trazas esta función obtendrás un corazón:

x^2+(y-(x^2)^(1/3))^2=1


Otra opción,

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 quieres ser más "maduro", prueba lo siguiente (publicado en R-help hace algunos años):

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) }


De una publicación de blog:

Resuelve la ecuación paramétrica para y (¿permite O el formateo matemático?)

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)