首页 > 解决方案 > 在 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论点不支持我正在寻找的“重点”。

知道如何实现吗?

谢谢!

标签: rggplot2

解决方案


一种方法是使用该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()

在此处输入图像描述


推荐阅读