2011-11-10 6 views
34

Eventuali duplicati:
Equation-driven smoothly shaded concentric shapesPlot un cuore in R

Come potrei tracciare un cuore simmetrica in R come ho tracciare un cerchio (utilizzando plotrix) oppure un rettangolo?

Vorrei codice per questo in modo che potessi effettivamente farlo per me stesso e poter generalizzare questo a esigenze future simili. Ho visto trame ancora più elaborate di così è abbastanza fattibile, è solo che mi manca la conoscenza per farlo.

+29

Il giorno di san valentino è ancora 3 mesi, Cupido deve averti colpito abbastanza rd. – Johan

+6

Non sei sicuro dell'implementazione in 'r', ma probabilmente sarai interessato a [equazione polare polare] (http://mathworld.wolfram.com/Cardioid.html), e/o [altre vie] (http://mathworld.wolfram.com/HeartCurve.html). –

+0

Ho usato l'ultimo eqn nella pagina Wolfram nel link precedente come origine dell'eqn parametrico e appena calcolato su 0 -> 2pi. –

risposta

72

Questo è un esempio di disegno di una "equazione parametrica", cioè un accoppiamento di due equazioni separate per xey che condividono un parametro comune. È possibile trovare molte curve e forme comuni che possono essere scritte all'interno di tale framework.

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

Other Parametric (and implicit and polar) Heart Eqns

Si potrebbe anche "scaldarla" con l'utilizzo del "riempire" la capacità della funzione polygon:

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

E se si desidera solo cuoricini a cospargere intorno a in vari punti, è possibile utilizzare la versione del carattere Symbol di "heart" dopo aver esaminato la pagina help(points) e utilizzando la funzione TestChars:

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

enter image description here

utenti Windows potrebbero voler verificare se l'aggiunta del pacchetto di Cairo aiuta accesso guadagno simboli delle carte tra cui "cuori". (Quando ho provato la funzione VERCAR sul "lato" WinXP del mio MacPro ho fatto non ottenere cuori, e sfogliare i "simboli speciali" in MS-Word non ha scoperto nulla. Così ho fatto una ricerca su Rhelp e ho trovato un post recente di Ivo Welch. Stava segnalando un bug, ma hanno un bell'aspetto sulla mia macchina.) Ulteriori note ... Penso che i codici di cuori e diamanti fossero invertiti.

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

enter image description here

+0

In realtà voglio i piccoli simboli, ma pch 169 sulla mia macchina è il simbolo del copyright "©". Cosa dovrei fare per creare un simbolo del cuore con 'punti (x, y, pch)'? Sto pensando alla famiglia dei font o qualcosa del genere ma non sono sicuro di come avvicinarsi a questo. –

+0

I collegamenti nel mio commento (n. 2) sulla risposta di @ aL3xa potrebbero essere utili ... –

+0

@Tyler Rinker: definire ed eseguire la funzione 'TestChars (font = 5)' alla fine degli esempi sulla guida (punti) pagina. Stamperà tutti i glifi Simbolo per il tuo sistema che sono indicizzati dai numeri decimali: 'c (32: 126, 160: 254)' –

16

semplice e brutto hack:

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

DISCLAIMER: Sono perfettamente consapevole del fatto che questo non è quello che vuoi, e mi piacerebbe davvero vedere il codice che stavi cercando. =) – aL3xa

+2

Ma questo potrebbe essere davvero un buon punto di partenza se si volesse usare i cuori come caratteri di stampa: vedere http://stackoverflow.com/questions/5886018/using-unicode-dingbat-like-glyphs-in-r- grafica-attraverso-dispositivi-piattaforme-e e http://www.fileformat.info/info/unicode/char/search.htm?q=heart&preview=entity –

+5

Ma se cammina come un cuore e caga come un cuore, deve sii un cuore :) –

11

Ecco una cardioide in 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() 

enter image description here

E la trama cuore (legati da @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) 

enter image description here

17

From a blog post:

risolvere l'equazione parametrica per y (non SO permette formattazione matematica?)

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) 

enter image description here

4

Se si vuole essere più "maturo", prova quanto segue (pubblicato su R-help alcuni anni fa):

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

Questo codice ha prodotto un errore per me. – MYaseen208

+0

@ MYaseen208: potrei aver perso un carattere in copia/incolla. Il codice originale funziona sicuramente. Che errore hai ottenuto? –

7

Un'altra opzione,

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

L'arte ASCII è così retrò. –

6

Qualche più varietà:

equations

+0

Non l'ho sottovalutato, ma penso che sia stato downvoted perché non è altro che un collegamento a un insieme di equazioni parametriche che sono collegate (direttamente o indirettamente) da molte delle altre risposte qui. –

2

Io non so niente di R, ma se si traccia questa funzione si otterrà un cuore:

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