【问题标题】:stat_smooth not displayed on the plotstat_smooth 未显示在绘图上
【发布时间】:2017-11-30 19:18:58
【问题描述】:

给定下面显示的数据集,我运行这个命令来绘制一个带有重叠平滑曲线的折线图:

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)
)

【问题讨论】:

  • stat_smooth() 调用中将CalendarMonth 转换为整数;即aes(as.integer(CalendarMonth),Score).
  • 这并没有完全奏效。但是aes(as.integer(as.factor(CalendarMonth)) 确实有效。如果您将其发布为答案,我将其标记为这样
  • 实际上,根据您在问题中提供的信息,我的解决方案有效。如果您需要先将该列转换为因子,则意味着您机器上的数据与您在问题中提供的数据不同。默认情况下,在字符向量上调用 data.frame() 会创建一个因子,因此 as.integer 无需任何其他命令即可工作。
  • 公平。我已经简化了这个问题,通过它,我忘记了我的原始代码中有 stringsAsFactors = F 的事实。
  • 我仍然认为答案的功劳应该归您所有,所以如果您将此作为答案发布,我将其标记为这样。

标签: r ggplot2


【解决方案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')

为您提供正确的图表:

【讨论】:

    猜你喜欢
    • 2016-06-26
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多