在UpSetR中,如何在交点上显示小数

时间:2019-02-21 09:49:41

标签: r upsetr

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

  

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”)

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

2 个答案:

答案 0 :(得分: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_textaes_string,以使用不同的美学映射(您的相对频率)。所以也许请开发者去做?

即使是0.1%的条也可见

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

结论

我了解这并不是解决您问题的方法,但这是一个答案,有望为您指明解决问题的方向。

答案 1 :(得分:1)

快速解决此问题的两个事实:

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

一种潜在的解决方案是代替使用整个对象来使用分数对象,但是upset()要做的第一件事是检查数据框中的哪些列具有"0""1"作为他们唯一的水平。这是硬编码的。如果失败,则startend对象将变为NULL,并且该函数将无法执行任何操作。

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

绘制完成后,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.intersectionsscale.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分叉用于其他目的,但是该程序包通常需要进行重大的重构,以便可以将其应用于其他用例。作者可能想要阻止在其概念之外使用该概念。