饼图:情节和传奇不匹配

时间:2017-11-29 12:51:04

标签: r ggplot2

根据example #128 of the R Graph Gallery,我使用R和ggplot2做了一个饼图,或多或少。

piePlot <- function(count, categories) {
  dat <- data.frame(count = count, category = categories)
  dat$fraction <- dat$count / sum(dat$count)
  dat$ymax <- cumsum(dat$fraction)
  dat$ymin <- c(0, head(dat$ymax, n = -1))
  dat$label <- paste(dat$category, dat$count)
  plot <-
    ggplot(dat, aes(
      fill = category,
      ymax = ymax,
      ymin = ymin,
      xmin = 0,
      xmax = 1
    )) +
    geom_rect() +
    coord_polar(theta = "y") +
    scale_fill_brewer(labels = dat$label, guide = "legend")
  plot
}

piePlot(count = c(20, 10, 30),
        categories = c("one", "two", "three"))

这是输出:

Output

图例不匹配的颜色。根据传说,最大的应该是最黑暗的(三个30),显然不是这样。这是我在数据框之前的数据框打印输出:

  count category  fraction      ymax      ymin    label
1    20      one 0.3333333 0.3333333 0.0000000   one 20
2    10      two 0.1666667 0.5000000 0.3333333   two 10
3    30    three 0.5000000 1.0000000 0.5000000 three 30

这正是传说中的顺序,但ggplot似乎在制作情节时以某种方式对字段进行了重新排序。我只是不明白为什么。

我正在使用R版本3.4.2和ggplot2版本2.2.1。

有人知道这种重新排序的方式和原因,以及如何压制它?

1 个答案:

答案 0 :(得分:1)

不匹配的发生是因为ggplot()首先按字母顺序排列图例,即图例条目会读取&#34;一个20,三个30,两个10&#34;如果您没有调用scale_fill_brewer,则从上到下但是您将覆盖图例的条目为&#34;一个20,两个30,三个10&#34;。解决此问题的一种方法是将dat$label定义为具有级别c的因子(&#34;一个20&#34;,&#34;两个10&#34;,&#34;三个30&#34;)所以图例按因子级别排序。

简而言之,以下代码可以解决您的问题:

piePlot <- function(count, categories) {
dat <- data.frame(count = count, category = categories)
dat$fraction <- dat$count / sum(dat$count)
dat$ymax <- cumsum(dat$fraction)
dat$ymin <- c(0, head(dat$ymax, n = -1))
dat$label <- factor(paste(dat$category, dat$count), levels = paste(dat$category, dat$count))
plot <-
ggplot(dat, aes(
  fill = label, # fill by label not category
  ymax = ymax,
  ymin = ymin,
  xmin = 0,
  xmax = 1
)) +
geom_rect() +
coord_polar(theta = "y") +
scale_fill_brewer(guide = "legend") # no need for labels anymore
plot
}

library(ggplot2)
piePlot(count = c(20, 10, 30),
    categories = c("one", "two", "three"))

enter image description here