Wie erstelle ich Waffel-Charts in R?

11

Wie kann ich ein Waffeldiagramm als Alternative zur Verwendung von Kreisdiagrammen in R zeichnen?

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

Das nächste, was ich dort draußen beim Googeln gefunden habe, sind Mosaikplots.

719016
quelle
Ich weiß es nicht, aber warum nicht eine bessere Methode anwenden? Punktdiagramme sind viel besser.
Peter Flom - Wiedereinsetzung von Monica
2
Für diejenigen, die wissen wollen, was Waffel-Charts sind, hat Robert Kosara im Eager Eyes-Blog ein Stück über sie. Beachten Sie auch die Kommentare von Jon Peltier.
Andy W
Das Nächste, was ich finden konnte, ist das hier . FWIW, ich stimme Peter zu, ich vermeide Kuchen und Waffeln, wenn ich Daten visualisiere.

Antworten:

13

Jetzt gibt es ein Paket namens Waffel .

Beispiel von der Github-Seite:

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

Ergebnis:

Ergebnis

Grüße

jbkunst
quelle
Ich wusste nicht, dass diese "Waffelkarten" genannt werden. Ich mag sie - guter Ersatz für
Tortendiagramme
7

Ich vermute, dass geom_tileaus dem Paket machen ggplot2kann, was Sie suchen. Die Antwort von Shane auf diese StackOverflow-Frage sollte Ihnen den Einstieg erleichtern .

Bearbeiten: Hier ist ein Beispiel mit einigen anderen Plots zum Vergleich.

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

Beispiel Waffelplot

Natürlich muss noch zusätzliche Arbeit geleistet werden, um die richtige Ästhetik zu erzielen (z. B. was zum Teufel bedeuten diese Achsen überhaupt?), Aber das ist die Mechanik davon. Ich lasse "hübsch" als Übung für den Leser.

Matt Parker
quelle
3

Hier ist eine in Basis r, die die Daten von @jbkunst verwendet:

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

Geben Sie hier die Bildbeschreibung ein

rawr
quelle
2
Alle Beispiele scheinen ein hohes Verhältnis von Tinte zu Information zu haben.
Frank Harrell
1
Ich stimme @Frank Harrell zu. Das Beispiel ist einzigartig wenig überzeugend. Ich liebe unermessliche Grafiken, aber für dieses Beispiel ist zu erwarten, dass die Leser eine Tabelle mit den vier Frequenzen verstehen. Wenn ein Diagramm bevorzugt wird, ist ein Punkt- oder Balkendiagramm einfacher (die Frequenzen können auch als Anmerkung hinzugefügt werden). Ich kann mir einen pädagogischen Wert für sehr kleine Kinder vorstellen.
Nick Cox
1
Sie sagen also, wenn ich diese Handlung auf der jährlichen Balkendiagramm-Convention präsentiere, sollte ich viele Hasser in der Menge erwarten? danke für die Heads-Ups
rawr
Drehen Sie es um: Die Grafik scheint den Lesern zu sagen: Schauen Sie hier, Sie können sich darauf verlassen, dass Sie die Grafik verstehen! Wenn die Zahlen groß sind, ist das nicht möglich. Wenn die Zahlen klein sind, ist es immer noch nicht hilfreicher als andere Grafiken. Für kleine Kinder ist das eine Verstärkung, damit sie Grafiken verstehen. Wer braucht die Nachricht noch?
Nick Cox
1
Eine weitere Diskussion unter perceptualedge.com/articles/visual_business_intelligence/…
Nick Cox