วิธีการทำแผนภูมิวาฟเฟิลใน R?


11

ฉันจะพล็อตแผนภูมิวาฟเฟิลเป็นทางเลือกแทนการใช้แผนภูมิวงกลมใน R ได้อย่างไร

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

ที่ใกล้ที่สุดที่ฉันพบ googling ออกมี mosaicplots


ฉันไม่รู้ แต่ทำไมไม่ใช้วิธีที่ดีกว่า แผนภูมิ Dot ดีกว่ามาก
Peter Flom

2
สำหรับผู้ที่ต้องการทราบว่าแผนภูมิวาฟเฟิลคืออะไร Robert Kosara ในบล็อก Eager Eyes มีเนื้อหาเกี่ยวกับพวกเขา รับทราบความคิดเห็นของ Jon Peltier ด้วย
Andy W

สิ่งที่ใกล้เคียงที่ฉันสามารถหาเป็นนี้ FWIW ฉันเห็นด้วยกับ Peter ฉันหลีกเลี่ยงพายและวาฟเฟิลเมื่อฉันเห็นภาพข้อมูล

คำตอบ:


13

ขณะนี้มีเป็นแพคเกจที่เรียกว่าวาฟเฟิล

ตัวอย่างจากหน้า github:

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

ผลลัพธ์:

ผลลัพธ์

ความนับถือ


ฉันไม่รู้ว่าสิ่งเหล่านี้เรียกว่า "แผนภูมิวาฟเฟิล" ฉันชอบพวกเขา - การเปลี่ยนแผนภูมิวงกลมที่ดี
shadowtalker

7

ฉันสงสัยว่าgeom_tileจากแพ็คเกจggplot2สามารถทำสิ่งที่คุณกำลังมองหา คำตอบของ Shane สำหรับคำถาม 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

นี่คือหนึ่งในฐาน r โดยใช้ข้อมูลของ @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
ตัวอย่างทั้งหมดดูเหมือนจะมีอัตราส่วนหมึกต่อข้อมูลสูง
Frank Harrell

1
ฉันเห็นด้วยกับ @ Frank Frank ตัวอย่างไม่น่าเชื่ออย่างแปลกประหลาด ฉันชอบกราฟเกินขีด จำกัด แต่สำหรับตัวอย่างนี้มันสมเหตุสมผลที่จะคาดหวังให้ผู้อ่านเข้าใจตารางที่มีความถี่สี่ความถี่ หากต้องการกราฟแล้วจุดหรือแผนภูมิแท่งนั้นง่ายกว่า (สามารถเพิ่มความถี่เป็นการเพิ่มคำอธิบายประกอบ) ฉันจินตนาการถึงคุณค่าของการสอนสำหรับเด็กเล็ก ๆ
Nick Cox

1
คุณกำลังบอกว่าเมื่อฉันนำเสนอพล็อตนี้ในการประชุมแผนภูมิแท่งประจำปีฉันควรคาดหวังว่าจะมีผู้เกลียดชังจำนวนมากในฝูงชน? ขอบคุณสำหรับหัวขึ้น
rawr

หมุนมัน: กราฟดูเหมือนจะบอกกับผู้อ่าน: ดูที่นี่คุณสามารถนับให้ตัวเองเข้าใจกราฟได้! หากตัวเลขมีขนาดใหญ่นั่นเป็นไปไม่ได้ หากตัวเลขมีขนาดเล็กแสดงว่าไม่มีประโยชน์มากกว่ากราฟอื่น ๆ สำหรับเด็กเล็กนั่นเป็นการเสริมแรงเพื่อให้พวกเขาเข้าใจกราฟิก ใครต้องการข้อความอีกบ้าง
Nick Cox

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.