根据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"))
这是输出:
图例不匹配的颜色。根据传说,最大的应该是最黑暗的(三个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。
有人知道这种重新排序的方式和原因,以及如何压制它?
答案 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"))