如何用R语言ggplot2绘制接吻人物曲线及进阶立体图形?
用ggplot2绘制自定义接吻人物图形的解决方案
一、简易版本补全眼线
ggplot2完全可以实现这类自定义图形,眼线部分可以通过geom_segment()或geom_curve()来添加,配合基础的圆形/椭圆形绘制脸部和眼睛。
假设你已经有了基础的脸部、眼睛绘制代码,这里补充眼线的实现:
library(ggplot2) # 构造基础数据 face_data <- data.frame(x = c(1, 3), y = 2, r = 0.8) # 左右脸 eye_data <- data.frame(x = c(1.2, 2.8), y = 2.2, r = 0.15) # 左右眼睛 ggplot() + # 绘制脸部(圆形) geom_circle(aes(x0 = x, y0 = y, r = r), data = face_data, fill = "#f5d6c6", color = NA) + # 绘制眼睛(圆形) geom_circle(aes(x0 = x, y0 = y, r = r), data = eye_data, fill = "black") + # 添加眼线:用geom_curve画眼部上方的曲线 geom_curve(aes(x = 1.05, y = 2.35, xend = 1.35, yend = 2.35), curvature = -0.5, color = "black", size = 0.5) + geom_curve(aes(x = 2.65, y = 2.35, xend = 2.95, yend = 2.35), curvature = 0.5, color = "black", size = 0.5) + # 绘制嘴唇(简单线段) geom_segment(aes(x = 1.5, y = 1.8, xend = 2.5, yend = 1.8), color = "#d98880", size = 2) + # 调整主题,去掉坐标轴等元素 theme_void()
这段代码里,geom_curve的curvature参数可以调整眼线的弯曲程度,匹配参考图的样式。
二、复杂立体版本的实现
要绘制更具立体感的接吻图形,核心是用贝塞尔曲线构建平滑的轮廓,并通过渐变填充、层次线条来表现光影。可以借助ggforce包的geom_bezier()来轻松绘制贝塞尔曲线,也可以手动生成曲线点。
以下是一个简化的立体版本示例:
library(ggplot2) library(ggforce) # 生成贝塞尔曲线数据:左脸轮廓 left_face <- data.frame( x = c(0.5, 0.8, 1.2, 1.5), y = c(1.5, 2.5, 2.8, 2.2), group = rep(1, 4) ) # 右脸轮廓 right_face <- data.frame( x = c(3.5, 3.2, 2.8, 2.5), y = c(1.5, 2.5, 2.8, 2.2), group = rep(2, 4) ) # 嘴唇曲线(立体) lips <- data.frame( x = c(1.4, 1.8, 2.2, 2.6), y = c(1.7, 1.5, 1.5, 1.7), group = rep(3, 4) ) ggplot() + # 绘制脸部:用贝塞尔曲线+渐变填充 geom_bezier_polygon(aes(x = x, y = y, group = group, fill = factor(group)), data = rbind(left_face, right_face), color = "#c4766b", size = 0.5) + scale_fill_manual(values = c("#f8d7c1", "#f5c6b8")) + # 绘制立体眼睛:用两个重叠圆形表现高光 geom_circle(aes(x0 = 1.1, y0 = 2.4, r = 0.2), fill = "black") + geom_circle(aes(x0 = 1.15, y0 = 2.45, r = 0.05), fill = "white") + geom_circle(aes(x0 = 2.9, y0 = 2.4, r = 0.2), fill = "black") + geom_circle(aes(x0 = 2.85, y0 = 2.45, r = 0.05), fill = "white") + # 绘制立体嘴唇:贝塞尔曲线+填充 geom_bezier_polygon(aes(x = x, y = y, group = group), data = lips, fill = "#e08283", color = "#a93226") + # 调整主题 theme_void() + theme(legend.position = "none")
关键技巧说明:
- 贝塞尔曲线:通过
ggforce::geom_bezier()或geom_bezier_polygon()可以绘制平滑的曲线轮廓,适合构建自然的脸部、嘴唇形状。 - 立体感表现:用深浅不同的填充色区分左右脸,给眼睛添加高光白点,嘴唇用深色边框+填充色增强质感。
- 自定义曲线拟合:如果需要更精准的轮廓,可以手动调整贝塞尔曲线的控制点,或者用
bezier包生成更多曲线点来细化形状。
内容的提问来源于stack exchange,提问作者psysky
相关产品推荐
相关产品推荐

