我正在为以下数据制作百分比的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%。所有数据在该图中都很重要。
答案 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
的任何其他值) ),这是其中涉及的代码位:
因此,我认为您需要更改这段代码,即geom_text
和aes_string
,以使用不同的美学映射(您的相对频率)。所以也许请开发者去做?
好吧,这最终取决于您的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.intersections
和scale.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
分叉用于其他目的,但是该程序包通常需要进行重大的重构,以便可以将其应用于其他用例。作者可能想要阻止在其概念之外使用该概念。