我正在为以下百分比数据制作一个不安图。这是我更复杂数据的一个虚拟示例。
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%。所有数据在此图中都很重要。
有两个事实阻碍了快速轻松地解决这个问题:
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.intersections
andscale.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
出于其他目的分叉了自己,但是该包通常需要进行重大重构,以便可以将其应用于其他用例。作者可能想阻止在他们的概念之外使用该概念。
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
and aes_string
,以使用不同的美学映射(您的相对频率)。所以也许要求开发人员这样做?
好吧,这最终取决于您的 y 轴动态范围和绘图的大小,即,如果最高的条比最短的条大很多,则可能无法在同一张图表中看到两者(除非您使 y-轴不连续)。
我知道这并不是真正解决您的问题的方法,但它是一个希望为您指明解决问题的方向的答案。