在UpSetR中,如何在交集柱上显示小数?

3
我正在为下面的百分比数据制作一个不满意的图表。这只是我更复杂数据的虚拟示例。
``` 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%也可以看到所有的条形图。在此绘图中,所有数据都很重要。请注意,保留HTML标签。
2个回答

2
两个事实阻碍了这个问题的快速和简单的解决方案: 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()函数中,您只需更改处理“percent”参数的方式为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,但是这个软件包需要进行重大重构,以便可以应用于更多的用例。作者可能希望防止概念在他们的概念之外使用。"最初的回答"

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中。

目前来看,使用百分比或其他自定义标签似乎不是UpSetR包中upset函数的支持选项。

有一个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
感谢您提供详细的评论。我现在将百分比乘以10并在Inkscape中更改输出PDF。这是一次性的绘图,所以它有效。 - XtrimA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接