基于样本大小的ggplot点,具有自定义范围R

时间:2016-12-12 18:37:10

标签: r graph ggplot2

我有想要绘制图表的测试数据集:

 Week   M
50  0.082474227
50  0.100694444
50  0.079037801
50  0.090277778
50  0.083333333
50  0.097222222
50  0.09375
50  0.104166667
12  0.079861111
12  0.104166667
12  0.09375
12  0.090277778
80  0.079861111
80  0.128472222
80  0.052083333
80  0.09375
80  0.120274914
80  0.118055556
80  0.121527778
80  0.097222222
80  0.069444444
80  0.145833333
80  0.065972222
80  0.045138889
80  0.083333333
80  0.079861111
80  0.092783505
80  0.113402062
80  0.090277778
80  0.134020619
80  0.118055556

我想根据'week12','week50'和'week80'的平均值绘制数据,并使用误差线,并根据样本大小调整点的大小。

首先,我需要对数据集进行汇总统计:

SEsum <- summarySE(data, measurevar="M", groupvars="Week")

接下来我想绘制图表:

ggplot(SEsum, aes(x=Week, y=M)) + 
geom_errorbar(aes(ymin=M-se, ymax=M+se), width=3) +
geom_line() +
geom_point(aes(size= N))+
scale_x_continuous(breaks=c(12,50,80), labels=c("Wk12", "Wk50", "Wk80")) 

情节如下: the plot looks like this

除了我喜欢自定义用于绘制点大小的样本大小范围之外,一切看起来都不错。

图表中的图例表示N设置为'4','8','12'和'16'。在代码中它将是'geom_point(aes(size = N))'的部分,我希望最小样本大小为1,最大值为50,如果可能,只使用3个选项(此处的图表)给出4个选择)因为只有3个时间点。

原因是我需要绘制26个这样的图表,其中26个不同的数据集具有不同的样本大小,我想标准化范围,所以当我将所有图表并排放置时,将很容易相比。

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找scale_size来控制这些点的大小。在这里,我将限制设置为c(0,50)以标准化绘图的范围,并将断点设置为与此绘图中的实际值相匹配:

ggplot(SEsum, aes(x=Week, y=M)) + 
  geom_errorbar(aes(ymin=M-se, ymax=M+se), width=3) +
  geom_line() +
  geom_point(aes(size= N))+
  scale_x_continuous(breaks=c(12,50,80), labels=c("Wk12", "Wk50", "Wk80")) +
  scale_size(limits = c(0, 50)
             , breaks = unique(SEsum$N))

给出:

enter image description here

然而,请注意,这种大小差异可能会产生误导(人类在这种比较中表现不佳)。您可能最好更明确地标记样本大小。这也减少了生成绘图的代码量,因为您可以使用stat_summary代替,默认为您在此处绘制的平均值+/- SE。

首先,为每周生成标签。在这里,我使用的是dplyr(它会与plyr发生冲突,forLabel <- data %>% group_by(Week) %>% summarise(Count = n()) %>% mutate(Label = paste0("Wk ", Week, "\n(n = ", Count, ")")) 会自动加载到您正在使用的函数中。

   Week Count           Label
  <int> <int>           <chr>
1    12     4  Wk 12\n(n = 4)
2    50     8  Wk 50\n(n = 8)
3    80    19 Wk 80\n(n = 19)

返回:

ggplot(data
       , aes(x=Week, y=M)) +
  stat_summary() +
  scale_x_continuous(breaks = forLabel$Week
                     , labels = forLabel$Label)

然后,我们可以用它来标记轴而不是之前的硬编码:

--auto-watch

给出:

enter image description here