Нарисуйте сердце в R

Возможный дубликат:
Гладко заштрихованные концентрические формы, управляемые уравнением

Как я могу нарисовать симметричное сердце в R, как я рисую круг (используя плотрикс) или прямоугольник?

Мне нужен код для этого, чтобы я мог сделать это для себя и иметь возможность обобщить это для аналогичных будущих потребностей. Я видел даже более сложные сюжеты, чем этот, так что это вполне выполнимо, просто мне не хватает знаний, чтобы сделать это.


person Tyler Rinker    schedule 10.11.2011    source источник
comment
До Дня святого Валентина еще 3 месяца, амур, должно быть, сильно тебя поразил.   -  person Johan    schedule 10.11.2011
comment
Не уверен насчет реализации в r, но вас, вероятно, заинтересует кардиополярное уравнение, и / или другие маршруты.   -  person Grant Thomas    schedule 10.11.2011
comment
Я использовал последнее уравнение на странице Wolfram по приведенной выше ссылке в качестве источника параметрического уравнения и просто рассчитал от 0 до > 2pi.   -  person IRTFM    schedule 10.11.2011
comment
Затененную версию см. здесь: stackoverflow.com/q/6542825/269476   -  person James    schedule 10.11.2011
comment
это не совсем точная копия, не так ли? просто есть несколько пересекающихся ответов...   -  person Ben Bolker    schedule 10.11.2011
comment
Я голосую за закрытие, но оно не должно быть удалено из-за отличных ответов и более подходящего для Google названия.   -  person joran    schedule 11.11.2011


Ответы (8)


Это пример построения «параметрического уравнения», то есть пары двух отдельных уравнений для x и y, которые имеют общий параметр. Вы можете найти много общих кривых и форм, которые могут быть написаны в рамках такой структуры.

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

Другие параметрические (а также неявные и полярные) уравнения сердца

Вы также можете «разогреть» его, используя возможность «заполнить» функции polygon:

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

И если вы просто хотите, чтобы маленькие сердечки были разбросаны по разным местам, вы можете использовать версию шрифта Symbol «heart» после просмотра страницы help(points) и использования функции TestChars:

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

введите здесь описание изображения

Пользователи Windows могут захотеть узнать, помогает ли добавление пакета Cairo получить доступ к символам карт, включая «сердца». (Когда я тестировал функцию TestChars на «стороне» WinXP моего MacPro, я не символов» в MS-Word ничего не обнаружил. Поэтому я провел поиск в Rhelp и нашел недавнее сообщение Иво Уэлча. Он сообщал об ошибке, но на моей машине они выглядят нормально.) Далее примечание... Я думаю, что коды сердец и бубнов в его поменялись местами.

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

введите здесь описание изображения

person IRTFM    schedule 10.11.2011
comment
На самом деле мне нужны маленькие символы, но pch 169 на моей машине — это символ авторского права ©. Что мне нужно сделать, чтобы сделать символ сердца с points(x,y, pch)? Я думаю, что это семейство шрифтов или что-то в этом роде, но я не уверен, как к этому подойти. - person Tyler Rinker; 10.11.2011
comment
Ссылки в моем комментарии (# 2) к ответу @ aL3xa могут быть полезны... - person Ben Bolker; 10.11.2011
comment
@Tyler Rinker: определите и запустите функцию TestChars(font=5) в конце примеров на странице справки (баллы). Он распечатает все глифы символов для вашей системы, которые проиндексированы десятичными числами: c(32:126, 160:254) - person IRTFM; 11.11.2011
comment
(+1) за разогрев - person Rich Scriven; 02.05.2014
comment
Очень красивая форма! - person Travis; 14.02.2020

Из сообщения в блоге:

Решите параметрическое уравнение для y (разрешает ли SO математическое форматирование?)

х ^ 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)

введите здесь описание изображения

person Ben Bolker    schedule 10.11.2011
comment
справедливо. Знаете ли вы простой способ создания MathML? (Меня балует CrossValidated, который автоматически рендерит LaTeX... - person Ben Bolker; 15.02.2020
comment
tex. stackexchange.com/questions/227195/ - person Ben Bolker; 15.02.2020
comment
Похоже, я был неправ. Вот обсуждение MetaSO того, почему MathJax не будет включен: должен-быть-включен-на?r=SearchResults&s=1|0.0000" title="нет серьезной причины, по которой латексную разметку через mathjax не следует включать">meta.stackoverflow.com/questions/252282/ Похоже, что дополнительные полсекунды для загрузки не считаются полезными для тех из нас, кто использует языки более высокого уровня, где это имеет смысл. C-пользователи решают все. - person IRTFM; 15.02.2020
comment
Может (?) Можно ли встроить MathJax вручную? stackoverflow.com/questions/5865522/ - person Ben Bolker; 15.02.2020

Простой и уродливый хак:

plot(1, 1, pch = "♥", cex = 20, xlab = "", ylab = "", col = "firebrick3")
person aL3xa    schedule 10.11.2011
comment
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я прекрасно понимаю, что это не то, что вам нужно, и мне бы очень хотелось увидеть код, который вы искали. знак равно - person aL3xa; 10.11.2011
comment
Но на самом деле это может быть очень хорошей отправной точкой, если кто-то хочет использовать сердца в качестве символов построения: см. stackoverflow.com/questions/5886018/ и fileformat.info/info/unicode/char/ - person Ben Bolker; 10.11.2011
comment
Но если ходит как сердце и крякает как сердце, то это должно быть сердце. :) - person Roman Luštrik; 10.11.2011
comment
@ aL3xa Ваш — тот, который на самом деле выглядит наиболее многообещающим для моих грубых потребностей (здесь много отличных постов). Проблема в том, что pch = "♥" у меня не работает. R преобразует его в ?. Я пользователь Windows 7, так что это может быть причиной. Я могу использовать всевозможные сумасшедшие числовые значения для pch, но еще не нашел сердце, которое вы использовали. Также любые указатели/ресурсы о том, как определить, какое число соответствует какому символу с pch, были бы потрясающими. Как правило, ресурсы, которые я видел, имеют только несколько символов, соответствующих числам. Я знаю, что их сотни. - person Tyler Rinker; 10.11.2011
comment
@Tyler Rinker: я добавил решение pch со страницы справки (баллы). Должно работать, если у вас есть шрифт Symbol в вашей библиотеке pdf-шрифтов. - person IRTFM; 10.11.2011
comment
Использование значений Unicode для pch работает. Я многое узнал о символах и только что открыл целый набор новых трюков с использованием Unicode. plot(1, 1, pch = -0x2665L, cex = 20, xlab = "", ylab = "", col = "firebrick3") - person Tyler Rinker; 10.11.2011
comment
В качестве дополнительного примечания мужские и женские символы (хотя это было доступно только для пользователей S) также доступны через Unicode, используя: points(1,1, pch=-0x2642L, cex = 20, col = "firebrick3") & points(1,1, pch=-0x2642L, cex = 20, col = "firebrick3") Это может быть полезно. - person Tyler Rinker; 10.11.2011
comment
См. материал Unicode здесь: fileformat.info/info/unicode/char/2665 /index.htm И, честно говоря, я думаю, что @DWin заслужил галочку. Мой ответ не включает ни одной строчки математики. знак равно - person aL3xa; 10.11.2011
comment
@ aL3xa Да, этому было трудно отдать должное, потому что все они были потрясающими ответами. Тот, который лучше всего отвечал моим потребностям, был более простой версией графических символов. Я не понимал этого, пока ты не представил это. По вашей просьбе я назначил DWin чек. - person Tyler Rinker; 10.11.2011
comment
@TylerRinker, это дух! Кроме того, он разместил большее сердце! знак равно - person aL3xa; 11.11.2011
comment
Я думаю, что, возможно, придумал подход, специфичный для Windows. Это не будет аргумент pch, но вы можете использовать text(x,y, heart, col="red") вместо points(x,y,pch). - person IRTFM; 11.11.2011

Вот кардиоида в 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()

введите здесь описание изображения

И сюжет сердца (связанный @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)

введите здесь описание изображения

person Andrie    schedule 10.11.2011

Другой вариант,

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    
person baptiste    schedule 10.11.2011
comment
Искусство ASCII такое ретро. - person IRTFM; 02.05.2014

Если вы хотите быть более «зрелым», попробуйте следующее (опубликовано в R-help несколько лет назад):

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)  
}
person Carl Witthoft    schedule 10.11.2011
comment
Этот код произвел ошибку для меня. - person MYaseen208; 10.11.2011
comment
@MYaseen208: Возможно, я пропустил символ при вырезании/вставке. Оригинальный код, безусловно, работает. Какую ошибку вы получили? - person Carl Witthoft; 10.11.2011

Еще несколько сортов:

уравнения

person Mihai Rotaru    schedule 10.11.2011
comment
Я не отрицал это, но я думаю, что за это проголосовали, потому что это не более чем ссылка на набор параметрических уравнений, которые связаны (прямо или косвенно) несколькими другими ответами здесь. - person Ben Bolker; 11.11.2011

Я ничего не знаю о R, но если вы построите эту функцию, вы получите сердце:

x^2+(y-(x^2)^(1/3))^2=1
person Dimme    schedule 10.11.2011