箭头在ggplot2中用作尺寸美学

Kub*_*ba_ 5 r ggplot2

我有包含矢量坐标及其特征的数据 - success_rate以及prop:

ex_data <- structure(list(group = c("group A", "group A", "group A", "group A", 
"group A", "group A", "group C", "group C", "group C", "group C", 
"group C", "group W", "group W", "group W", "group W", "group W"
), category = c(5, 4, 3, 2, 1, 6, 5, 1, 2, 3, 4, 1, 4, 5, 2, 
3), success_rate = c(0.816037735849057, 0.938775510204082, 0.653061224489796, 
0.985915492957746, 0.934306569343066, 1, 0.979166666666667, 0.887323943661972, 
0.319587628865979, 0.721590909090909, 0.941176470588235, 0.689320388349515, 
0.338028169014085, 0.396551724137931, 0.7375, 0.763948497854077
), x0 = c(24.5, 24.5, 23.7, 22.6, 28.6, 27.6, 27.2, 27.4, 15.7, 
25.5, 24.2, 21.4, 17.5, 9.9, 23.6, 29), y0 = c(21.2, 27.9, 96.6, 
43.9, 65.1, 71.5, 34.3, 71.2, 47.9, 88, 36, 86.9, 49.4, 41.3, 
85.6, 16.7), x1 = c(35.2, 36.5, 34, 32.9, 39.4, 40.2, 35.9, 31.6, 
63.1, 29.5, 35.9, 35.4, 61.4, 54, 37.3, 37.2), y1 = c(5.8, 33.6, 
96.8, 70, 64.8, 96.6, 7.3, 64.9, 63.1, 89.7, 38.5, 95, 59.3, 
32.2, 77.9, 12), prop = c(0.124926340601061, 0.0866234531526223, 
0.0288744843842074, 0.041838538597525, 0.0807307012374779, 0.0271066588096641, 
0.0365853658536585, 0.0541158536585366, 0.0739329268292683, 0.134146341463415, 
0.0259146341463415, 0.0787461773700306, 0.108562691131498, 0.0443425076452599, 
0.0611620795107034, 0.178134556574924)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -16L))
Run Code Online (Sandbox Code Playgroud)

group不想为每个prop用作尺寸美学的矢量图形.不幸的是,我不认为万一箭头尺寸美观不能很好地调整整个箭头,这通常看起来很糟糕:

ggplot(ex_data) +
  geom_segment(aes(x = x0, y = y0, xend = x1, yend = y1, color = success_rate, size = prop),
               arrow = arrow(length = unit(0.2, "cm"), ends = 'last', type = 'closed')) +
  facet_wrap(~group) +
  scale_color_viridis_c()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

所以我想用prop变量控制箭头的大小.不幸的是,箭头不美观geom_segment,控制它们尺寸的唯一方法是为它们提供单独的矢量.它适用于单个组:

ex_data %>% 
  filter(group == 'group C') %>% 
  ggplot() +
  geom_segment(aes(x = x0, y = y0, xend = x1, yend = y1, color = success_rate),
               arrow = arrow(length = unit(filter(ex_data, group == 'group C')$prop * 3, "cm"), ends = 'last', type = 'closed')) +
  facet_wrap(~group) +
  scale_color_viridis_c()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但不是facet_wrap:

ggplot(ex_data) +
  geom_segment(aes(x = x0, y = y0, xend = x1, yend = y1, color = success_rate),
               arrow = arrow(length = unit(ex_data$prop * 3, "cm"), ends = 'last', type = 'closed')) +
  facet_wrap(~group) +
  scale_color_viridis_c()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

您可以注意到箭头的大小group C不再有效(例如,上箭头应该有最大的箭头,而它最小的箭头).我的原始数据有更多的组,创建单独的图表真的很乏味.这有什么解决方法吗?

Jul*_*ora 6

如在这种情况下(例如,通常的1,2,3),我们可以使用为每个小面的子数据帧.例如,

ggplot(ex_data) +
  lapply(split(ex_data, ex_data$group), function(df)
  geom_segment(data = df, aes(x = x0, y = y0, xend = x1, yend = y1, color = success_rate),
               arrow = arrow(length = unit(df$prop * 3, "cm"), ends = 'last', type = 'closed'))) +
  facet_wrap(~group) + scale_color_viridis_c()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述