imd 统计教程 · 统计图表与论文表格
← 教程首页 返回本模块

R绘制彩色玫瑰,致敬妈妈们,母亲节快乐

聂志强实战医学统计2024-05-12 00:12:18江西

不知不觉,公众号已经是第100篇文章了。明天就是母亲节,那么这第100篇就献给亲爱的妈妈,没有什么是比亲人更珍贵的。 

近期小编遇到人生中很艰难的一个插曲,还好现在结果是好的,感谢群内小伙伴的帮助。本文的玫瑰花们,也一同献给热心的群友们和关心小编的朋友们,感谢你们

一、单支玫瑰

单支玫瑰带3D坐标轴系,大家可以修改花瓣状态和透明度等,小编都备注好了。

# 加载plotly包,用于生成交互式图表
library(plotly)
# 创建x和t的序列。x用于表示径向分量,t用于角度。
x <- seq(0, 24) / 24
t <- seq(0, 575, by = 0.5) / 575 * 20 * pi + 4 * pi
# 生成x和t的组合网格
grid <- expand.grid(x = x, t = t)
# 转换grid数据为矩阵形式,方便进行后续计算
x <- matrix(grid$x, ncol = 25, byrow = TRUE)
t <- matrix(grid$t, ncol = 25, byrow = TRUE)
# 计算p值,p控制花瓣的开合状态
p <- (pi / 2) * exp(-t / (8 * pi))
# change用于增加花瓣形状的多样性
change <- sin(15 * t) / 150
# u是花瓣的径向调制,通过周期性函数增加图形的复杂性
u <- 1 - (1 - (3.6 * t) %% (2 * pi) / pi) ^ 4 / 2 + change
# y是基于x的二次函数,用于调制花瓣的高度
y <- 2 * (x ^ 2 - x) ^ 2 * sin(p)
# r是最终的径向距离,结合u和y进行调整
r <- u * (x * sin(p) + y * cos(p))
# 计算x,y,z坐标
xx = r * cos(t)
yy = r * sin(t)
zz = u * (x * cos(p) - y * sin(p))
# 使用plotly生成三维曲面图,颜色为红色系,透明度为0.5
plot <- plot_ly(x = ~xx, y = ~yy, z = ~zz, colors = 'Reds', opacity = 0.5) %>% add_surface()
# 向图中添加绿色线条,这些线条可以代表花茎或其它装饰线
add_trace(plot, x = rep(0), y = rep(0), z = seq(-0.5, 0, length = 4),
          mode = 'lines', line = list(color = 'green', width = 8))

单支玫瑰文字版

相比上面3D坐标,小编更喜欢纯粹的简约版。



#----1??去文字版----
# 加载plotly包,用于生成交互式图表
library(plotly)
# 创建x和t的序列。x用于表示径向分量,t用于角度。
x <- seq(0, 24) / 24
t <- seq(0, 575, by = 0.5) / 575 * 20 * pi + 4 * pi
# 生成x和t的组合网格
grid <- expand.grid(x = x, t = t)
# 转换grid数据为矩阵形式,方便进行后续计算
x <- matrix(grid$x, ncol = 25, byrow = TRUE)
t <- matrix(grid$t, ncol = 25, byrow = TRUE)
# 计算p值,p控制花瓣的开合状态
p <- (pi / 2) * exp(-t / (8 * pi))
# change用于增加花瓣形状的多样性
change <- sin(15 * t) / 150
# u是花瓣的径向调制,通过周期性函数增加图形的复杂性
u <- 1 - (1 - (3.6 * t) %% (2 * pi) / pi) ^ 4 / 2 + change
# y是基于x的二次函数,用于调制花瓣的高度
y <- 2 * (x ^ 2 - x) ^ 2 * sin(p)
# r是最终的径向距离,结合u和y进行调整
r <- u * (x * sin(p) + y * cos(p))
# 计算x,y,z坐标
妈妈_母亲节快乐 = r * cos(t)
yy = r * sin(t)
zz = u * (x * cos(p) - y * sin(p))
# 使用plotly生成三维曲面图,颜色为红色系,透明度为0.5
plot <- plot_ly(x = ~妈妈_母亲节快乐, y = ~yy, z = ~zz, colors = 'Reds', opacity = 0.5) %>% add_surface()
# 向图中添加绿色线条,这些线条可以代表花茎或其它装饰线
plot <- plot %>% add_trace(plot, x = rep(0), y = rep(0), z = seq(-0.3, 0, length = 4),
          mode = 'lines', line = list(color = 'green', width = 8)) %>%
  layout(scene = list(xaxis = list(showline = FALSE,  # 不显示X轴线
                                   zeroline = FALSE,  # 不显示零线
                                   showgrid=FALSE,  # 不显示网格
                                   showticklabels = FALSE  ), # 不显示刻度标签
                      yaxis = list(visible = FALSE), 
                      zaxis = list(visible = FALSE)))
plot

二、多彩玫瑰

紫色蓝色玫瑰,多彩缤纷哦。


#---- ??多彩玫瑰----
setwd("D:/聂个人文件/我的公众号/母亲节玫瑰花")
# 加载plotly包
library(plotly)

# 定义一个函数用于生成玫瑰花的坐标和属性;批量生成花朵
generate_flower <- function(offset, color, petals_factor) {
  x <- seq(0, 24) / 24
  t <- seq(0, 575, by = 0.5) / 575 * 20 * pi + offset
  grid <- expand.grid(x = x, t = t)
  x <- matrix(grid$x, ncol = 25, byrow = TRUE)
  t <- matrix(grid$t, ncol = 25, byrow = TRUE)
  p <- (pi / 2) * exp(-t / (8 * pi))
  change <- sin(petals_factor * t) / 150
  u <- 1 - (1 - (3.6 * t) %% (2 * pi) / pi) ^ 4 / 2 + change
  y <- 2 * (x^2 - x)^2 * sin(p)
  r <- u * (x * sin(p) + y * cos(p))
  xx = r * cos(t)
  yy = r * sin(t)
  zz = u * (x * cos(p) - y * sin(p))
  list(xx = xx, yy = yy, zz = zz, color = color)
}

# 生成3朵不同的花
flowers <- lapply(1:3, function(i) {
  generate_flower(offset = 2 * pi * runif(1), color = sample(c('Reds','Purples','Oranges'), 1), petals_factor = sample(5:20, 1))
})

# 创建一个plotly对象的列表3
plots <- vector("list", length = 3)
for (i in 1:3) {
  plots[[i]] <- plot_ly() %>%
    add_surface(x = ~flowers[[i]]$xx, y = ~flowers[[i]]$yy, z = ~flowers[[i]]$zz, opacity = 0.5, colors = flowers[[i]]$color, showscale = FALSE) %>%
    layout(scene = list(xaxis = list(visible = FALSE),
                        yaxis = list(visible = FALSE),
                        zaxis = list(visible = FALSE)))
}
# 保存plotly图形
library(htmlwidgets)
saveWidget(plots[[1]], "plotly_plot1.html", selfcontained = TRUE)
saveWidget(plots[[2]], "plotly_plot2.html", selfcontained = TRUE)
saveWidget(plots[[3]], "plotly_plot3.html", selfcontained = TRUE)

PS: plotly对象无法直接patchwork或者组合,有知道的小伙伴请留言,如何一幅图内组合这些玫瑰?

小结

爱心玫瑰送给每位妈妈。

参考文献:

  1. https://mp.weixin.qq.com/s/QPFPEiH5EhgO1ZOeV01csA 2.https://mp.weixin.qq.com/s/3yKSdZ8euOAYptXIE6CYdw