我正在使用ggsankey制作一个Sankey图,当标签在 node 上重叠时,很难让标签可见.我有三个 node ,希望移动左侧的标签,这样它就不会与 node 重叠,而是位于 node 的左侧.我希望中间的 node 保持在 node 的中心,并且我希望移动右边的标签,以便位于右边的 node 的右边.

我可以使用geom_sankey_label和hjust让所有标签移动位置,但我不知道如何分别移动每个 node 上的标签.我甚至不知道是否有可能做我想做的事情.

我的代码和这个非常相似—

df <- mtcars %>%
  make_long(cyl, vs, am, gear, carb)

ggplot(df, aes(x = x, next_x = next_x, node = node, next_node = next_node, fill = factor(node), label = node)) +
  geom_sankey(flow.alpha = .6,
              node.color = "gray30",
              space = 20) +
  geom_sankey_label(size = 3, 
                    color = "white", 
                    fill = "gray40",
                    hjust = 0,
                    position = position_nudge(x = 0.1),
                    space = 20) +
  scale_fill_viridis_d() +
  theme_sankey(base_size = 18) +
  labs(x = NULL) +
  theme(legend.position = "none",
        plot.title = element_text(hjust = .5)) +
  ggtitle("Car features")

sankey plot with labels moved off nodes

我希望它看起来像这个草图:enter image description here

推荐答案

实现所需结果的一个选项是有条件地轻推标签,并使用例如aes()内的dplyr::case_when设置标签的对齐.为了调整标签的位置,我使用了ggplot2::stage():

library(ggplot2)
library(ggsankey)

df <- mtcars |>
  make_long(cyl, vs, am, gear, carb)

ggplot(df, aes(
  x = x, next_x = next_x,
  node = node, next_node = next_node,
  fill = factor(node), label = node
)) +
  geom_sankey(
    flow.alpha = .6,
    node.color = "gray30",
    space = 20
  ) +
  geom_sankey_label(
    aes(
      # Shift labels conditional on position
      x = stage(x,
        after_stat = x + .1 *
          dplyr::case_when(
            x == 1 ~ -1,
            x == 5 ~ 1,
            .default = 0
          )
      ),
      # Align labels conditional on position
      hjust = dplyr::case_when(
        x == "cyl" ~ 1,
        x == "carb" ~ 0,
        .default = .5
      )
    ),
    size = 3,
    color = "white",
    fill = "gray40",
    space = 20
  ) +
  scale_fill_viridis_d() +
  theme_sankey(base_size = 18) +
  theme(
    legend.position = "none",
    plot.title = element_text(hjust = .5)
  ) +
  labs(x = NULL, title = "Car features")

R相关问答推荐

带有gplot 2的十字舱口

如何使用R中的dhrr函数将李克特量表的因子列从长转换为宽?

用derrr在R中查找组间的重复项

通过使用str_detect对具有相似字符串的组进行分组

如何在区分不同条件的同时可视化跨时间的连续变量?

在R中,如何将变量(A,B和C)拟合在同一列中,如A和B,以及A和C在同一面板中?

如何在ggplot图中找到第二轴的比例

我如何才能找到FAMILY=POISSON(LINK=&Q;LOG&Q;)中的模型预测指定值的日期?

提取一个列表中单个列的重复观察结果R

计算直线上点到参考点的总距离

在另一个包中设置断点&S R函数

自定义gggraph,使geom_abline图层仅在沿x轴的特定范围内显示

有没有可能用shiny 的书签恢复手风琴面板?

将多个列合并为一个列的有效方法是什么?

ArrangeGrob()和类似的替代方法不接受Grob列表.在Grid.Draw,返回:glist中的错误(...):仅允许在glist";中使用Grobs;

如何使用ggplot2根据绘图中生成的斜率对小平面进行排序?

根据排名的顶点属性调整曲线图布局(&Q)

从两个数据帧中,有没有办法计算R中一列的唯一值?

修复标签重叠和ggploy内的空间

根据列和行的不同组合 Select 各种单元格