В UpSetR, как показать десятичное число на панели пересечения

Я делаю диаграмму расстройства для следующих данных в процентах. Это фиктивный пример для моих более сложных данных.

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%. Все данные важны в этом сюжете.

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_text а также aes_string, чтобы использовать другое эстетическое отображение (ваши относительные частоты). Так может попросить разработчика сделать это?

Бары видны, даже если это 0,1%

Ну, это в конечном итоге зависит от вашего динамического диапазона оси Y и размера вашего графика, то есть, если самый высокий столбец намного больше самого короткого, чем может быть невозможно увидеть оба на одном графике (если вы не сделаете ось прерывистая).

Заключение

Я понимаю, что на самом деле это не решение вашей проблемы, но это ответ, который, мы надеемся, укажет вам направление решения вашей проблемы.

Два факта стоят на пути быстрого и легкого решения этой проблемы:

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 я для других целей, но пакет в целом нуждается в серьезном рефакторинге, чтобы его можно было применить к дополнительным случаям использования. Авторы, возможно, хотели предотвратить использование концепции вне их концепции.

Другие вопросы по тегам