2

我正在为以下百分比数据制作一个不安图。这是我更复杂数据的一个虚拟示例。

x <- c(a=80, b=9.9, c=5, 'a&b'=0.1, 'a&c'=1.65, 'c&b'=3.35) 不安(fromExpression(x), order.by = "freq")

我希望这些百分比显示为十进制数字,并且所有条形都可见,即使它是 0.1%。所有数据在此图中都很重要。

4

2 回答 2

2

有两个事实阻碍了快速轻松地解决这个问题:

UpSetR非常强烈地面向离散的可数对象集。

一个潜在的解决方案是使用小数对象而不是使用整个对象,但首先要做的upset()是检查数据框中的哪些列具有"0"它们"1"的唯一级别。这是硬编码的。如果这失败了,startend对象就变成NULL了,并且函数将无法做任何事情。

UpSetR不能很好地访问它创建的图。

绘制好图后,您将没有任何返回值 from upset()。这意味着您不能修改绘图对象本身或更改它们在允许传递给的参数之外的绘图方式upset()

所以,你可以做什么?

  • 根据您的真实情节的复杂程度(以及重新绘制它的频率),您可以这样做:
x <- c(a=80, b=9.9, c=5, 'a&b'=0.1, 'a&c'=1.65, 'c&b'=3.35) 
upset(fromExpression(x*100), order.by = "freq")

然后在inkscape/illustrator中编辑。(坏的)

  • 分叉UpSetR和劫持scale.intersectionsandscale.sets参数。在Make_main_bar()函数中,您只需将其处理“百分比”参数scale_intersections的方式更改为 ,并将Make_size_plot()处理相同参数的方式更改为scale_sets。这将变成:
x <- c(a=80, b=9.9, c=5, 'a&b'=0.1, 'a&c'=1.65, 'c&b'=3.35) 
upset(fromExpression(x*100), order.by = "freq",
      scale.intersections="percent", scale.sets="percent")

我个人UpSetR出于其他目的分叉了自己,但是该包通常需要进行重大重构,以便可以将其应用于其他用例。作者可能想阻止在他们的概念之外使用该概念。

于 2019-02-21T11:19:46.233 回答
2

令人不安的情节

library(UpSetR)
x <- c(a=80, b=9.9, c=5, 'a&b'=0.1, 'a&c'=1.65, 'c&b'=3.35) 
upset(fromExpression(x), order.by = "freq", show.numbers = 'yes')

你的问题

所以你想要两件事:

  • 百分比显示为十进制数字

  • 条形可见,即使是 0.1%

以十进制数字显示的百分比

您首先使用 . 将百分比向量转换为计数(整数)fromExpression。所以输入upset是一个数据框:

library(UpSetR)
x <- c(a=80, b=9.9, c=5, 'a&b'=0.1, 'a&c'=1.65, 'c&b'=3.35) 
str(fromExpression(x))
#> 'data.frame':    98 obs. of  3 variables:
#>  $ a: num  1 1 1 1 1 1 1 1 1 1 ...
#>  $ b: num  0 0 0 0 0 0 0 0 0 0 ...
#>  $ c: num  0 0 0 0 0 0 0 0 0 0 ...

upset然后在内部从该数据中获取标签,因此指向原始百分比的链接不再存在于upset.

目前,将标签作为百分比或其他一些自定义标签似乎不是包中该功能的受支持upset选项UpSetR

有一个show.numbers论点,但只允许在条形(show.numbers = "yes"show.numbers = "Yes")或不(任何其他值show.numbers)上显示那些绝对频率,这是涉及的代码位:

https://github.com/hms-dbmi/UpSetR/blob/fe2812c8cbe87af18c063dcee9941391c836e7b2/R/MainBar.R#L130-L132

因此,我认为您需要更改那段代码,即geom_textand aes_string,以使用不同的美学映射(您的相对频率)。所以也许要求开发人员这样做?

即使是 0.1% 也可以看到条形图

好吧,这最终取决于您的 y 轴动态范围和绘图的大小,即,如果最高的条比最短的条大很多,则可能无法在同一张图表中看到两者(除非您使 y-轴不连续)。

结论

我知道这并不是真正解决您的问题的方法,但它是一个希望为您指明解决问题的方向的答案。

于 2019-02-21T10:36:55.987 回答