R'de waffle grafikleri nasıl yapılır?


11

R'de piecharts kullanmaya alternatif olarak bir gözleme grafiğini nasıl çizebilirim?

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

Google'da bulduğum en yakın mozaik tablolar var.


Bilmiyorum, ama neden daha iyi bir yöntem kullanmıyorsun? Nokta grafikleri çok daha iyi.
Peter Flom

2
Waffle listelerinin ne olduğunu bilmek isteyenler için, Eager Eyes blogundaki Robert Kosara'nın onlar hakkında bir parçası var. Jon Peltier'in yorumlarını da not edin.
Andy W

Bulabildiğim en yakın şey bu . FWIW, Peter'a katılıyorum, verileri görselleştirdiğimde turta ve wafflelardan kaçınıyorum.

Yanıtlar:


13

Şimdi waffle adında bir paket var .

Github sayfasından bir örnek:

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

Sonuç:

sonuç

Saygılarımızla


Bunların "waffle çizelgeleri" olarak adlandırıldığını bilmiyordum. Onları seviyorum - iyi pasta grafik değiştirme
shadowtalker

7

geom_tilePaketten ggplot2aradığınızı yapabileceğinden şüpheleniyorum . Shane'in bu StackOverflow sorusundaki cevabı başlamanızı sağlamalıdır.

Düzenleme: Karşılaştırma için birkaç çizim ile bir örnek.

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

Örnek waffle grafiği

Açıkçası, estetiği doğru yapmak için yapılması gereken ekstra işler var (örneğin, bu eksenlerin ne anlama geldiği bile?), Ama bunun mekaniği bu. Okuyucu için bir alıştırma olarak “güzel” bırakıyorum.


3

@Jbkunst'in verilerini kullanan temel r'de bir tane:

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

resim açıklamasını buraya girin


2
Tüm örneklerin yüksek mürekkep: bilgi oranına sahip olduğu görülmektedir.
Frank Harrell

1
@Frank Harrell'a katılıyorum. Örnek tekil ikna edicidir. Ölçülerin ötesinde grafikleri seviyorum, ancak bu örnek için okuyucuların dört frekanslı bir tablo anlamalarını beklemek mantıklı. Bir grafik tercih edilirse, bir nokta veya çubuk grafik daha basittir (frekanslar ek açıklama olarak da eklenebilir). Çok küçük çocuklar için pedagojik bir değer hayal edebiliyorum.
Nick Cox

1
Yani sen, bu grafiği yıllık çubuk grafik toplantısında sunduğumda, kalabalığın içinde çok sayıda nefret beklemem gerektiğini mi söylüyorsun? yukarı için teşekkürler
rawr

Dönün: Grafik okuyuculara söylüyor: buraya bakın, grafiği anlamak için kendinize güvenebilirsiniz! Sayılar büyükse, bu mümkün değildir. Sayılar küçükse, diğer grafiklerden daha yararlı değildir. Küçük çocuklar için, bu takviye, böylece grafikleri anlıyorlar. Bu mesaja başka kimin ihtiyacı var?
Nick Cox

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.