Mosaic Plot Help in R

Sep 22 2020

La mia trama attuale:

la trama desiderata (non importa le variabili)

Nello specifico: variabili esplicative in basso con asse x, variabili di risposta a destra, frequenza relativa e asse y a sinistra . Allegherò il mio codice R di seguito.

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)

Risposte

AchimZeileis Oct 28 2020 at 11:57

Questo particolare tipo di visualizzazione a mosaico in cui si ha una variabile "dipendente" sull'asse y e si desidera aggiungere l'annotazione corrispondente, a volte viene anche chiamato "grafico della colonna vertebrale". R lo implementa nella spineplot()funzione. Anche plot(y ~ x)internamente chiama spineplot()quando entrambi ye xsono categorici.

Nel tuo caso, spineplot()fa quasi tutto ciò che desideri automaticamente a condizione che lo fornisca un "table"oggetto ben formattato :

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 poi ottieni:

spineplot(tab)

Personalmente, lo lascerei a questo. Ma se è davvero importante cambiare le etichette degli assi da sinistra a destra e viceversa, puoi farlo prima sopprimendole axes = FALSEe poi aggiungendole manualmente in seguito. Le coordinate per quella devono essere ottenute dalla distribuzione marginale della prima variabile e dalla distribuzione condizionale della seconda variabile data la prima, rispettivamente

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)