Tenho um dataframe nomeado plot_df
em R com a seguinte estrutura:
# Import the library
library(ggplot2)
# Create a sample data
set.seed(123)
plot_df <- data.frame(gene = rep(paste0("ENSG", 1:10, ".17"), each = 2),
mean = rnorm(20, 0.5, 0.1),
sd = rnorm(20, 0.02, 0.01),
group = rep(c("group_a", "group_b"), 10))
Estou tentando criar um ggplot com pontos e barras de erro, onde o eixo y representa os nomes dos genes (como rótulos discretos), o eixo x representa os valores médios e a cor representa o grupo (ou "group_a" ou " grupo_b"). Aqui está o código que estou usando:
ggplot(plot_df, aes(y=gene)) +
geom_point(aes(x=mean, color = group), position = position_dodge(width=0.9)) +
geom_errorbar(aes(xmin=mean-sd, xmax=mean+sd, color = group), width=.2,
position=position_dodge(.9)) +
geom_vline(aes(xintercept=0.5), linetype=2, color = 'gray') +
theme_bw() +
theme(panel.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank())
No entanto, quero alterar a cor de fundo do painel com base nos nomes dos genes no eixo y (cada gene tem uma cor diferente ou os genes vizinhos não têm a mesma cor). Como meus rótulos do eixo y são discretos, não sei como conseguir isso. Qualquer ajuda seria apreciada. Obrigado!
Eu tentei:
Aqui está uma solução usando
geom_tile()
,geom_tile()
definiremos ax
estética de forma a cobrir toda a largura do terreno e ajustaremos a largura de cada ladrilho de acordo.geom_tile()
usax = sum(x_limits) / 2
para posicionar os ladrilhos no centro do lote ewidth = diff(x_limits)
garantir que cada ladrilho ocupe toda a largura do loteOutra opção seria usar
geom_rect
a convertendo osgene
s discretos em numéricos e adicionando-/+.5
forymin/ymax
. Além disso, definirxmin/max
permite-/+Inf
preencher todo o painel, onde também reduzi a expansão da escala y para.5
. Observe também que adicionei ascale_y_discrete
primeira camada para forçar uma escala discreta.