如何在冲积或桑基图中获得 y 轴上的百分比?

Posted

技术标签:

【中文标题】如何在冲积或桑基图中获得 y 轴上的百分比?【英文标题】:How to get percentages on the y axes in an alluvial or sankey plot? 【发布时间】:2020-09-05 14:31:41 【问题描述】:

我使用 ggplot2 实现了这个图表,我想将 y 轴更改为百分比,从 0% 到 100%,每 10 次中断一次。 我知道我可以使用:

+ scale_y_continuous(label=percent, breaks = seq(0,1,.1))

但我仍然遇到问题,因为在转换为百分比时,R 将 30000 解释为 30000%,所以如果限制为 100%,我的图表中什么也得不到。 我该如何管理它?

我有一个这样的数据集:

ID time value
1   1   B with G available
2   1   Generic
3   1   B with G available
4   1   Generic
5   1   B with G available
6   1   Generic
7   1   Generic
8   1   Generic
9   1   B with G available
10  1   B with G available
11  1   Generic
12  1   B with G available
13  1   B with G available
14  1   B with G available
15  1   Generic
16  1   B with G available
17  1   B with G available
18  1   B with G available
19  1   B with G available
20  1   B with G available
1   2   B with G available
2   2   Generic
3   2   B with G available
4   2   Generic
5   2   B with G available
6   2   Generic
7   2   Generic
8   2   Generic
9   2   B with G available
10  2   B with G available
11  2   Generic
12  2   B with G available
13  2   B with G available
14  2   B with G available
15  2   Generic
16  2   B with G available
17  2   switch
18  2   B with G available
19  2   B with G available
20  2   switch

使用此代码可重现:

PIPPO <- data.frame("ID"=rep(c(1:20),2), "time"=c(rep(1,20),rep(2,20)), "value"=c("B","G","B","G","B",rep("G",3),rep("B",2),"G",rep("B",3),"G",rep("B",6),"G","B","G","B",rep("G",3),rep("B",2),"G",rep("B",3),"G","B","switch",rep("B",2),"switch"))

所以我没有可以管理的 y 轴变量。

这是我的代码和我获得的情节

ggplot(PIPPO, 
       aes(x = time, stratum = value, alluvium = ID,
           fill = value, label = value)) +
  scale_fill_brewer(type = "qual" , palette = "Set3") +
  geom_flow(stat = "flow", knot.pos = 1/4, aes.flow = "forward",
            color = "gray") + 
  geom_stratum() +
  theme(legend.position = "bottom") 

谁能帮帮我?

我使用真实数据得到的结果

scale_y_continuous(label = scales::percent_format(scale = 100 / n_id))

这是:

以 84% 作为最大值(而不是 100%)。我怎样才能使 y 轴达到 100% 并每 10% 损坏一次?

这是我得到的

scale_y_continuous(breaks = scales::pretty_breaks(10), label = scales::percent_format(scale = 100 / n_id))

我每 14% 得到一个奇怪的值。

【问题讨论】:

【参考方案1】:

使用percent_format 中的scale 参数可以这样实现:

PIPPO <- data.frame("ID"=rep(c(1:20),2), "time"=c(rep(1,20),rep(2,20)), "value"=c("B","G","B","G","B",rep("G",3),rep("B",2),"G",rep("B",3),"G",rep("B",6),"G","B","G","B",rep("G",3),rep("B",2),"G",rep("B",3),"G","B","switch",rep("B",2),"switch"))

library(ggplot2)
library(ggalluvial)

n_id <- length(unique(PIPPO$ID))

ggplot(PIPPO, 
       aes(x = time, stratum = value, alluvium = ID,
           fill = value, label = value)) +
  scale_fill_brewer(type = "qual" , palette = "Set3") +
  scale_y_continuous(label = scales::percent_format(scale = 100 / n_id)) +
  geom_flow(stat = "flow", knot.pos = 1/4, aes.flow = "forward", color = "gray",) + 
  geom_stratum() +
  theme(legend.position = "bottom") 

由reprex package (v0.3.0) 于 2020 年 5 月 19 日创建

【讨论】:

谢谢。我想要获得的是每 10% 到 100% 的 y 轴断裂。我该怎么做? 在这种情况下,您必须设置休息时间。试试scale_y_continuous(breaks = scales::pretty_breaks(10), label = scales::percent_format(scale = 100 / n_id)) 我将编辑我的问题,添加我使用“break”得到的内容。 嗨@SabrinaG。很明显,标准化会发生一些奇怪的事情。似乎n_id 略大于图中使用的obs 数量。 (???)但是如果不查看真实数据,这很难解决。要获得良好的休息时间,您可以尝试通过breaks = seq(0, n_id, length.out = 11) 设置休息时间。但是,这可能(或相当难以解决)问题的解决方案。 在 y 轴上使用绝对值,我得到以下值:10.000、20.000 和 30.000。当我将 y 轴更改为百分比时,我得到:28%、56% 和 84%,因为观察的总数是 35.514。当我使用“休息”时,它会继续绘制这些百分比,并在两者之间添加其他百分比。我不明白为什么。还是谢谢【参考方案2】:

我假设您需要创建一个新的百分比列,方法是获取总行数,然后将列中的每个“值”除以总数以获得它所代表的百分比。

【讨论】:

【参考方案3】:

简单地标准化你的 y 值似乎可以解决问题:

library(ggplot2)

ggplot(mtcars, aes(x = cyl, y = mpg/max(mpg))) +
  geom_point() +
  scale_y_continuous(label = scales::label_percent())

由reprex package (v0.3.0) 于 2020 年 5 月 19 日创建

【讨论】:

以上是关于如何在冲积或桑基图中获得 y 轴上的百分比?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 y 轴上的百分比和 x 轴上的每个指标来绘制性能百分比?

Seaborn:如何在绘图的 X 轴上的每个值之后添加一个“%”符号,而不是将值转换为百分比? [复制]

如何从主题建模中制作主题百分比条形图?

修改顶部ggplot百分比条形图上的文本标签

二元变量的散点图 (ggplot)

根据百分位数绘制直方图