2016-01-22 61 views
3

需要创建一个图表,看起来像这样: enter image description here如何绘制在一条垂直线上点的中位值控制图中的R

我几乎没有,只是缺少其垂直绘制的各个点。

这里的数据:

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都只是想给自己设定通过在课程作业中生成图表来实现挑战,但现在我开始耗尽时间。

  • 请问points()有帮助吗?我需要R认识到q6中的每一行都是我可能做到的样本points(q6,c(1:25))或类似的东西?
+2

使用,请发表您的最小重复的例子, 'dput()'参见:[如何创建一个最小,完整和可验证的示例](http://stackoverflow.com/help/mcve)。 –

+0

@EricFail啊,我现在明白了。感谢编辑。 – CanofDrink

+1

不客气。我对你的期望行为还是有点不清楚。你能否以某种方式说明 - 或解释 - 你究竟在看什么样的情节? –

回答

2

因此,您的数据中的任何位置都没有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) 

enter image description here

+0

谢谢!我刚刚做了一个编辑,建议使用'points'和1:25,我只是不知道如何实现它。你能解释熔化部分是什么以及为什么需要它? – CanofDrink

+1

'melt'将您的数据从宽格式(您想要放在y轴上的许多列)移至长格式(y轴上的所有数字都在一列中)。运行这个命令(你可能需要首先安装'reshape2'包)并在融化后查看数据 - 你可能会看到它比我能解释的更好。 – Gregor

+1

融化是很好的,因为我可以做一个'points()'调用 - 如果我没有融化,我需要做一个'for'循环(或一个'apply'或其他东西)来绘制x1列,然后x2列,然后是x3列等等。'melt'将所有这些值合并成一列,所以一个'points()'调用一次完成所有事情。 – Gregor