Como fazer waffles em R?


11

Como plotar um gráfico de waffles como alternativa ao uso de gráficos de partes em R?

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

O mais próximo que eu encontrei pesquisando lá fora é o mosaico.


Não sei, mas por que não usar um método melhor? Os gráficos de pontos são muito melhores.
Peter Flom - Restabelece Monica

2
Para quem quer saber o que são tabelas de waffles, Robert Kosara, no blog Eager Eyes, tem uma matéria sobre eles. Tome nota dos comentários de Jon Peltier também.
Andy W

A coisa mais próxima que pude encontrar é essa . FWIW, concordo com Peter, evito tortas e waffles ao visualizar dados.

Respostas:


13

Agora há um pacote chamado waffle .

Exemplo da página do github:

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

Resultado:

resultado

Saudações


Eu não sabia que esses eram chamados de "waffle charts". Eu gosto deles - boa carta de torta de substituição
shadowtalker

7

Eu suspeito que geom_tileo pacote ggplot2possa fazer o que você está procurando. A resposta de Shane nesta pergunta do StackOverflow deve ajudá-lo a começar.

Editar: Aqui está um exemplo, com alguns outros gráficos para comparação.

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

Exemplo de plotagem de waffles

Claramente, há um trabalho extra a ser feito para acertar a estética (por exemplo, o que diabos esses eixos significam?), Mas essa é a mecânica disso. Deixo "bonito" como um exercício para o leitor.


3

Aqui está um na base r usando os dados do @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')

insira a descrição da imagem aqui


2
Todos os exemplos parecem ter uma alta taxa de tinta: informação.
Frank Harrell

1
Eu concordo com @Frank Harrell. O exemplo é singularmente pouco convincente. Adoro gráficos além da medida, mas, para este exemplo, é razoável esperar que os leitores entendam uma tabela com as quatro frequências. Se um gráfico for o preferido, um gráfico de pontos ou barras é mais simples (as frequências também podem ser adicionadas como anotação). Eu posso imaginar algum valor pedagógico para crianças muito pequenas.
Nick Cox

1
Então você está dizendo que, quando apresento esse gráfico na convenção anual do gráfico de barras, devo esperar muitos inimigos na multidão? Obrigado pela
atenção

Vire-o: O gráfico parece estar dizendo aos leitores: veja aqui, você pode contar para entender o gráfico! Se os números forem grandes, isso não é possível. Se os números forem pequenos, ainda não será mais útil que outros gráficos. Para crianças pequenas, isso é reforço para que eles entendam os gráficos. Quem mais precisa da mensagem?
Nick Cox

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.