2015-01-06 11 views
2

В R Я создал простую матрицу из одного столбца, в которой приведен список чисел с заданным значением и заданным стандартным отклонением.Как отложить отклонение от среднего

rnorm2 <- function(n,mean,sd) { mean+sd*scale(rnorm(n)) } 
r <- rnorm2(100,4,1) 

Теперь я хотел бы рассказать, как эти цифры отличаются от среднего. Я могу сделать это в Excel, как показано ниже:

enter image description here

Но я хотел бы использовать ggplot2 создать график в R. В графе Excel я изменял с помощью линейного графика, но если бы я мог сделать это как столбцы, было бы лучше. Я попытался использовать график рассеяния, но я не могу разобраться, как превратить это в отклонения от среднего.

+0

что вы имеете в виду под «делать это как столбцы "? –

+0

Как и в случае присоединения каждой точки к предыдущей и после нее, как и в линейном графике (для увеличенной версии см. Ответ ниже), но есть линия, соединяющая каждую точку со средним значением. В принципе, гистограмма с узкими полосами, центрированными вокруг среднего значения, а не нуля – PaulBarr

ответ

6

Может быть, вы хотите:

rnorm2 <- function(n,mean,sd) { mean+sd*scale(rnorm(n)) } 
set.seed(101) 
r <- rnorm2(100,4,1) 
x <- seq_along(r) ## sets up a vector from 1 to length(r) 
par(las=1,bty="l") ## cosmetic preferences 
plot(x, r, col = "green", pch=16) ## draws the points 
## if you don't want points at all, use 
## plot(x, r, type="n") 
## to set up the axes without drawing anything inside them 
segments(x0=x, y0=4, x1=x, y1=r, col="green") ## connects them to the mean line 
abline(h=4) 

Если вы замышляли около 0 Вы могли бы сделать это автоматически с type="h":

plot(x,r-4,type="h", col="green") 

Для этого в ggplot2:

library("ggplot2") 
theme_set(theme_bw()) ## my cosmetic preferences 
ggplot(data.frame(x,r))+ 
    geom_segment(aes(x=x,xend=x,y=mean(r),yend=r),colour="green")+ 
    geom_hline(yintercept=mean(r)) 
+0

Это очень близко к тому, что я ищу. Вы знаете, как я мог удалить круг? Theres нет опции с pch, что я могу видеть, что оставил бы только столбцы и имел бы прозрачную точку – PaulBarr

+0

, как насчет 'type =" n "' (и оставить 'pch' полностью)? –

+1

Возможно также добавить '+ geom_abline (intercept = 4, slope = 0)' до конца –

1

в базе R это довольно просто, просто сделать

plot(r, col = "green", type = "l") 
abline(4, 0) 

enter image description here

Вы также помечены ggplot2, так что в этом случае это будет немного сложнее, потому что ggplot требует создания кадра данных и затем расплавить его.

library(ggplot2) 
library(reshape2) 
df <- melt(data.frame(x = 1:100, mean = 4, r = r), 1) 
ggplot(df, aes(x, value, color = variable)) + 
    geom_line() 

enter image description here

+0

Это близко, но я предпочитаю графа столбцов, как показано ниже, а не линейный график – PaulBarr

+0

Я предполагаю, что для простоты можно просто масштабировать его и используйте 'type =" h "', что-то быстрое, как 'plot (r-4, col =" green ", type =" h "); abline (0, 0) ' –

3

ответ, используя ggplot2 Бен отлично работает, но если вы не хотите, чтобы вручную регулировать ширину линии, вы можете сделать это:

# Half of Ben's data 
rnorm2 <- function(n,mean,sd) { mean+sd*scale(rnorm(n)) } 
set.seed(101) 
r <- rnorm2(50,4,1) 
x <- seq_along(r) ## sets up a vector from 1 to length(r) 

# New variable for the difference between each value and the mean 
value <- r - mean(r) 

ggplot(data.frame(x, value)) + 
    # geom_bar anchors each bar at zero (which is the mean minus the mean) 
    geom_bar(aes(x, value), stat = "identity" 
      , position = "dodge", fill = "green") + 
    # but you can change the y-axis labels with a function, to add the mean back on 
    scale_y_continuous(labels = function(x) {x + mean(r)}) 

enter image description here

Смежные вопросы