Come creare grafici per waffle in R?


11

Come posso tracciare un diagramma di cialde come alternativa all'utilizzo dei pezzi in R?

help.search("waffle")
No help files found with alias or concept or title matching waffle
using fuzzy matching.

Il più vicino che ho trovato su Google là fuori sono i diagrammi a mosaico.


Non lo so, ma perché non usare un metodo migliore? I grafici a punti sono molto meglio.
Peter Flom - Ripristina Monica

2
Per coloro che vogliono sapere cosa sono le classifiche waffle, Robert Kosara sul blog Eager Eyes ne ha un pezzo . Prendi nota anche dei commenti di Jon Peltier.
Andy W,

La cosa più vicina che potrei trovare è questa . FWIW, sono d'accordo con Peter, evito torte e waffle quando visualizzo i dati.

Risposte:


13

Ora c'è un pacchetto chiamato waffle .

Esempio dalla pagina github:

parts <- c(80, 30, 20, 10)
waffle(parts, rows=8)

Risultato:

risultato

Saluti


Non sapevo che si chiamassero "grafici per waffle". Mi piacciono - buona sostituzione del grafico a torta
Shadowtalker

7

Ho il sospetto che geom_tiledal pacchetto ggplot2possa fare quello che stai cercando. La risposta di Shane su questa domanda StackOverflow dovrebbe iniziare.

Modifica: ecco un esempio, con alcuni altri grafici per il confronto.

library(ggplot2)

# Here's some data I had lying around
tb <- structure(list(region = c("Africa", "Asia", "Latin America", 
"Other", "US-born"), ncases = c(36L, 34L, 56L, 2L, 44L)), .Names = c("region", 
"ncases"), row.names = c(NA, -5L), class = "data.frame")


# A bar chart of counts
ggplot(tb, aes(x = region, weight = ncases, fill = region)) +
    geom_bar()

# Pie chart.  Forgive me, Hadley, for I must sin.
ggplot(tb, aes(x = factor(1), weight = ncases, fill = region)) +
    geom_bar(width = 1) +
    coord_polar(theta = "y") +
    labs(x = "", y = "")

# Percentage pie.
ggplot(tb, aes(x = factor(1), weight = ncases/sum(ncases), fill = region)) +
    geom_bar() +
    scale_y_continuous(formatter = 'percent') +
    coord_polar(theta = "y") +
    labs(x = "", y = "")


# Waffles
# How many rows do you want the y axis to have?
ndeep <- 5

# I need to convert my data into a data.frame with uniquely-specified x
# and y coordinates for each case
# Note - it's actually important to specify y first for a
# horizontally-accumulating waffle
# One y for each row; then divide the total number of cases by the number of
# rows and round up to get the appropriate number of x increments
tb4waffles <- expand.grid(y = 1:ndeep,
                          x = seq_len(ceiling(sum(tb$ncases) / ndeep)))

# Expand the counts into a full vector of region labels - i.e., de-aggregate
regionvec <- rep(tb$region, tb$ncases)

# Depending on the value of ndeep, there might be more spots on the x-y grid
# than there are cases - so fill those with NA
tb4waffles$region <- c(regionvec, rep(NA, nrow(tb4waffles) - length(regionvec)))

# Plot it
ggplot(tb4waffles, aes(x = x, y = y, fill = region)) + 
    geom_tile(color = "white") + # The color of the lines between tiles
    scale_fill_manual("Region of Birth",
                      values = RColorBrewer::brewer.pal(5, "Dark2")) +
    opts(title = "TB Cases by Region of Birth")

Esempio di trama waffle

Chiaramente, c'è del lavoro extra da fare per ottenere l'estetica giusta (ad esempio, cosa diavolo significano quegli assi anche?), Ma questa è la meccanica di ciò. Lascio "bello" come esercizio per il lettore.


3

Eccone uno in base r usando i dati di @jbkunst:

waffle <- function(x, rows, cols = seq_along(x), ...) {
  xx <- rep(cols, times = x)
  lx <- length(xx)
  m <- matrix(nrow = rows, ncol = (lx %/% rows) + (lx %% rows != 0))
  m[1:length(xx)] <- xx

  op <- par(no.readonly = TRUE)
  on.exit(par(op))

  par(list(...))
  plot.new()
  o <- cbind(c(row(m)), c(col(m))) + 1
  plot.window(xlim = c(0, max(o[, 2]) + 1), ylim = c(0, max(o[, 1]) + 1),
              asp = 1, xaxs = 'i', yaxs = 'i')
  rect(o[, 2], o[, 1], o[, 2] + .85, o[, 1] + .85, col = c(m), border = NA)

  invisible(list(m = m, o = o))
}


cols <- c("#F8766D", "#7CAE00", "#00BFC4", "#C77CFF")
m <- waffle(c(80, 30, 20, 10), rows = 8, cols = cols, mar = c(0,0,0,7),
            bg = 'cornsilk')
legend('right', legend = LETTERS[1:4], pch = 15, col = cols, pt.cex = 2,
       bty = 'n')

inserisci qui la descrizione dell'immagine


2
Tutti gli esempi sembrano avere un inchiostro elevato: rapporto di informazione.
Frank Harrell,

1
Sono d'accordo con @Frank Harrell. L'esempio è singolarmente poco convincente. Amo i grafici oltre misura, ma per questo esempio è ragionevole aspettarsi che i lettori comprendano una tabella con le quattro frequenze. Se si preferisce un grafico, un punto o un grafico a barre è più semplice (le frequenze possono essere aggiunte anche come annotazione). Posso immaginare un valore pedagogico per i bambini molto piccoli.
Nick Cox,

1
Quindi stai dicendo che quando presenterò questa trama alla convention annuale del grafico a barre, dovrei aspettarmi un sacco di nemici in mezzo alla folla? grazie per l'heads-up
rawr

Giralo: il grafico sembra dire ai lettori: guarda qui, puoi contare per capire il grafico! Se i numeri sono grandi, non è possibile. Se i numeri sono piccoli, non è ancora più utile di altri grafici. Per i bambini piccoli, questo è un rinforzo in modo che capiscano la grafica. Chi altri ha bisogno del messaggio?
Nick Cox,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.