2017-10-11 89 views
0

我使用ggplot()绘制的样本群组数据未按照适当的时间顺序进行颜色编码或显示。下面的代码是用来生成的情节:gomplot中的Geom_area订单

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

正如你可以在图例中看到,几个月都没有按时间顺序排列,并且反映在情节。我试图用as.yearmon()cohortmonth改为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

基于数据帧你提供,你的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

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)