我想制作一个反向金字塔图形,其中条形图彼此堆叠,宽度不同。
1,我有一个堆积条形图,如下面的代码示例
library(dplyr)
library(ggplot2)
sample <- data_frame(x=c(1, 1, 1, 1, 2, 2, 2, 2),
y=c(5,10,15, 20, 10, 5, 20, 10),
w=c(1, 2, 3, 4, 1, 2, 3, 4),
group=c("a", "b", "c", "d", "a", "b", "c", "d"))
ggplot() +
geom_bar(data=sample,
aes(x=x,y=y,group=group, fill=group),
stat="identity", position=position_stack())
然后我将宽度添加到aes
,因此值较小w
的值会较小,而它们仍然相互堆叠。但是,酒吧并没有警告。
ggplot() +
geom_bar(data=sample,
aes(x=x,y=y,group=group, fill=group, width=w/5),
stat="identity", position=position_stack())
Warning: Ignoring unknown aesthetics: width
Warning message:
position_stack requires non-overlapping x intervals
任何有助于制作条形图或有关不同情节类型的想法可以涵盖类似概念的任何帮助都将受到高度赞赏。谢谢!
答案 0 :(得分:6)
这有点像黑客。
我会使用geom_rect()
而不是真正的列。因此,我需要为矩形边界创建具有预先计算位置的data.frame()
。
df_plot <- sample %>%
arrange(desc(group)) %>% # Order so lowest 'groups' firtst
group_by(x) %>%
mutate(yc = cumsum(y), # Calculate position of "top" for every rectangle
yc2 = lag(yc, default = 0) ,# And position of "bottom"
w2 = w/5) # Small scale for width
# Plot itself
ggplot(df_plot) +
geom_rect(
aes(xmin = x - w2 / 2, xmax = x + w2 / 2,
ymin = yc, ymax = yc2,
group = group, fill=group))
答案 1 :(得分:3)
带丝带的相当冗长的版本
library(dplyr)
library(ggplot2)
sample <- data_frame(x=c(1, 1, 1, 1, 2, 2, 2, 2),
y=c(5,10,15, 20, 10, 5, 20, 10),
w=c(1, 2, 3, 4, 1, 2, 3, 4),
group=c("a", "b", "c", "d", "a", "b", "c", "d"))
# make factors for non-numeic items
sample$x <- factor(sample$x)
sample$group <- factor(sample$group)
# calcualte cumulative sums
sample2 <- sample %>%
group_by(x) %>%
arrange(desc(group)) %>%
mutate(ycum=cumsum(y)) %>%
ungroup() %>%
select(x, group, ycum, w)
# Ffor each point, make another row lagged
sample2lead <- sample2 %>%
group_by(x) %>%
mutate(ycum = lag(ycum, default=0), w=lag(w, default=max(sample2$w))) %>%
ungroup() %>%
select(x, group, ycum, w)
# combine
combined <- bind_rows(sample2, sample2lead) %>%
arrange(x, ycum, desc(group))
# plot a ribbon forming trapezoids
ggplot() +
geom_ribbon(data=combined,
aes(x=ycum, ymin=-w/2, ymax=w/2, fill=group)) +
coord_flip() +
facet_grid(~x)