Làm thế nào để tạo biểu đồ bánh quế trong R?


11

Làm thế nào tôi có thể vẽ biểu đồ bánh quế thay thế cho việc sử dụng piecharts trong R?

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

Gần nhất tôi tìm thấy googling ngoài kia là khảm.


Tôi không biết, nhưng tại sao không sử dụng một phương pháp tốt hơn? Biểu đồ chấm tốt hơn nhiều.
Peter Flom - Tái lập Monica

2
Đối với những người muốn biết biểu đồ bánh quế là gì, Robert Kosara trên blog Eager Eyes có một phần về họ. Hãy ghi lại ý kiến ​​của Jon Peltier.
Andy W

Điều gần nhất tôi có thể tìm thấy là đây . FWIW, tôi đồng ý với Peter, tôi tránh bánh nướng và bánh quế khi tôi hình dung dữ liệu.

Câu trả lời:


13

Bây giờ có một gói gọi là bánh quế .

Ví dụ từ trang github:

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

Kết quả:

kết quả

Trân trọng


Tôi không biết chúng được gọi là "biểu đồ bánh quế". Tôi thích chúng - thay thế biểu đồ hình tròn tốt
Shadowtalker 20/03/2015

7

Tôi nghi ngờ rằng geom_tiletừ gói ggplot2có thể làm những gì bạn đang tìm kiếm. Câu trả lời của Shane cho câu hỏi StackOverflow này sẽ giúp bạn bắt đầu.

Chỉnh sửa: Đây là một ví dụ, với một vài cốt truyện khác để so sánh.

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

Ví dụ cốt truyện bánh quế

Rõ ràng, có nhiều việc phải làm để có được tính thẩm mỹ đúng (ví dụ, những cái rìu đó có ý nghĩa gì?), Nhưng đó là cơ chế của nó. Tôi để "đẹp" như một bài tập cho người đọc.


3

Đây là một trong cơ sở r sử dụng dữ liệu của @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')

nhập mô tả hình ảnh ở đây


2
Tất cả các ví dụ dường như có tỷ lệ mực: thông tin cao.
Frank Harrell

1
Tôi đồng ý với @Frank Harrell. Ví dụ này là không thuyết phục. Tôi thích đồ thị vượt quá số đo, nhưng với ví dụ này, thật hợp lý khi mong độc giả hiểu một bảng có bốn tần số. Nếu một biểu đồ được ưa thích, thì biểu đồ dấu chấm hoặc thanh đơn giản hơn (tần số cũng có thể được thêm dưới dạng chú thích). Tôi có thể tưởng tượng một số giá trị sư phạm cho trẻ nhỏ.
Nick Cox

1
Vì vậy, bạn đang nói rằng khi tôi trình bày cốt truyện này tại hội nghị biểu đồ thanh hàng năm, tôi có nên mong đợi rất nhiều người ghét trong đám đông không? cảm ơn vì đã ngẩng cao đầu
rawr

Xoay tròn: Biểu đồ dường như đang nói với độc giả: nhìn vào đây, bạn có thể tự mình đếm để hiểu biểu đồ! Nếu số lượng lớn, điều đó là không thể. Nếu số lượng nhỏ, nó vẫn không hữu ích hơn các biểu đồ khác. Đối với trẻ nhỏ, đó là sự củng cố để chúng hiểu đồ họa. Ai khác cần tin nhắn?
Nick Cox

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.