如何绘制与均值的偏差
How to plot deviation from mean
在 R 中,我创建了一个简单的单列矩阵,它生成一个数字列表,其中包含一组均值和给定的标准差。
rnorm2 <- function(n,mean,sd) { mean+sd*scale(rnorm(n)) }
r <- rnorm2(100,4,1)
我现在想绘制这些数字与平均值之间的差异。我可以在 Excel 中执行此操作,如下所示:
但我想使用 ggplot2
在 R 中创建一个图表。在 Excel 图表中,我使用折线图作弊,但如果我可以将其作为列来做,那将是更好的。我曾尝试使用散点图,但无法弄清楚如何将其转化为与均值的偏差。
在 base R 中很简单,只需做
plot(r, col = "green", type = "l")
abline(4, 0)
您还标记了 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()
也许你想要:
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))
Ben 使用 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)})
在 R 中,我创建了一个简单的单列矩阵,它生成一个数字列表,其中包含一组均值和给定的标准差。
rnorm2 <- function(n,mean,sd) { mean+sd*scale(rnorm(n)) }
r <- rnorm2(100,4,1)
我现在想绘制这些数字与平均值之间的差异。我可以在 Excel 中执行此操作,如下所示:
但我想使用 ggplot2
在 R 中创建一个图表。在 Excel 图表中,我使用折线图作弊,但如果我可以将其作为列来做,那将是更好的。我曾尝试使用散点图,但无法弄清楚如何将其转化为与均值的偏差。
在 base R 中很简单,只需做
plot(r, col = "green", type = "l")
abline(4, 0)
您还标记了 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()
也许你想要:
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))
Ben 使用 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)})