ggplot

时间:2017-10-11 00:18:35

标签: r ggplot2 zoo

我有样本群组数据,当用ggplot()绘制时,没有颜色编码或以适当的时间顺序显示。以下代码用于生成绘图:

library(ggplot2)

blues <- colorRampPalette(c('lightblue', 'darkblue'))

p <- ggplot(cohort.chart, aes(x=month, y=users, group=cohort))
p + geom_area(aes(fill = cohort)) +
  scale_fill_manual(values = blues(12)) +
  ggtitle('Users by cohort') +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

enter image description here

正如您在传奇中所看到的那样,月份不按时间顺序排列,这反映在情节中。我尝试使用cohortmonthyearmon更改为as.yearmon()对象,但这会产生无法使用连续变量的错误。如何在ggplot()中解决此问题?

这是数据

> dput(cohort.chart)
structure(list(cohort = structure(c(11L, 10L, 3L, 5L, 4L, 8L, 
1L, 9L, 7L, 6L, 2L, 12L, 11L, 10L, 3L, 5L, 4L, 8L, 1L, 9L, 7L, 
6L, 2L, 12L, 11L, 10L, 3L, 5L, 4L, 8L, 1L, 9L, 7L, 6L, 2L, 12L, 
11L, 10L, 3L, 5L, 4L, 8L, 1L, 9L, 7L, 6L, 2L, 12L, 11L, 10L, 
3L, 5L, 4L, 8L, 1L, 9L, 7L, 6L, 2L, 12L, 11L, 10L, 3L, 5L, 4L, 
8L, 1L, 9L, 7L, 6L, 2L, 12L, 11L, 10L, 3L, 5L, 4L, 8L, 1L, 9L, 
7L, 6L, 2L, 12L, 11L, 10L, 3L, 5L, 4L, 8L, 1L, 9L, 7L, 6L, 2L, 
12L, 11L, 10L, 3L, 5L, 4L, 8L, 1L, 9L, 7L, 6L, 2L, 12L, 11L, 
10L, 3L, 5L, 4L, 8L, 1L, 9L, 7L, 6L, 2L, 12L, 11L, 10L, 3L, 5L, 
4L, 8L, 1L, 9L, 7L, 6L, 2L, 12L, 11L, 10L, 3L, 5L, 4L, 8L, 1L, 
9L, 7L, 6L, 2L, 12L), .Label = c("Apr 2017", "Aug 2017", "Dec 2016", 
"Feb 2017", "Jan 2017", "Jul 2017", "Jun 2017", "Mar 2017", "May 2017", 
"Nov 2016", "Oct 2016", "Sep 2017"), class = "factor"), month = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 
9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 10L, 10L, 10L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 11L, 
11L, 11L, 11L, 11L, 11L, 11L, 11L, 12L, 12L, 12L, 12L, 12L, 12L, 
12L, 12L, 12L, 12L, 12L, 12L), .Label = c("Oct 2016", "Nov 2016", 
"Dec 2016", "Jan 2017", "Feb 2017", "Mar 2017", "Apr 2017", "May 2017", 
"Jun 2017", "Jul 2017", "Aug 2017", "Sep 2017"), class = "factor"), 
    users = c(795, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 672, 92, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, 48, 26, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 506, 37, 14, 26, 0, 0, 0, 0, 0, 0, 0, 0, 514, 
    46, 18, 19, 37, 0, 0, 0, 0, 0, 0, 0, 532, 47, 16, 18, 22, 
    57, 0, 0, 0, 0, 0, 0, 589, 55, 15, 20, 24, 39, 88, 0, 0, 
    0, 0, 0, 548, 53, 18, 21, 25, 39, 62, 172, 0, 0, 0, 0, 559, 
    53, 20, 20, 23, 36, 61, 139, 133, 0, 0, 0, 538, 58, 17, 18, 
    22, 39, 54, 130, 99, 109, 0, 0, 519, 45, 16, 19, 26, 39, 
    50, 125, 96, 86, 115, 0, 530, 54, 18, 20, 23, 37, 51, 129, 
    88, 75, 85, 126)), row.names = c(NA, -144L), .Names = c("cohort", 
"month", "users"), class = "data.frame")

情节应该类似于以下内容:

enter image description here

2 个答案:

答案 0 :(得分:2)

根据您提供的数据框,您的month列位于正确的因子级别,但cohort列不是,因此请将cohort列的因子级别更改为与您的month列相同。

library(ggplot2)

blues <- colorRampPalette(c('lightblue', 'darkblue'))

# Change the factor level
cohort.chart$cohort <- factor(cohort.chart$cohort, levels = levels(cohort.chart$month))

p <- ggplot(cohort.chart, aes(x=month, y=users, group=cohort))
p + geom_area(aes(fill = cohort)) +
  scale_fill_manual(values = blues(12)) +
  ggtitle('Users by cohort') +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

enter image description here

答案 1 :(得分:2)

创建数据框时,R(自动)将字符串转换为因子,按字母顺序为每个新cohort日期创建一个新因子。

cohort.chart$cohort 
[1]... 12 Levels: Apr 2017 Aug 2017 Dec 2016 Feb 2017 Jan 2017 Jul 2017 Jun 2017 Mar 2017 May 2017 ... Sep 2017

您可以使用as.yearmon来解决此问题,之后您只需转换回一个因素即可。

cohort.chart$cohort <- as.yearmon(cohort.chart$cohort) 
cohort.chart$cohort <- as.factor(cohort.chart$cohort)