Як скласти вафельні діаграми в R?


11

Як я можу створити графік вафельних виробів як альтернативу використанню пихартів в R?

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

Найближчі я знайшов googling там є mosaicplots.


Я не знаю, але чому б не скористатися кращим методом? Точкові діаграми набагато краще.
Пітер Флом

2
Для тих , хто хоче знати , що вафельні графіки, Роберт Kosara на Eager блозі Eyes є частина про них. Візьміть до уваги також коментарі Джона Пелтьє.
Енді Ш

Найближче, що я міг знайти, це це . FWIW, я згоден з Петром, я уникаю пиріжків та вафлі, коли я візуалізую дані.

Відповіді:


13

Зараз є пакет, який називається вафельний .

Приклад зі сторінки github:

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

Результат:

результат

З повагою


Я не знав, що їх називають "вафлевими картками". Мені вони подобаються - хороша заміна кругової діаграми
shadowtalker

7

Я підозрюю, що geom_tileз пакета ggplot2можна робити те, що ви шукаєте. Відповідь Шейн на це питання StackOverflow повинен розпочати.

Редагувати: Ось приклад з кількома іншими сюжетами для порівняння.

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

Приклад вафельного сюжету

Зрозуміло, що потрібно зробити додаткову роботу над правильною естетикою (наприклад, що, пекло, ці осі взагалі означають?), Але це механіка цього. Я залишаю «досить» як вправу для читача.


3

Ось один у базовій г із використанням даних @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')

введіть тут опис зображення


2
Здається, що всі приклади мають високе співвідношення чорнило: інформація.
Френк Харрелл

1
Я згоден з @Frank Harrell. Приклад - сингулярно непереконливий. Я люблю графіки поза мірою, але для цього прикладу розумно очікувати, що читачі зрозуміють таблицю з чотирма частотами. Якщо графік кращий, то крапка або діаграма є простішою (частоти можна також додавати як анотацію). Я можу уявити певну педагогічну цінність для зовсім маленьких дітей.
Нік Кокс

1
Отже, ви говорите, що, коли я презентую цей сюжет на щорічній конвенції бар-діаграми, я повинен очікувати багато ненависників у натовпі? спасибі за голову вгору
rawr

Поверніть: Граф, здається, говорить читачам: дивіться тут, ви можете порахувати, що зрозумієте графік! Якщо цифри великі, це неможливо. Якщо цифри невеликі, це все ще не корисніше, ніж інші графіки. Для маленьких дітей це підкріплення, щоб вони розуміли графіку. Кому ще потрібне повідомлення?
Нік Кокс

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.