r - 在 ggplot 中,如何创建带有尖边的线条可视化(如“牙签”)?
问题描述
我正在寻找一种方法来创建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()
由reprex 包于 2021-07-21 创建 (v2.0.0 )
现在,假设我设置
y_top <- 1.75
y_bottom <- 1.25
尽管同时具有淡出效果会很理想,但“牙签”外观对我来说是最重要的。不幸的是,geom_lines()
的lineend
论点不支持我正在寻找的“重点”。
知道如何实现吗?
谢谢!
解决方案
一种方法是使用该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()
推荐阅读
- ftp - 如何在 Piwik 3.0.2(Motomo 旧版本)上安装 Geolite2?
- python - 如何在python中为2个不同比例的2列创建热图?
- gradle - 在 marklogic 中执行 mldeploy 所需的最小内存是多少
- android - WearOS 始终开启模式无法在设备上运行
- java - CallableStatement 抛出日期参数未知的 org.postgresql.util.PSQLException
- python - 我无法从 django 发送电子邮件
- c++ - 如何声明 boost histograms 的 std::vector ?提升直方图的类型是什么?
- flutter - 如何在 Dart 中将秒转换为分钟?
- javascript - 获取给定组件名称的组件列表,无论它们是嵌套的 - Vue
- python - 单击按钮 selenium python 后等待类加载值