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 进行水平交叉。这只是为了演示如何实现这一点的非常简单直接的方法。这不是一个很好的统计数据,因为
- 适当的比例取决于比例(你基本上需要设置coord_equal),
- 你需要对组非常具体
但这可能是一个好的开始...
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 创建
我想知道除了默认形状(可以查看 运行 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 进行水平交叉。这只是为了演示如何实现这一点的非常简单直接的方法。这不是一个很好的统计数据,因为
- 适当的比例取决于比例(你基本上需要设置coord_equal),
- 你需要对组非常具体
但这可能是一个好的开始...
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 创建