Bagaimana cara membuat grafik wafel di R?


11

Bagaimana saya bisa melakukan plot grafik wafel sebagai alternatif untuk menggunakan piecharts di R?

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

Yang paling dekat yang saya temukan di Google adalah mosaicplots.


Saya tidak tahu, tetapi mengapa tidak menggunakan metode yang lebih baik? Dot chart jauh lebih baik.
Peter Flom - Pasang kembali Monica

2
Bagi mereka yang ingin tahu apa itu waffle chart, Robert Kosara di blog Eager Eyes memiliki artikel tentang mereka. Perhatikan juga komentar Jon Peltier.
Andy W

Hal terdekat yang bisa saya temukan adalah ini . FWIW, saya setuju dengan Peter, saya menghindari pai dan wafel ketika saya memvisualisasikan data.

Jawaban:


13

Sekarang ada paket yang disebut wafel .

Contoh dari halaman github:

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

Hasil:

hasil

Salam


Saya tidak tahu ini disebut "grafik wafel". Saya suka mereka - pengganti pie chart yang bagus
shadowtalker

7

Saya menduga bahwa geom_tiledari paket tersebut ggplot2dapat melakukan apa yang Anda cari. Jawaban Shane pada pertanyaan StackOverflow ini seharusnya membantu Anda memulai.

Sunting: Berikut ini contohnya, dengan beberapa plot lain untuk perbandingan.

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

Contoh plot wafel

Jelas, ada pekerjaan tambahan yang harus dilakukan untuk mendapatkan estetika yang benar (misalnya, apa artinya kapak itu?), Tapi itulah mekanismenya. Saya meninggalkan "cantik" sebagai latihan untuk pembaca.


3

Inilah satu di base r menggunakan data @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')

masukkan deskripsi gambar di sini


2
Semua contoh tampaknya memiliki rasio tinta: informasi yang tinggi.
Frank Harrell

1
Saya setuju dengan @Frank Harrell. Contohnya sangat tidak meyakinkan. Saya suka grafik di luar batas, tetapi untuk contoh ini masuk akal untuk mengharapkan pembaca untuk memahami tabel dengan empat frekuensi. Jika grafik lebih disukai, maka diagram titik atau bilah lebih sederhana (frekuensi juga dapat ditambahkan sebagai anotasi). Saya dapat membayangkan beberapa nilai pedagogis untuk anak-anak yang sangat muda.
Nick Cox

1
Jadi Anda mengatakan bahwa ketika saya menyajikan plot ini di konvensi grafik batang tahunan, saya harus berharap banyak pembenci di kerumunan? terima kasih untuk semuanya
Rawr

Putar balik: Grafik tampaknya mengatakan kepada pembaca: lihat di sini, Anda dapat menghitung sendiri untuk memahami grafik! Jika angkanya besar, itu tidak mungkin. Jika angkanya kecil, itu masih tidak lebih membantu daripada grafik lainnya. Untuk anak kecil, itu penguatan sehingga mereka mengerti grafis. Siapa lagi yang butuh pesan?
Nick Cox

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.