stat_smooth未在图上显示

时间:2017-11-30 19:18:58

标签: r ggplot2

鉴于下面显示的数据集,我运行此命令绘制一条带有重叠平滑曲线的折线图:

ggplot(tmp,
       aes(CalendarMonth, Score)) +
  geom_line(stat='identity', group = 1) + ylim(0, 3) +
  theme_few() + ylab('Average score in the month') +
  theme(axis.text.x = element_text(angle=90)) +
  stat_smooth(aes(CalendarMonth, Score), method='loess')

但是这只绘制了一个折线图,即我是运行stat_smooth部分还是将其遗漏,输出不会改变,并且平滑曲线不会重叠。我在这里缺少什么?

数据:

tmp <- data.frame(
  CalendarMonth = c('2012-07', '2012-08', '2012-06', '2012-05', '2012-04', '2012-09',
  '2012-10', '2012-11', '2012-12', '2013-01', '2013-02', '2013-03', '2013-04', '2013-05',
  '2013-06', '2013-07', '2013-08', '2013-09', '2013-10', '2013-11', '2013-12', '2014-01',
  '2014-02', '2014-03', '2014-04', '2014-05', '2014-06', '2014-07', '2014-08', '2014-09',
  '2014-10', '2014-11', '2014-12', '2015-01', '2015-02', '2015-03', '2015-04', '2015-05',
  '2015-06', '2015-07', '2015-08', '2015-09', '2015-10', '2015-11', '2015-12', '2016-01',
  '2016-02', '2016-03', '2016-04', '2016-05', '2016-06', '2016-07', '2016-08', '2016-09',
  '2016-10', '2016-11', '2016-12', '2017-01', '2017-02', '2017-03', '2017-04', '2017-05',
  '2017-06', '2017-07', '2017-08', '2017-09'),
  Score = c(2.716667, 2.577465, 2.615385, 3.000000, 3.000000, 2.446429,
  2.426667, 2.683544, 2.526316, 2.568966, 2.506849, 2.537500, 2.578125,
  2.470588, 2.741935, 2.560261, 2.479195, 2.545605, 2.577778, 2.539216,
  2.556492, 2.535593, 2.567829, 2.557214, 2.587662, 2.580189, 2.512069,
  2.572402, 2.582792, 2.555938, 2.512586, 2.561224, 2.572308, 2.557940,
  2.540000, 2.593333, 2.513274, 2.566952, 2.548649, 2.623223, 2.565079,
  2.537344, 2.516667, 2.509485, 2.519084, 2.544262, 2.612795, 2.496429,
  2.467128, 2.596226, 2.560714, 2.563253, 2.588462, 2.569395, 2.668919,
  2.581197, 2.543253, 2.524648, 2.594796, 2.551613, 2.583333, 2.474074,
  2.627306, 2.505017, 2.561086, 2.554545)
)

1 个答案:

答案 0 :(得分:1)

您的数据类型很重要,并且在评论中提及@joran时,您的数据需要更改类型才能正常显示。

我们可以使用str快速解决您的问题:

> str(tmp)
'data.frame':   66 obs. of  2 variables:
 $ CalendarMonth: Factor w/ 66 levels "2012-04","2012-05",..: 4 5 3 2 1 6 7 8 9 10 ...
 $ Score        : num  2.72 2.58 2.62 3 3 ...

通常,在创建数据框时,您需要将参数stringsAsFactors设置为false。如果您这样做,则需要先在as.factor之前运行as.integer。看看as.integer对您的因素数据的影响。

> as.integer(as.character(tmp$CalendarMonth))
 [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[26] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[51] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
> as.integer(as.factor(as.character(tmp$CalendarMonth)))
 [1]  4  5  3  2  1  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
[26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
[51] 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

您会注意到,由于数据格式在从因子转换为整数时采用YYYY-MM伪日期格式,因此值将成为日期范围的有序列表。通常,在R中注意到这些类型的转换时要小心。as.integer遵循一种有趣的格式,其中比较字符值以确定顺序。可能以一种格式工作的东西可能不适用于另一种格式。例如:

> df <- data.frame(month = c('jan', 'feb', 'mar', 'dec', 'apr'))
> str(df)
'data.frame':   5 obs. of  1 variable:
 $ month: Factor w/ 5 levels "apr","dec","feb",..: 4 3 5 2 1
> as.integer(df$month)
[1] 4 3 5 2 1

确保您了解解决方案的工作原理,以避免将来出现潜在的问题。话虽如此:

> tmp$cm <- as.integer(tmp$CalendarMonth)
> ggplot(tmp,
+        aes(CalendarMonth, Score)) +
+     geom_line(stat='identity', group = 1) + ylim(0, 3) +
+     theme_few() + ylab('Average score in the month') +
+     theme(axis.text.x = element_text(angle=90)) +
+     stat_smooth(aes(cm, Score), method='loess')

获取正确的图表:

enter image description here