首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:堆叠面积图不堆叠

R:堆叠面积图不堆叠
EN

Stack Overflow用户
提问于 2018-05-18 08:43:28
回答 2查看 847关注 0票数 3

我有数据,我想把它画成一个堆叠的区域图。在x轴上,我有连续的数据,在y轴上,我有连续的数据,准备累积。这是我对一些虚拟数据使用的代码:

代码语言:javascript
复制
library(data.table)
library(ggplot2)

set.seed(1)
dt <- data.table(var=sample(1:6,1000,replace=TRUE),xdata=runif(1000),ydata=runif(1000))
setorder(dt, var, xdata)

dt$cumydata <- dt[,
                  cumsum(ydata),
                  by = .(var)]$V1/sum(dt$ydata)

ggplot(dt, aes(x = xdata, y = cumydata, fill = as.factor(var))) +
  geom_area(position = "stack")

这是输出图:

我的问题是,数据不能正确地堆叠。我想这可能是因为数据的连续性?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-04 14:15:06

根据Jimbou的信息,我终于解决了这个问题。这只是一些预处理。我还把整件事做了对数。

代码语言:javascript
复制
library(data.table)
library(ggplot2)

set.seed(1)
dtt <- data.table(var=sample(1:6,1000,replace=TRUE),xdata=runif(1000),ydata=runif(1000))

setorder(dtt, var, xdata)

log.min.xdata <- log(min(dtt$xdata))
log.max.xdata <- log(max(dtt$xdata))

nbreaks <- 101

temp <- hist(log(dtt$xdata[dtt$var==1]),
             breaks = seq(log.min.xdata, log.max.xdata, length=nbreaks),
             plot = FALSE)


dt <- data.table(var = unlist(lapply(sort(unique(dtt$var)),
                                     function(x){rep(x,nbreaks-1)})),
                 bin = rep(1:(nbreaks-1),length(unique(dtt$var))),
                 mid = rep(temp$mids))

dt$count <- dt[,
               hist(log(dtt$xdata[dtt$var==var]), 
                    breaks = seq(log.min.xdata, log.max.xdata, length=nbreaks),
                    plot = FALSE)$counts,
               by = .(var)]$V1

dt$cumcount <- dt[,
                  cumsum(count),
                  by = .(var)]$V1



pp <- ggplot(dt, aes(x = exp(mid), y = cumcount, fill = as.factor(var))) +
  geom_area(position = "stack") +
  scale_x_log10() +
  theme_bw() +
  theme(legend.position = c(0.1, 0.70),
        legend.background = element_rect(fill="lightgrey", 
                                         size=0.5, linetype="solid")) +
  labs(title = "y",
       fill = " var",
       x = "xdata",
       y = "cumcount") +
  theme(title = element_text(face = "bold"),
        axis.title = element_text(face = "bold"),
        legend.title = element_text(face = "bold"),
        legend.text = element_text(face = "bold"))
票数 0
EN

Stack Overflow用户

发布于 2018-05-18 10:03:21

对于堆叠面积图,x值和发生次数必须相同。因此,将样本数据更改为此将给出预期的输出:

代码语言:javascript
复制
set.seed(1)
dt <- data.table(ydata=runif(1002))
dt$var <- rep(1:6, each=167)
dt$xdata <- rep(runif(167), 6)
setorder(dt, var, xdata)

dt$cumydata <- dt[,
                  cumsum(ydata),
                  by = .(var)]$V1/sum(dt$ydata)

ggplot(dt,aes(x = xdata, y = cumydata, fill = as.factor(var))) +
  geom_area(position = "stack")

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50407229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档