如何在一个小图中显示两组堆叠数据

时间:2019-03-21 14:32:35

标签: r bar-chart combinedchart

因此,我正在创建一个MI Pack,我想添加一个条形图,该条形图显示何时提交某些内容以及谁来迟到。 我有5列数据,可分为两部分:

第1节(提交时间)=上午7点之前,上午7点至上午9点,上午9点之后

第2节(故障)=我们,他们 有6行数据(即前6个月)。

读取数据,处理数据,更改日期或格式化都没有问题。同样,创建整个堆栈数据集或每个部分堆栈(我想要的)的条形图也没有问题。

我想将第1部分设置为堆积的barplot,并在其旁边有第2部分。

Recreated in excel in case description not clear

这是我到目前为止的代码。 将数据下载并处理为合适的格式

MIDF <- read.xlsx("C:/MISMM.xlsx", sheet = 11, startRow = 3, colNames = TRUE)
MDATE <- excel_numeric_to_date(MIDF$`Month./.Year`, date_system = "modern", include_time = "false")
MDATE <- format(as.Date(MDATE), "%m-%Y")
MIDF <- cbind(MDATE, MIDF[2:19])
MIDF <- tail(MIDF, 6)

这是堆叠的所有5列

LAFU <- MIDF %>% select (9, 10, 11, 12, 13)
LAFUa <- MIDF %>% select(1)
LAFUa <- (t(LAFUa))
LAFU <- (t(LAFU))
LAFUCHART <- barplot(LAFU, 
         names.arg=LAFUa, 
         main = "Lates and who is at fault",
         col=c("#1488CA", "#6B7E87", "#AA0B3C", "#FDC41F",  "#85C9F0"), 
         legend = rownames(LAFU), 
         beside = FALSE)

这两个部分是分开的

LAFUresub <- MIDF %>% select (9, 10, 11)
LAFUerror <- MIDF %>% select (12, 13)
LAFUa <- MIDF %>% select(1)
LAFUa <- (t(LAFUa))
LAFUresub <- (t(LAFUresub))
LAFUerror <- (t(LAFUerror))

 LAFUresubBP <- barplot(LAFUresub, 
    names.arg=LAFUa, 
    main = "Lates",
    col=c("#1488CA", "#6B7E87", "#AA0B3C"), 
    legend = rownames(LAFUresub), 
    beside = FALSE)

 LAFUerrorBP <- barplot(LAFUerror, 
    names.arg=LAFUa, 
    main = "Who is at fault",
    col=c("#FDC41F",  "#85C9F0"), 
    legend = rownames(LAFUerror), 
    beside = FALSE)

最后-我试图让他们复制图片。有点la脚,但老实说,我不知道从哪里开始。

LAFUTIME <- t(group_by(MIDF %>% select(9,10,11)))
LAFUERROR <- t(group_by(MIDF %>% select(12, 13)))
LAFUDATE <- t(MIDF %>% select(1))
test<-rbind(LAFUTIME, LAFUERROR)
barplot(LAFUTIME %>% LAFUERROR)

任何帮助,我们将不胜感激。 大卫

如果有帮助的话,这里有一些与我使用的数据框相当的代码。

pre7am <- c(1,2,3,2,1,3)
SamNam<- c(2,4,3,6,5,3)
post9am<- c(1,2,1,0,1,0)
us <-     c(0,0,1,3,2,0)
them <-   c(4,8,6,5,5,6)
dates <- c("Jul18", "Aug18", "Sept18", "Oct18", "Nov18", "Dec18")

DF <- data.frame(pre7am, SamNam, post9am, us, them, row.names = dates)

1 个答案:

答案 0 :(得分:0)

因此,我使用了以下内容,它们非常接近:

library(tidyverse)
library(zoo)

DF %>% 
mutate(Dates = rownames(DF),
Dates = factor(Dates, levels = c("Jul18","Aug18", "Sep18", "Oct18", "Nov18", "Dec18"))) %>% 
gather(vartype, value, -Dates) %>% 
mutate(Subsection =paste("Subsection", abs(as.numeric(grepl("am", vartype)) - 1) + 1)) %>% 
ggplot(aes(Subsection,value, fill = vartype, col = vartype)) + 
geom_col() +
facet_grid(.~Dates) 

因此,首先我们将Dates从行名移至实际变量。然后,确保Dates实际上是一个有序因子(facet_grids所需要)。然后,我们使用gather将数据格式化为长格式。 Subsection是根据您想要的两种堆栈创建的,我们在其中检查是否在vartype(布尔值)中包含“ am”,然后创建一个函数,在其中创建Subsection1,如果“ am”位于vartypeSubsection2中,如果不存在“ am”。然后,由于我们具有列高的值,因此我们使用geom_col。我们还使用facet_grid来按Dates分解图并进行相应安排。