我正在寻找一种方法来创建ggplot()具有“尖”边缘的线条,以获得“牙签”的整体外观。
例如,考虑以下可视化:
library(tibble)
library(ggplot2)
my_df <-
tribble(~name, ~value,
"a", 1,
"a", 2,
"b", 1,
"b", 2)
my_df %>%
ggplot(aes(x = name, y = value)) +
geom_line(size = 1.5, lineend = "round") +
expand_limits(y = c(0.5, 2.5)) +
theme_bw()
Run Code Online (Sandbox Code Playgroud)

由reprex 包( v2.0.0 )于 2021 年 7 月 21 日创建
现在,假设我设置了
y_top <- 1.75
y_bottom <- 1.25
Run Code Online (Sandbox Code Playgroud)
虽然也有淡出效果是理想的,但“牙签”外观对我来说是最重要的。不幸的是,geom_lines()的lineend论点不支持我正在寻找的“尖锐性”。
知道如何实现这一目标吗?
谢谢!
Jon*_*ing 10
一种方法是使用ggforce包访问一些“补间”几何体,它们的外观沿其长度变化,例如geom_link2. 在这里,我做了一些准备工作,为每个名称添加距极端值 0.25 英寸的观察值,并根据我们是否处于极端值来分配宽度。
library(tidyverse); library(ggforce)
my_df %>%
group_by(name) %>%
summarize(min_val = min(value), max_val = max(value)) %>%
mutate(min_taper = min_val + 0.25, max_taper = max_val - 0.25) %>%
pivot_longer(-name, names_to = "step") %>%
mutate(width = if_else(str_detect(step, "val"), 0, 1)) %>%
arrange(name, value) %>%
#Here's what it looks like at this point:
## A tibble: 8 x 4
# name step value width
# <chr> <chr> <dbl> <dbl>
#1 a min_val 1 0
#2 a min_taper 1.25 1
#3 a max_taper 1.75 1
#4 a max_val 2 0
#5 b min_val 1 0
#6 b min_taper 1.25 1
#7 b max_taper 1.75 1
#8 b max_val 2 0
# now that it's prepped, it's a short call in ggplot2/ggforce:
ggplot(aes(name, value, size = width)) +
ggforce::geom_link2() +
scale_size_continuous(range = c(0,0.6)) + # controls width range of lines
theme_bw()
Run Code Online (Sandbox Code Playgroud)