Comment faire des gaufres en R?

11

Comment puis-je tracer un graphique gaufré comme alternative à l'utilisation de morceaux dans R?

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

Les plus proches que j'ai trouvés sur Google sont les mosaïques.

719016
la source
Je ne sais pas, mais pourquoi ne pas utiliser une meilleure méthode? Les graphiques à points sont bien meilleurs.
Peter Flom - Réintègre Monica
2
Pour ceux qui veulent savoir ce que sont les cartes de gaufre, Robert Kosara sur le blog Eager Eyes a un article à leur sujet. Prenez également note des commentaires de Jon Peltier.
Andy W
La chose la plus proche que j'ai pu trouver est la suivante . FWIW, je suis d'accord avec Peter, j'évite les tartes et les gaufres lorsque je visualise des données.

Réponses:

13

Maintenant, il y a un paquet appelé gaufre .

Exemple de la page github:

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

Résultat:

résultat

Cordialement

jbkunst
la source
Je ne savais pas que cela s'appelait des "cartes de gaufre". Je les aime - bon remplacement de
camembert
7

Je soupçonne que geom_tilele package ggplot2peut faire ce que vous recherchez. La réponse de Shane à cette question StackOverflow devrait vous aider à démarrer.

Edit: Voici un exemple, avec quelques autres tracés pour comparaison.

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")

Exemple de tracé de gaufre

De toute évidence, il y a du travail supplémentaire à faire pour obtenir une bonne esthétique (par exemple, qu'est-ce que ces axes signifient même?), Mais c'est la mécanique de celui-ci. Je laisse "jolie" comme exercice au lecteur.

Matt Parker
la source
3

En voici un en base r utilisant les données de @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')

entrez la description de l'image ici

rawr
la source
2
Tous les exemples semblent avoir un rapport encre / information élevé.
Frank Harrell
1
Je suis d'accord avec @Frank Harrell. L'exemple est singulièrement peu convaincant. J'adore les graphiques au-delà de toute mesure, mais pour cet exemple, il est raisonnable de s'attendre à ce que les lecteurs comprennent un tableau avec les quatre fréquences. Si un graphique est préféré, un graphique à points ou à barres est plus simple (les fréquences peuvent également être ajoutées sous forme d'annotation). Je peux imaginer une valeur pédagogique pour les très jeunes enfants.
Nick Cox
1
Vous dites donc que lorsque je présenterai cette intrigue à la convention annuelle des graphiques à barres, je devrais m'attendre à beaucoup de haineux dans la foule? merci pour l'
avertissement
Retournez-le: Le graphique semble dire aux lecteurs: regardez ici, vous pouvez compter par vous-même pour comprendre le graphique! Si les nombres sont grands, ce n'est pas possible. Si les nombres sont petits, ce n'est toujours pas plus utile que les autres graphiques. Pour les petits enfants, c'est du renforcement pour qu'ils comprennent les graphismes. Qui d'autre a besoin du message?
Nick Cox