控制图表绘制R中的所有日期

时间:2018-06-06 15:27:37

标签: r ggplot2 control-charts

我在qic图表方面遇到问题 - 控制图表。 我的x.axis没有绘制我想要的所有日期。我将日期舍入到每14天一次,期限为59周。我想要所有这些绘制,但我有相关的问题,在网上找不到任何东西。然而,我是控制图表的新手。

以下是一个示例,而不是原始数据,因此在此示例中,周数较少,但只要绘制了所有日期,它就无关紧要。

重现数据:

df <- data.frame(x = rep(1:24, 4), 
ReportMonth = (rep(seq(as.Date('2014-1-1'),
                               length.out = 24,
                               by = 'month'),
                                4)),
             num = rbinom(4 * 24, 100, 0.5),
             denom = round(runif(4 * 24, 90, 110)),
             grp1 = rep(c('g', 'h'), each = 48),
             grp2 = rep(c('A', 'B'), each = 24))
df

并绘图

qic(x= ReportMonth,
y= num,
n= denom,
data=df, 
chart= "i",
x.format="%Y-%m-%d",
x.angle = 90,
y.expand = 40, # where to start y axis from
xlab = "Month",
ylab= "Value")

我已尝试使用ggplot2,但我还没有成功。

 library(ggplot2)
 library(plyr)

 p3.1 <- rename(p3, c("x" = "Date"))
 p3.1$Date<-as.Date(p3.1$x, format="%Y/%m/%d")

 plot4 <- ggplot(p3.1, aes(x = Date,y = y )) +
 geom_ribbon(ymin = p3.1$lcl, ymax = p3.1$ucl, alpha = 0.4) +   # fill = ""
 geom_line(colour = "blue", size = .75) + 
 geom_line(aes(Date, cl)) +
 geom_point(colour = "red" , fill = "red", size = 1.5) +
 #x.axis(1, p3$x, format(p3$x, "%Y-%m-%d"), cex.axis = 0.7)+
 ggtitle(label = "Readmissions within 30 days") +
 labs(x = NULL, y = NULL)+
 theme_minimal()+
 theme(axis.text.x = element_text(angle = 90, hjust = 1))

#aes(x = format(ActiveDate,"%Y-%m"), group = 1)) + geom_line(stat = "count") 
#+ theme(axis.text.x = element_text(angle = 90, hjust = 1)) 

plot4

1 个答案:

答案 0 :(得分:0)

您可以绘制两个可能的值:numdenom。为简单起见,我将计算这两个值的百分比并绘制pct。 (但你当然可以选择用numdenom来绘制。)

此外,根据您的数据框df,您有四组值:

  • 第1组:grp1 = g,grp2 = A
  • 第2组:grp1 = h,grp2 = A
  • 第3组:grp1 = g,grp2 = B
  • 第4组:grp1 = h,grp2 = B

您遇到的部分问题是您需要单独绘制每个组,但在使用qicharts2::qic()ggplot2::ggplot()进行绘图时,您不会包含这些组。为此,您必须先将grp1grp2合并为一个组(grp)。

library(tidyverse)
library(qicharts2)

df_2 <- 
  df %>% 
  # calculate percent
  mutate(pct = round(num/denom, digits = 2)) %>%
  # collapse grp1 and grp2 to make single grp column
  unite(grp1, grp2, col = "grp")

head(df_2)
  x ReportMonth num denom grp  pct
1 1  2014-01-01  46   100 g_A 0.46
2 2  2014-02-01  54   105 g_A 0.51
3 3  2014-03-01  49   100 g_A 0.49
4 4  2014-04-01  56    94 g_A 0.60
5 5  2014-05-01  54   102 g_A 0.53
6 6  2014-06-01  48   106 g_A 0.45

在折线图(时间序列)上绘制多个组是完全可以的。

ggplot(df_2, aes(x = ReportMonth, y = pct, color = grp)) +
  geom_line() +
  scale_x_date(date_breaks = "2 months", date_labels = "%b '%y") +
  scale_y_continuous(labels = scales::percent) +
  theme_minimal()

enter image description here

但是你应该在一个控制图上绘制多个组。控制图上的控制限制基于单个序列(组&#39; s)历史值。如果您在同一控制图上绘制所有四个组,您将获得四组控制限制,这将导致非常混乱(几乎不可能读取/解释)的控制图。

相反,你应该绘制四个控制图,每组一个。

df_2 %>% 
  # nested dataframe
  split(.$grp) %>% 
  # apply qic
  purrr::map(~ qicharts2::qic(
    ReportMonth, pct, 
    data = ., 
    chart = "i", # choose an appropriate control chart
    title = paste("Group:", unique(.$grp)),
    xlab = "ReportMonth",
    ylab = "pct"
    ))

enter image description here

修改

我在qicharts2::qic()中找不到指定中断的任何参数(类似于scale_x_date(breaks = ...)中的ggplot函数)。请参阅参考手册here

然而,可能的解决方法是将日期变量转换为因子并使用它。这种方法的缺点是没有连接点的线。

# Set levels for date variable -- ensure they are unique.
ReportMonth_levels <- format( unique(df_2$ReportMonth), "%b %y")

df_3 <- 
  df_2 %>% 
  # convert date variale to a factor with set levels
  mutate(ReportMonth = factor( format(ReportMonth, "%b %y"), levels = ReportMonth_levels))

df_3 %>% 
  qicharts2::qic(
    ReportMonth, pct, 
    data = ., 
    facets = ~ grp, # put all groups on one chart
    y.percent = TRUE,
    x.angle = 45,
    chart = "i", # choose an appropriate control chart
    xlab = "ReportMonth",
    ylab = "pct"
  )

enter image description here