【问题标题】:How to Plot Points in a Vertical Line for Median Control Chart in R如何在 R 中的中值控制图的垂直线上绘制点
【发布时间】:2016-04-29 05:56:27
【问题描述】:

需要创建一个如下所示的图表:

我快到了,只是缺少垂直绘制的各个点。

这里是数据:

q6 <- structure(list(x1 = c(0.0629, 0.063, 0.0628, 0.0634, 0.0619, 
0.0613, 0.063, 0.0628, 0.0623, 0.0631, 0.0635, 0.0623, 0.0635, 
0.0645, 0.0619, 0.0631, 0.0616, 0.063, 0.0636, 0.064, 0.0628, 
0.0615, 0.063, 0.0635, 0.0623), x2 = c(0.0636, 0.0631, 0.0631, 
0.063, 0.0628, 0.0629, 0.0639, 0.0627, 0.0626, 0.0631, 0.063, 
0.063, 0.0631, 0.064, 0.0644, 0.0627, 0.0623, 0.063, 0.0631, 
0.0635, 0.0625, 0.0625, 0.0632, 0.0629, 0.0629), x3 = c(0.064, 
0.0622, 0.0633, 0.0631, 0.063, 0.0634, 0.0625, 0.0622, 0.0633, 
0.0633, 0.0638, 0.063, 0.063, 0.0631, 0.0632, 0.063, 0.0631, 
0.0626, 0.0629, 0.0629, 0.0616, 0.0619, 0.063, 0.0635, 0.063), 
    x4 = c(0.0635, 0.0625, 0.0633, 0.0632, 0.0619, 0.0625, 0.0629, 
    0.0625, 0.063, 0.0631, 0.0635, 0.0627, 0.063, 0.064, 0.0622, 
    0.0628, 0.062, 0.0629, 0.0635, 0.0635, 0.062, 0.0619, 0.0631, 
    0.0631, 0.0626), x5 = c(0.064, 0.0627, 0.063, 0.0633, 0.0625, 
    0.0628, 0.0627, 0.0627, 0.0624, 0.063, 0.0633, 0.0629, 0.063, 
    0.0642, 0.0635, 0.0629, 0.0625, 0.0628, 0.0634, 0.0634, 0.0623, 
    0.0622, 0.063, 0.0633, 0.0628)), .Names = c("x1", "x2", "x3", 
"x4", "x5"), class = "data.frame", row.names = c(NA, -25L))

代码如下:

range_span <- function(x) return(diff(range(x))) # function to calculate range
# q6 <- read.table(file="/Users/.../blah.csv",header=T,sep=",") #data
medians <- apply(q6,1,median) 
ranges <- apply(q6,1,range_span)
centre <- mean(medians) #grand median
Rtilde <- median(ranges) #median of ranges

plot(medians, type="b",xaxp=c(1, 25, 24),pch=19,xlab="Sample No.",ylab="Medians",main="Median Chart for Thickness of Metal Parts")

# code below draws the control limits 

action.limits<-c(centre+0.681*Rtilde,centre-0.681*Rtilde)
warn.limits<-c(centre+(2/3)*0.681*Rtilde,centre-(2/3)*0.681*Rtilde)

abline(h = centre, lty = 3, col = "black")  
v0 <-c("CL") 
mtext(side = 4, text = v0, at = centre, col = "black", las=2)

abline(h = warn.limits, lty = 3, col = "blue") 
v1 <-c("UWL","LWL") 
mtext(side = 4, text = v1, at = warn.limits, col = "blue", las=2) 

abline(h = action.limits, lty = 3, col = "black") 
v2 <-c("UCL","LCL") # the labels for action.limits
mtext(side = 4, text = v2, at = action.limits, col = "black", las=2)

我确信有一个简单的解决方案,我对 RI 完全没有经验,只是想通过在 R 中为课程作业制作图表来给自己设定一个挑战,但现在我的时间已经不多了。

  • points() 可以帮忙吗?我需要 R 来识别 q6 中的每一行都是一个样本,我可以这样做 points(q6,c(1:25)) 或类似的东西?

【问题讨论】:

  • 请使用dput() 发布您的最小可重现示例,请参阅:How to create a Minimal, Complete, and Verifiable example
  • @EricFail 啊,我现在明白了。感谢您的编辑。
  • 不客气。我仍然不清楚您想要的行为是什么。您能否以某种方式说明或解释您所看到的情节的确切外观?
  • @Eric 完成。有什么想法吗?

标签: r plot charts median qcc


【解决方案1】:

因此,您的数据中没有 x 坐标(1 到 25),这会使绘图变得困难。

q6$x = 1:25

下一步并非绝对必要,但它使事情变得更方便。我要把你的数据“融化”成一个长格式:

q6_long = reshape2::melt(q6, id.vars = "x")

## just showing what it looks like now
head(q6_long)
#   x variable  value
# 1 1       x1 0.0629
# 2 2       x1 0.0630
# 3 3       x1 0.0628
# 4 4       x1 0.0634
# 5 5       x1 0.0619
# 6 6       x1 0.0613

现在使用points 函数可以轻松添加点:

points(q6_long$x, q6_long$value, pch = 5)

【讨论】:

  • 谢谢!我只是做了一个编辑,建议使用points 和 1:25,我只是不知道如何实现它。你能解释一下熔化部分是什么以及为什么需要它吗?
  • melt 将您的数据从宽格式(您有很多列要放在 y 轴上)移动到长格式(y 轴上的所有数字都在一列中) .运行命令(您可能需要先安装reshape2 包)并查看熔化后的数据 - 您可能会看到它比我解释的更好。
  • 融化很好,因为我可以做一个单一的points() 调用 - 如果我没有融化,我需要做一个for 循环(或一个apply 或其他东西)来绘制x1 列,然后是 x2 列,然后是 x3 列,依此类推。melt 将所有这些值合并到一列中,因此一个 points() 调用一次完成所有操作。
猜你喜欢
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 2014-09-19
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多