用R给心仪的对象表白吧

简介

早上听完讲座才想起来,今天520了。那这样吧,小编给做了个小小的惊喜给读者们,年轻的盆友可以用这“小玩意”给自己心仪的对象表白了。

其实就是一个简单的ggplot绘制爱心,做一点细节处理,并加入相应文字啦!

如果有对象了(没有对象),你可以学学这个教程,举一反三。如果你想现在就拿去表白的话,直接复制节末完整代码即可。

教程

用R绘制爱心其实在网上有很多教程,小编主要参考使用ggplot2绘制心形,在此基础上进行稍微的调整。

加载相应的包,其中showtext包主要解决图片显示中文存在的问题,具体可见推文:

library(showtext) #中文问题
showtext.auto()
library(tidyverse) 
library(ggplot2)

之后构造数据集,并将x,y归一化后的结果存到a,b中。

d <- data_frame(t = seq(-pi, 0, .01),x1 = 16 * (sin(t)) ^ 2,x2 = -x1,y = 13 * cos(t) -5 * cos(2 * t) -2 * cos(3 * t) -cos(4 * t)) %>%gather(side, x, x1, x2)
a = (d$x - min(d$x))/(max(d$x) - min(d$x))
b = (d$y - min(d$y))/(max(d$y) - min(d$y))

接下来绘制爱心,主要使用geom_line()描述爱心边框,用geom_polygon()填充爱心内部颜色,后面的各个参数进行主题的变化。然后使用annotate()函数添加你想要的文字。最后可以使用ggsave()将其保存(我这里注释掉了)。整个图存到了g中,你可以在此将g输出即可得到对应的图片。

g = ggplot(data=d, aes(x=x, y=y)) +geom_line(aes(color=I('white'))) + #手动设置心形边框线颜色geom_polygon(aes(fill='red'), show.legend = F) + #填充心形并隐藏图例scale_x_continuous(labels = NULL) +scale_y_continuous(labels = NULL) +theme_bw() + #设定白色主题theme(panel.grid.major = element_blank(), #删除网格线panel.grid.minor = element_blank(), #删除网格线panel.border = element_blank(), #删除边框线axis.ticks = element_blank(), #删除刻度线axis.title = element_blank()) + #去除x和y的标签名annotate('text', x=median(a), y=median(b),label='脏茜茜的师妹',size=8,col='gray20') +annotate('text', x=median(a), y=median(b)-2.5,label='520快乐!',size=18,col='white') +annotate('text', x=median(a), y=median(b)-5,label='下个月3篇推送写好了没?',size=5,col='#eeb401')+annotate('text', x=median(a), y=median(b)-6.5,label='再不写推送就把你开了',size=4,col='white')
# ggsave('heart.png', plot = last_plot(), dpi = 300)

注:这里ggplot中的各个参数我在b站课程【R语言可视化教程】中大部分都有提过,对应教程文稿可在公众号后台输入【可视化文稿】免费获得。所以就不做更加具体的讲解了。

这时输出的图形是这样的:

为了使图形更加有特色,你可以在改图片上继续添加新的元素。小编在此折腾了一下,给大家打开一点思路:

加入玫瑰花

以前看到公众号【微生信生物】写过一篇用R制作玫瑰花的推送,主要参考链接。那我就站在巨人们的肩膀上进行拓展了,具体教程看R制作玫瑰花。我在这里将整个过程包装成了一个函数,方便使用。

library(tidyverse)
rose_plot = function(){f <- function(x) x^2 / 2f1 <- function(x) x^2/5geom_leaf <- function(x, xend, f, xoffset = 0, yoffset = 0, xflip = 1, yflip = 1, ...) {.x <- seq(x, xend, length.out = 100).y <- f(.x)df <- tibble(x = c(.x, .y), y = c(.y, .x))df$x <- xflip * df$x + xoffsetdf$y <- yflip * df$y + yoffsetgeom_polygon(aes(x = x, y = y), data = df, ...)}geom_rose <- function(n, mean = c(0, 0), ...) {.x <- mvtnorm::rmvnorm(n, mean)df <- tibble(x = .x[, 1], y = .x[, 2])list(stat_density_2d(aes(x = x, y = y, fill = stat(level)), data = df, geom = "polygon", show.legend = FALSE, color = "grey80"),scale_fill_gradient2(...))}p <- ggplot() + coord_equal(1, c(-4, 2), c(-7, 3)) +geom_curve(aes(x = -1, y = -7, xend = 0, yend = 0), ncp = 1000, curvature = -0.3, size = 1, color = "olivedrab3") +geom_leaf(0, 2, f, -1.6, -4.5, 1, fill = "olivedrab3", color = "palegreen") +geom_leaf(0, 2, f, -1.6, -5,  -1, fill = "olivedrab3", color = "palegreen") +geom_leaf(0, 2, f1, -1.25, -2.25,  -0.5, fill = "olivedrab3", color = "palegreen")+geom_leaf(0, 3, f1, -1.25, -2.25,  0.5, fill = "olivedrab3", color = "palegreen") +geom_rose(1000, mean = c(0, 0), low = "red", mid = "purple", high = "pink",midpoint = 0.075) +theme_void()return(p)
}

然后输出以下代码即可获得玫瑰花图

p = rose_plot()
p

之后将两个图形进行合并排版,这里使用patchwork包,如果你不是很了解这个包,可以看以前写的推文系列:

library(patchwork)
g + inset_element(p,0, 0.15, 1, 0.35
)

这时图片出来啦!

完整代码

#==============================================
#加载包
library(showtext) #中文问题
showtext.auto()
library(tidyverse) 
library(ggplot2)
# 设定数据集
d <- data_frame(t = seq(-pi, 0, .01),x1 = 16 * (sin(t)) ^ 2,x2 = -x1,y = 13 * cos(t) -5 * cos(2 * t) -2 * cos(3 * t) -cos(4 * t)) %>%gather(side, x, x1, x2)
a = (d$x - min(d$x))/(max(d$x) - min(d$x))
b = (d$y - min(d$y))/(max(d$y) - min(d$y))
# 绘图
g = ggplot(data=d, aes(x=x, y=y)) +geom_line(aes(color=I('white'))) + #手动设置心形边框线颜色geom_polygon(aes(fill='red'), show.legend = F) + #填充心形并隐藏图例scale_x_continuous(labels = NULL) +scale_y_continuous(labels = NULL) +theme_bw() + #设定白色主题theme(panel.grid.major = element_blank(), #删除网格线panel.grid.minor = element_blank(), #删除网格线panel.border = element_blank(), #删除边框线axis.ticks = element_blank(), #删除刻度线axis.title = element_blank()) + #去除x和y的标签名annotate('text', x=median(a), y=median(b),label='脏茜茜的师妹',size=8,col='gray20') +annotate('text', x=median(a), y=median(b)-2.5,label='520快乐!',size=18,col='white') +annotate('text', x=median(a), y=median(b)-5,label='下个月3篇推送写好了没?',size=5,col='#eeb401')+annotate('text', x=median(a), y=median(b)-6.5,label='再不写推送就把你开了',size=4,col='white')
# ggsave('heart.png', plot = last_plot(), dpi = 300)## 玫瑰花
library(tidyverse)
rose_plot = function(){f <- function(x) x^2 / 2f1 <- function(x) x^2/5geom_leaf <- function(x, xend, f, xoffset = 0, yoffset = 0, xflip = 1, yflip = 1, ...) {.x <- seq(x, xend, length.out = 100).y <- f(.x)df <- tibble(x = c(.x, .y), y = c(.y, .x))df$x <- xflip * df$x + xoffsetdf$y <- yflip * df$y + yoffsetgeom_polygon(aes(x = x, y = y), data = df, ...)}geom_rose <- function(n, mean = c(0, 0), ...) {.x <- mvtnorm::rmvnorm(n, mean)df <- tibble(x = .x[, 1], y = .x[, 2])list(stat_density_2d(aes(x = x, y = y, fill = stat(level)), data = df, geom = "polygon", show.legend = FALSE, color = "grey80"),scale_fill_gradient2(...))}p <- ggplot() + coord_equal(1, c(-4, 2), c(-7, 3)) +geom_curve(aes(x = -1, y = -7, xend = 0, yend = 0), ncp = 1000, curvature = -0.3, size = 1, color = "olivedrab3") +geom_leaf(0, 2, f, -1.6, -4.5, 1, fill = "olivedrab3", color = "palegreen") +geom_leaf(0, 2, f, -1.6, -5,  -1, fill = "olivedrab3", color = "palegreen") +geom_leaf(0, 2, f1, -1.25, -2.25,  -0.5, fill = "olivedrab3", color = "palegreen")+geom_leaf(0, 3, f1, -1.25, -2.25,  0.5, fill = "olivedrab3", color = "palegreen") +geom_rose(1000, mean = c(0, 0), low = "red", mid = "purple", high = "pink",midpoint = 0.075) +theme_void()return(p)
}
p = rose_plot()## 拼图
library(patchwork)
g + inset_element(p,0, 0.15, 1, 0.35
)

小编有话说

除此之外,小编搜集资料的时候发现了一个好玩的知乎推文教程:错过了520还可以一起过儿童节,如何用R语言‘撸’一个文字跑马灯去表白

小编修改了下,具体代码如下。主要是面向对象编程来写的,这里就不做过多解释了,大家自己看看吧(有点难)!效果图如下(跑马灯式表白):

#' @title projector
projector <- R6::R6Class(classname = "projector",public = list(initialize = function(sildes) { # 构造函数private$slides <- sprintf("\r%s",sildes) # 给每页文字的开始加上'\r'字符以覆盖上一页private$length <- base::length(private$slides) # 记录所有的播放页数量private$position <- 0 # 初始播放位置为第一页之前private$slide <- private$slides[private$position]},nextslide = function(){ # 播放下一页private$position <- private$position + 1 # 获取下一页位置if ( private$position > private$length ){ # 播放到最后一页后回到第一页private$position <- private$position - private$length}private$slide <- private$slides[ private$position ] # 设置当前播放页为下一页base::cat(private$slide) # 播放当前播发页},autoplay = function(fps = 10){ # 自动播放,播放速率每秒10页while(T){ # 无限循环,可以用for改写控制循环次数self$nextslide() # 播放下一页base::Sys.sleep(1/fps) # 休眠控制播放速率}}),private = list(slide = NA,# 当前播放页slides = c(), # 所有的播放页length = 0,# 播放页的总数position = 0# 当前播放位置)
)#' @title scroller
scroller <- R6::R6Class("scroller", inherit = projector,public = list(initialize = function(film, width = 50 ) { # 重载基类的构造函数,根据输入的文字和宽度自动设置播放页film <- paste0( base::strrep(" ",width), film,base::strrep(" ",width), collapse="" ) slides <- rep( base::strrep(" ",width) , nchar(film)-width+1 )for( i in 1:length(slides) ){slides[i] <- substr(film,i,i+width-1)}super$initialize(slides)})
)
#' @test boy <- scroller$new("脏茜茜的师妹,下个月的3篇推送写好了没?月底不给我,我就把你开了!!!",50) # 设置播放页的宽度为50
boy$autoplay(10) # 以每秒10页的速率播放

233

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/10511.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HTML超浪漫的表白网页代码】不会编程也能制作送给女朋友的表白网站

❤ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套) 】 &#x1…

520到了,用Python给女朋友比心表白

每到各种节日&#xff0c;不少小伙伴们都会遇到这样一个世纪问题——怎么给女朋友/老婆一个与众不同的节日惊喜。 这不又要到520了嘛&#xff0c;我们可以尝试用python给女朋友比心表白&#xff01;就像下面这样???? 下面快快就带大家来领略一下用Python表白的方式&#xf…

教你如何制作浪漫的表白网站

底部有彩蛋&#xff0c;不要错过(๑╹◡╹)&#xff89;""" #前言 前不久是情人节&#xff0c;一些小伙伴向我请求网页表白的教程&#xff0c;但因为比较忙&#xff0c;所以教程一直迟迟没有出来&#xff0c;趁着今天的闲暇时光&#xff0c;我把教程写出来。 虽…

【男生女生表白攻略】手把手教你制作有创意的表白软件

总有那么一个人让你脸红心跳&#xff0c;爱了却不敢说出来&#xff0c;真可惜。 那怎样才能向Ta表达自己真实的心情&#xff0c;怎样才能有机会追求自己所爱。必要的时候来学一些小技巧帮你爱情大作战。今天就跟大家介绍一个新颖有创意的表白方式&#xff0c;最适合不敢表白的人…

Python让女生无法拒绝的表白源代码

Python让女生无法拒绝的表白源代码&#xff0c;该程序在不接受表白时无法退出窗口&#xff0c;无法通过表白窗口的叉或程序内不接受按钮退出&#xff0c;需最大化表白窗口并点接受表白&#xff0c;方可退出。需要表白女生的图片可进行替换&#xff0c;图片也主程序放置在同一目…

明天就是5.20,这几个c语言表白代码发给你喜欢的女生,要是还没有女朋友直接来找我!!!

转眼间&#xff0c;今天好像已经2021年5月19日&#xff0c;明天好像是5月20号哎&#xff01;&#x1f614; 没想到吧&#xff01;一年一度的5.20它又来了。 又&#xff0c;又又又又又又来了&#xff01; 它踩着单生狗的身体&#xff0c;贱贱的向我们走来。&#x1f631; 是不…

520创意表白网站,让女友对你死心塌地。女神轻松领回家

可能很多女生都会觉得程序员都是直男&#xff0c;不懂浪漫。但是&#xff01;&#xff01;&#xff01;看完这个教程之后&#xff0c;让女友对你死心塌地。 这是一个基于js和html搭建的简单界面&#xff0c;你只需要把代码下载下来&#xff0c;然后再简单的改一下代码信息&…

HTML可用于情侣表白的爱心代码~,赶紧跟着操作,让她也拥有属于你的爱心吧。

文章目录 前言一、效果图二、操作步骤第一步第二步第三步第四步第五步第六步 源码 前言 最近随着电视剧《点燃我温暖你》的火热播出&#xff0c;剧中帅气学霸李洵的炫酷爱心代码也迅速火出了圈&#xff0c;爱心素材也异常火爆&#xff0c;我在这里整理了一份大家有需自取哦~ 可…

【七】springboot启动源码 - finishBeanFactoryInitialization

finishBeanFactoryInitialization 源码解析 Instantiate all remaining (non-lazy-init) singletons. 初始化剩下非懒加载的实例对象 finishBeanFactoryInitialization方法第918行&#xff0c;beanFactory.preInstantiateSingletons(); preInstantiateSingletons方法&#xff…

AI工程化实践-如何构造一个AI应用

最近大模型非常火爆&#xff0c;基于大模型的应用也层出不穷&#xff0c;比较火的比如AutoGPT&#xff0c;当然也有很多垂直领域的应用。那么如何基于大模型的能力快速的建设一个垂直领域的AI应用呢&#xff0c;这就涉及到了AI工程化建设。在整个AI工程化建设的过程中&#xff…

vue3的响应式赋值中数组array,对象object,集合set的重新赋值怎么操作,问过Chatgpt的答案

vue3和ts结合开发的时候&#xff0c;总是会遇到引用数据类型的重新赋值的情况&#xff0c;但是在vue3中&#xff0c;又不能使用直接赋值的情况&#xff0c;因为会改变proxy的结构&#xff0c;导致响应式失败&#xff0c;那么该如何重新赋值响应式对象数据成为了一个技巧问题&am…

使用gpt的感受,结尾附注册使用方式

最近一直很火的chatgpt&#xff0c;我也去试了一下&#xff0c;感觉还是用的很舒服的。 优点 感觉舒服的地方就是可以联系上下文&#xff0c;不像传统的搜索引擎一样&#xff0c;找不到的话得重新组织语言去搜索&#xff0c;可以跟gpt学习英语&#xff0c;问编程问题&#xf…

GIT使用的问题及解决

随时遇见&#xff0c;随机解决&#xff0c;同步记录 ~ 文章目录 ① git commit 失败&#xff1a;Author identity unknown *** Please tell me who you are.② git clone&#xff0c;git pull 提示 Permission denied&#xff0c;找不到私钥文件③ 重启电脑后&#xff0c;使用 …

解决Microsoft Bing 支持 ChatGPT后加入等待队列出错问题

解决Microsoft Bing 支持 ChatGPT后加入候补名单出错问题 代理进入https://www.bing.com/new&#xff0c;正确界面如下图&#xff1a; 如果进入直接跳转下图界面&#xff0c;则需要清除与bing相关的cookie&#xff08;设置里清除&#xff0c;这样就能之间跳转到加入候补名单的…

反射和动态代理

目录 v20230514更新 Userjava反射本质 反射的核心 获取Class对象&#xff1a; 创建对象&#xff1a; 调用方法&#xff1a; 访问字段&#xff1a; 需要注意的是&#xff0c; 综上所述&#xff0c; Userjava动态代理本质 两个核心的类&#xff1a;Proxy和InvocationH…

ChatGPT还在2G冲浪?新模型「youChat」:我已能够解说2022世界杯

视学算法报道 编辑&#xff1a;蛋酱、小舟 youChat 能成为搜索引擎变革的先行者吗&#xff1f; ChatGPT 自推出以来就被寄予厚望&#xff0c;一些人认为它会取代搜索引擎&#xff0c;成为「改变游戏规则的人」。 真的会有这一天吗&#xff1f;至少&#xff0c;一部分业内人士已…

流浪气球?ChatGPT这样回答,我惊了

近日&#xff0c;流浪地球电影反响热烈&#xff0c;“流浪气球”事件讨论热火&#xff0c;连人工智能ChatGPT都发表了 “自己”的看法&#xff0c;到底是怎么一回事呢&#xff1f;起因是我国一只民用气球&#xff0c;因技术和天气原因不小心飘到了米国上空&#xff0c;对方当时…

chatgpt赋能python:Python收发短信:简单可靠的解决方案

Python收发短信&#xff1a;简单可靠的解决方案 如果您需要向客户发送定期提醒或通知的短信&#xff0c;则 Python 是一种简单易用的解决方案。在本文中&#xff0c;我们将介绍如何使用 Python 发送和接收短信&#xff0c;并探讨一些流行的短信 API。 什么是短信 API&#xf…

chatgpt赋能python:Python编程——创新发短信新方式

Python编程——创新发短信新方式 在现代社会&#xff0c;短信是一种非常实用的通讯方式&#xff0c;广泛应用于各种场合。在Python编程领域中&#xff0c;通过利用各种API&#xff0c;我们能够创新地发短信并满足不同场景使用需求。本篇文章将介绍在Python编程中实现发短信的基…

chatgpt赋能python:Python短信发送:简单快捷的商业应用方式

Python短信发送&#xff1a;简单快捷的商业应用方式 介绍 随着科技的不断发展&#xff0c;短信已经成为商业沟通的重要渠道之一。许多业务场景需要使用短信进行客户沟通&#xff0c;例如短信验证码、促销短信、物流短信等等。 Python作为一种高效的编程语言&#xff0c;在短…