r - ggplot2:在散点图上绘制非标准形状

标签 r ggplot2 plot shapes

我希望能够设计可以在散点图上绘制的自定义形状。我目前可以使用分组来完成此任务,但如果我想以这种方式绘制 5 个或更多形状,这似乎是一个笨拙的解决方案。

library(ggplot2)
hexpoints <- data.frame(x=c(sin(pi*(0:5)/3),0), y=c(cos(pi*(0:5)/3),0))/2

ggplot(hexpoints, aes(x,y)) + geom_polygon(colour="black",fill=NA)

hexpoints2 <- data.frame(x=c(hexpoints$x,hexpoints$x+1), y=hexpoints$y, 
                    group=rep(c(1:2), each=nrow(hexpoints)))

ggplot(hexpoints2, aes(x, y, group=group)) + 
  geom_polygon(colour="black",fill=NA)

enter image description here

最佳答案

遵循@abichat的建议:

point2pacman <- function(x, y, grp) {
  if (is.data.frame(x)) {
    y <- x$y
    x <- x$x
  }
  if (length(x) == 1L || length(y) == 1L) {
    x <- rep(x, max(length(x), length(y)))
    y <- rep(y, max(length(x), length(y)))
  }
  if (missing(grp)) grp <- seq_along(x)
  do.call("rbind.data.frame",
          Map(function(i, a, b)
            data.frame(grp = i,
                       x = a + c(sin(pi*(0:5)/3),0) / 2,
                       y = b + c(cos(pi*(0:5)/3),0) / 2),
            grp, x, y))
}

library(ggplot2)

hexpoints2 <- data.frame(x=c(0,1), y=c(0,0))
point2pacman(hexpoints2$x, hexpoints2$y)
#    grp             x     y
# 1    1  0.000000e+00  0.50
# 2    1  4.330127e-01  0.25
# 3    1  4.330127e-01 -0.25
# 4    1  6.123032e-17 -0.50
# 5    1 -4.330127e-01 -0.25
# 6    1 -4.330127e-01  0.25
# 7    1  0.000000e+00  0.00
# 8    2  1.000000e+00  0.50
# 9    2  1.433013e+00  0.25
# 10   2  1.433013e+00 -0.25
# 11   2  1.000000e+00 -0.50
# 12   2  5.669873e-01 -0.25
# 13   2  5.669873e-01  0.25
# 14   2  1.000000e+00  0.00
# similarly: point2pacman(hexpoints2)

ggplot(hexpoints2, aes(x, y)) + 
  geom_text(aes(label=label), color = "red") +
  geom_polygon(aes(group = grp), data=point2pacman(hexpoints2), color="black", fill=NA)

sample repeated-polygon plot

我使用hexpoints2作为ggplot的“主要”数据,以防万一你在那里发生其他事情,然后覆盖仅用于该的数据geom_polygon 调用。我在此处添加了 geom_text 来演示此方法的好处。下一步是定义您自己的 geom_pacman 函数,您自己可以完成其中的一些工作;我还没有做那么多,所以我很快就做了一些事情,尽管它不应该那么困难。 (已弃用文档 here ,它可能包含在 https://ggplot2.tidyverse.org/ 中的某个位置。)

关于r - ggplot2:在散点图上绘制非标准形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54025336/

相关文章:

r - 使用 for 循环在 R 中创建多个具有不同图例比例的气泡图

r - "dimnames_zoo"未从当前命名空间 (xts) 解析

r - 不平衡数据集上的 2 向方差分析

R:如何从数据框中提取列表?

r - R使用viewPorts将数据表添加到ggplot图中:缩放Grob

R:图例表达式如何在两个值之间添加逗号以及如何抑制科学记数法

python - 如何在rpy2中使用R的赋值方法?

r - 使用ggplot2为每组添加回归线

r - eval(expr、envir、enclos) : could not find function "eval" 中的错误

plot - 如何在 Julia 中使用plot()连接点