ggplot 中还有其他可填充的形状吗?

Are there any other additional fillable shapes in ggplot?

我想知道除了默认形状(可以查看 运行 ggpubr::show_point_shapes()here 之外,是否还有任何其他可填充形状可以在 ggplot 中绘制。

根据这些消息来源,唯一可以填充的形状是正方形、圆形、菱形和三角形。我希望能够绘制可填充的十字形或“x”形。 “可填充”是指形状应该有足够的厚度,可以在里面添加标签。

黄色和绿色的形状是我想要绘制的。这可能吗,还是我应该考虑其他选择?

如果您找到喜欢的 Unicode 符号,则可以将其用作标签:

library(ggplot2)
ggplot(mtcars, aes(x=wt, y=mpg)) +
    geom_text(label = ifelse(mtcars$gear >3, "\u2716", "\u271A"),
              aes(vjust=.5, hjust=.5, family="DejaVu Sans"), 
              size=12, 
              col = ifelse(mtcars$gear >3, "lightgreen", "yellow"))+
    geom_text(aes(label=gear, vjust=.5, hjust=.5))+
    theme_bw()

reprex package (v1.0.0)

于 2021-03-15 创建

您也可以使用 \u2727\u271C 或您喜欢的其他字符。

这是一个非常粗略的统计数据,使用 GeomPolygon 进行水平交叉。这只是为了演示如何实现这一点的非常简单直接的方法。这不是一个很好的统计数据,因为

  1. 适当的比例取决于比例(你基本上需要设置coord_equal),
  2. 你需要对组非常具体

但这可能是一个好的开始...

library(tidyverse)
StatCross <- ggproto("StatCross", Stat,
                     compute_group = function(data, scales, width = .1, params) {
                       x <- data$x
                       y <- data$y
                       new_x <- c(rep(x + width, 2),
                                      rep(x + 4 * width, 2),
                                      rep(x + width, 2),
                                      rep(x - width, 2),
                                      rep(x - 4 * width, 2),
                                      rep(x - width, 2))
                       new_y <- c(y + 4* width,
                                        rep(y + width, 2),
                                        rep(y - width, 2),
                                        rep(y - 4*width, 2),
                                        rep(y - width, 2),
                                        rep(y + width, 2),
                                        y + 4*width)
                       cross_data <- data.frame(x = new_x, y = new_y)
                       cross_data
                     },
                     
                     required_aes = c("x", "y")
)
stat_cross <- function(mapping = NULL, data = NULL, geom = "polygon",
                       position = "identity", na.rm = FALSE, show.legend = NA, 
                       inherit.aes = TRUE, width = 0.1, ...) {
  layer(
    stat = StatCross, data = data, mapping = mapping, geom = geom, 
    position = position, show.legend = show.legend, inherit.aes = inherit.aes,
    params = list(na.rm = na.rm, width = width, ...)
  )
}
iris %>% 
  mutate(index = row_number()) %>%
ggplot(aes(Sepal.Length, Sepal.Width, group = index)) +
  stat_cross(width = .01,  fill = "yellow", color = "black")

reprex package (v1.0.0)

于 2021-03-15 创建