如何在一个条形图中显示 2 组堆叠数据
How to display 2 sets of stacked data in one barplot
所以我正在创建一个 MI 包,我想包括一个条形图,显示提交的内容以及谁因迟到而出错。
我有 5 列数据,可以分为两部分:
第 1 部分(提交时间)= 上午 7 点前,上午 7 点至上午 9 点,Post 上午 9 点
第 2 节(故障)= 我们,他们
有 6 行数据(即前 6 个月)。
读取数据、操作数据、更改日期或格式化都没有问题。同样,创建堆叠的整组数据或堆叠的每个部分(这正是我想要的)的条形图也没有问题。
我希望第 1 部分是一个堆叠的条形图,旁边是第 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)
最后 - 我试图让他们复制图片。有点蹩脚,但老实说我不知道从哪里开始。
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)
所以我使用了以下,非常接近:
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
从 rownames 移动到实际变量。然后我们确保 Dates
实际上是一个有序因子(facet_grids
需要)。然后我们使用 gather
将数据格式化为长格式。 Subsection
是根据你想要的两种堆栈创建的,我们检查 "am" 是否在 vartype
(布尔值)中,然后我们创建一个函数,我们创建 Subsection1
如果 "am" 在 vartype
中,如果 "am" 不存在,则 Subsection2
。然后因为我们有列高的值,所以我们使用 geom_col
。我们还使用 facet_grid
将地块按 Dates
打断并进行相应排列。
所以我正在创建一个 MI 包,我想包括一个条形图,显示提交的内容以及谁因迟到而出错。 我有 5 列数据,可以分为两部分:
第 1 部分(提交时间)= 上午 7 点前,上午 7 点至上午 9 点,Post 上午 9 点
第 2 节(故障)= 我们,他们 有 6 行数据(即前 6 个月)。
读取数据、操作数据、更改日期或格式化都没有问题。同样,创建堆叠的整组数据或堆叠的每个部分(这正是我想要的)的条形图也没有问题。
我希望第 1 部分是一个堆叠的条形图,旁边是第 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)
最后 - 我试图让他们复制图片。有点蹩脚,但老实说我不知道从哪里开始。
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)
所以我使用了以下,非常接近:
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
从 rownames 移动到实际变量。然后我们确保 Dates
实际上是一个有序因子(facet_grids
需要)。然后我们使用 gather
将数据格式化为长格式。 Subsection
是根据你想要的两种堆栈创建的,我们检查 "am" 是否在 vartype
(布尔值)中,然后我们创建一个函数,我们创建 Subsection1
如果 "am" 在 vartype
中,如果 "am" 不存在,则 Subsection2
。然后因为我们有列高的值,所以我们使用 geom_col
。我们还使用 facet_grid
将地块按 Dates
打断并进行相应排列。