代码之家  ›  专栏  ›  技术社区  ›  syebill

ggplot直方图未在r中显示正确的结果

  •  2
  • syebill  · 技术社区  · 10 年前

    我有一个包含117206行和4列userid、itemid、rating和date的数据框架。数据帧的结构如下所示。

     'data.frame':  117206 obs. of  4 variables:
     $ userId: Factor w/ 19043 levels "1","2","3","4",..: 1 1 2 3 3 3 4 5 5 5 ...
     $ itemId: Factor w/ 11451 levels "2844","4936",..: 7402 9729 3404 2976 7932 10035 11093 6718 8297 8537 ...
     $ rating: int  7 8 10 8 8 7 10 2 7 5 ...
     $ time  : Date, format: "2013-04-03" "2013-04-21" "2013-09-18" ...
    

    数据的开头是

    userId  itemId rating       time
    1      1 1074638      7 2013-04-03
    2      1 1853728      8 2013-04-21
    3      2  113277     10 2013-09-18
    4      3  104257      8 2013-03-31
    5      3 1259521      8 2013-03-24
    6      3 1991245      7 2013-03-24
    

    数据的尾部是

      userId  itemId rating       time
    117201  19041 2171867      3 2013-09-16
    117202  19041 2357129      5 2013-09-21
    117203  19041 2381931      4 2013-09-08
    117204  19042  816711      8 2013-06-23
    117205  19043 1559547      2 2013-07-08
    117206  19043 2415464      2 2013-07-14
    

    我正在尝试使用ggplot制作直方图,但似乎不起作用。存在以下几个问题:

    1. y轴上的计数不正确
    2. 根本不显示x轴标签

    我使用以下代码绘制直方图,并使用相同的代码为类似类型但具有100K行的不同数据集绘制正确的图。

    首先,我创建了x轴标签

    labels_mtweet = seq(1,length(unique(m_tweet$itemId)),by=600)
    

    所以我的标签从1到11451。

    ggplot(m_tweet)+geom_histogram(aes(x=itemId))+
      scale_x_discrete(breaks=labels_mtweet, labels=as.character(labels_mtweet))+
      labs(x="Movie Id", y = "Number of ratings per movie", 
           title = "Distribution of ratings per movie - MovieTweetings")
    

    上面是我用来绘制直方图的代码。当我绘制一个简单的图时,这些值会使用表格正确显示。

    plot(table(m_tweet$itemId),xlab=("Movie Id"),ylab=("Frequency of Movie Rating"),
        main=("Distribution of Ratings per movie - MovieLens"),type="l")
    

    但当试图用ggplot完成它时。这些条的高度不正确,根本不显示x标签。

    我想在这里粘贴ggplot,但由于政策原因,我不能。有人能发现哪里出了问题吗?我想我在这里遗漏了一些导致问题的东西。

    我们将非常感谢任何或所有的帮助。我没有提供“dput”的输出,因为它很长。

    谢谢

    1 回复  |  直到 10 年前
        1
  •  1
  •   CMichael    10 年前

    根据我的评论,你的代码(或我下面的变体)原则上可以工作,但不能工作,因为有超过128个离散类别。。。

    ggplot(m_tweet)+geom_histogram(aes(x=as.factor(itemId)))+
      scale_x_discrete(breaks=labels_mtweet, labels=as.character(labels_mtweet))+
      labs(x="Movie Id", y = "Number of ratings per movie", 
           title = "Distribution of ratings per movie - MovieTweetings")
    

    考虑到离散尺度的x值数量的限制,我们无法实现这一点。您可能需要考虑汇总数据,例如:

    require(plyr)
    summarizedData <- ddply(m_tweet, c("itemId"), summarise,N    = length(rating))
    

    然后可以避免使用geom_histogram,并将计数绘制为连续x轴上的geom_line:

    ggplot(summarizedData)+geom_line(aes(x=(itemId),y=N))+
      labs(x="Movie Id", y = "Number of ratings per movie", 
           title = "Distribution of ratings per movie - MovieTweetings")
    

    enter image description here