Предположим, что фрейм данных
n <- 100
d <- data.frame("name" = c(rep("A", n), rep("B", n)),
"type" = rep(c("X", "Y"), 2*n),
"value" = c(rnorm(n, 0, 1), rbeta(n, 1, 3)))
И следующий скрипичный сюжет:
ggplot(d, aes(name, value, fill = type)) +
geom_violin(trim = F, position = dodge, na.rm = T) +
geom_boxplot(width = 0.1, position = dodge, na.rm = T) +
facet_wrap(facets = ~name, scales = 'free') +
theme(legend.position = "bottom",
axis.title.x = element_blank(),
legend.title = element_blank(),
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
legend.key.width = unit(0.5, "cm")) +
ggh4x::scale_y_facet(
name == "B",
trans = "log10",
breaks = breaks_log(),
labels = label_log())
что, к сожалению, не работает, поскольку я получаю сообщение
Warning messages:
1: In transformation$transform(x) : NaNs produced
2: In scale_facet(expr = enquo(expr), "y", ..., type = type) :
log-10 transformation introduced infinite values.
3: In transformation$transform(x) : NaNs produced
4: In scale_facet(expr = enquo(expr), "y", ..., type = type) :
log-10 transformation introduced infinite values.
5: In transformation$transform(x) : NaNs produced
6: In scale_facet(expr = enquo(expr), "y", ..., type = type) :
log-10 transformation introduced infinite values.
7: In transformation$transform(x) : NaNs produced
8: In scale_facet(expr = enquo(expr), "y", ..., type = type) :
log-10 transformation introduced infinite values.
Значения, передаваемые в преобразование журнала, строго положительные, так что это не проблема. Я предполагаю, что проблема заключается в том, что только после преобразования журнала я получаю отрицательные значения (индикатором этого является предел для оси Y, начинающийся выше 0). Итак, мне нужно настроить ось Y или, точнее, разрешить breaks
принимать отрицательные значения. Как это сделать?
@Эдвард, я уверен.
@Эдвард, я трансформирую бревна rbeta(n, 1, 3)
(name == B
)
Вы бы предпочли trans = pseudo_log_trans(base = 10)
? Возможно, вам придется отрегулировать перерывы.
График скрипки расширяет данные на хвостах (поскольку вы не обрезали), поэтому вы можете получить некоторые отрицательные значения. Вы можете предотвратить появление предупреждений, используя преобразование pseudo_log:
ggplot(d, aes(name, value, fill = type)) +
geom_violin(trim = F, position = "dodge", na.rm = T) +
geom_boxplot(width = 0.1, position = "dodge", na.rm = T) +
facet_wrap(facets = ~name, scales = 'free') +
theme(legend.position = "bottom",
axis.title.x = element_blank(),
legend.title = element_blank(),
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
legend.key.width = unit(0.5, "cm")) +
ggh4x::scale_y_facet(
name == "B",
#trans = "log10",
#breaks = breaks_log(),
trans = pseudo_log_trans(base = 10),
breaks = 10^(c(-5, -1, 0)),
labels = label_log())
Обратите внимание: если вы пропустите вызов violin_plot
(или обрежете хвосты), вы не получите предупреждений.
Вы уверены в том, что «Значения, введенные в преобразование журнала, строго положительны»?