Ajuda para plotagem de mosaico em R

Sep 22 2020

Meu gráfico atual:

Meu gráfico desejado (esqueça as variáveis ​​s)

Especificamente: variáveis ​​explicativas na parte inferior com eixo x, variáveis ​​de resposta à direita, frequência relativa e eixo y à esquerda . Vou anexar meu código R abaixo.

mosaictable <- matrix (c (3, 9, 22, 21), byrow = T, ncol = 2)
rownames (mosaictable) = c ("White", "Blue ")
colnames (mosaictable) = c ("Captured", "Not Captured")
mosaicplot  ((mosaictable), sub = "Pigeon Color", ylab = "Relative frequency", 
            col = c ("firebrick", "goldenrod1"), font = 2, main = "Mosaic Plot of Pigeon Color and Their Capture Rate"
            
            )
axis (1)
axis (4)

Respostas

AchimZeileis Oct 28 2020 at 11:57

Este tipo particular de exibição em mosaico, onde você tem uma variável "dependente" no eixo y e deseja adicionar a anotação correspondente, às vezes também é chamado de "gráfico da coluna". R implementa isso na spineplot()função. Também plot(y ~ x)chama internamente spineplot()quando ye xsão categóricos.

No seu caso, spineplot()faz quase tudo o que você deseja automaticamente, desde que você forneça um "table"objeto formatado de forma adequada:

tab <- as.table(matrix(c(3, 22, 9, 21), ncol = 2))
dimnames(tab) <- list(
  "Pigeon Color" = c("White", "Blue"),
  "Relative Frequency" = c("Captured", "Not Captured")
)
tab
##             Relative Frequency
## Pigeon Color Captured Not Captured
##        White        3            9
##        Blue        22           21

E então você obtém:

spineplot(tab)

Pessoalmente, eu deixaria por isso mesmo. Mas se for realmente importante mudar os rótulos dos eixos da esquerda para a direita e vice-versa, você pode fazer isso primeiro suprimindo axes = FALSEe, em seguida, adicionando-os manualmente depois. As coordenadas para isso precisam ser obtidas a partir da distribuição marginal da primeira variável e da distribuição condicional da segunda variável dada a primeira, respectivamente

x <- prop.table(margin.table(tab, 1))
y <- prop.table(tab, 1)[2, ]
spineplot(tab, col = c("firebrick", "goldenrod1"), axes = FALSE)
axis(1, at = c(0, x[1]) + x/2, labels = rownames(tab), tick = FALSE)
axis(2)
axis(4, at = c(0, y[1]) + y/2, labels = colnames(tab), tick = FALSE)