Tenho um gráfico de violino+boxplots que faço com os iris
dados como exemplo, assim:
data(iris)
iris_long <- as.data.frame(tidyr::pivot_longer(iris, -Species, names_to = "variable", values_to = "value"))
P <- ggplot2::ggplot(iris_long, ggplot2::aes(x=variable, y=value)) +
ggplot2::geom_violin() +
ggplot2::geom_boxplot(width=0.2, alpha=0, outlier.shape=NA, coef=0, show.legend=FALSE) +
ggplot2::stat_summary(fun=mean, geom="point", shape=16, size=2, show.legend=FALSE) +
ggplot2::theme_light()
grDevices::pdf(file="test.pdf", height=4, width=8)
print(P)
grDevices::dev.off()
O que produz este gráfico:
Agora também tenho um quadro de dados com valores de corte por nível de variável, como este:
cutoffs <- data.frame(variable=sort(names(iris)[-length(names(iris))]), cutoff=c(7,2.5,8,4.5))
Quero apenas plotá-los como barras de corte vermelhas em cima de cada violino+boxplot, para que o resultado fique parecido com este:
Qual seria a melhor maneira de fazer isso geom_segment
? Ou existe uma maneira mais fácil com talvez geom_errorbar
?
EDITAR
Agora estou tentando fazer o mesmo, mas incluindo as Species
informações no gráfico violin+boxplots. Depois que adiciono fill=Species
(com os dados formatados apropriadamente), recebo um erro geom_segment
que não sei como depurar.
Além disso, mesmo sem geom_segment
os violinos, os boxplots não se alinham bem.
Como posso depurar o erro abaixo e alinhar os violinos e os boxplots corretamente?
Observe que, para os segmentos, ainda quero apenas um corte por nível de variável (um para altura da sépala, um para largura da sépala, um para altura da pétala e um para largura da pétala).
Este é o novo código:
data(iris)
iris_long <- as.data.frame(tidyr::pivot_longer(iris, cols=names(iris)[-length(names(iris))],
names_to = "variable", values_to = "value"))
cutoffs <- data.frame(variable=sort(names(iris)[-length(names(iris))]), cutoff=c(7,2.5,8,4.5))
P <- ggplot2::ggplot(iris_long, ggplot2::aes(x=variable, y=value, fill=Species)) +
ggplot2::geom_violin() +
ggplot2::geom_boxplot(width=0.2, alpha=0, outlier.shape=NA, coef=0, show.legend=FALSE) +
ggplot2::stat_summary(fun=mean, geom="point", shape=16, size=2, show.legend=FALSE) +
ggplot2::geom_segment(data=cutoffs, ggplot2::aes(x=as.numeric(as.factor(variable)) - .25,
xend=as.numeric(as.factor(variable)) + .25,
y=cutoff, yend=cutoff), color = "red", alpha=0.75) +
ggplot2::theme_light()
grDevices::pdf(file="test.pdf", height=4, width=8)
print(P)
grDevices::dev.off()
E o erro:
Erro em
ggplot2::geom_segment()
: ! Problema ao calcular a estética. ℹ Ocorreu um erro na 4ª camada. Causado pelo erro: ! objeto 'Espécie' não encontrado Executerlang::last_trace()
para ver onde ocorreu o erro.
Sim, eu simplesmente adicionaria um
geom_segment
:que produz este gráfico:
NB Acho que seus cortes estão um pouco confusos (por isso as linhas não se alinham)
Para incorporar a estética de preenchimento, você precisa fornecer um explícito
position_dodge
parageom_violin
,geom_boxplot
estat_summary
. Além disso, você deve definir a estética de preenchimento para o segmento como ,NULL
caso contrário, ele tentará procurá-lo:produz: