如何在R中使用谷歌运动图或散点图作为字符串数据类型?

时间:2015-08-17 16:47:06

标签: r csv google-visualization visualization googlevis

我的数据类型是字符串,所以我想知道如何为此目的使用Google动态图表或Google散点图之一?我希望我的y轴显示其中一个水果和x轴以显示时间戳。我收到了这个错误:

> motion
   dd.rosbagTimestamp    dd.data
1 1438293900729698553 strawberry
2 1438293901681590725    avocado
3 1438293904496769068    avocado
4 1438293943211221553  blueberry
5 1438293963216807017       kiwi
> gvisScatterChart(motion)
Error in gvis(type = type, checked.data, options = options, chartid = chartid,  : 
  Only the following data types are allowed: number
However, dd.rosbagTimestamp, dd.data is of type string, string

问题是如果你有像水果名字这样的字符串格式的数据,你会在googlevis中做什么? enter image description here

1 个答案:

答案 0 :(得分:2)

在进入解决方案之前,我想指出一些事情:

  1. 我不确定是谁将这些数据集合在一起,但他们要么把时间戳搞砸了,要么遗漏了一些关于如何破译它们的关键信息,原因在我上面的评论中提到。
  2. 我使用了我认为 most (re:不一定正确)的19个字符时间戳的适当转换 - 即将前10个数字作为自Unix纪元以来的秒数;但即使这个数据集很奇怪。具有少于300个唯一时间戳的5000多个观测值(使用10位数方法)?
  3. 我不知道这是一个课程作业或类似的东西,并且您被指示使用gvisScatterChartgvisMotionChart,但两者都不适合此数据集IMO。我选择了后两者;我不确定是否可以用前者表示您的数据。无论如何,您应该记住, 您提供的数据至少对于您所呈现的 至关重要。 googleVis提供了一些有时非常有用的简洁工具,但我个人认为界面有点过于严格(可能是由于Google Charts API,而不一定是软件包开发人员的错误)。在这种情况下,gvisMotionChart似乎不允许你绘制比每日观察更少原子的东西,所以我不得不将1秒间隙转换为1天间隙。
  4. 无论如何,鉴于上述问题,这里有一种可能的方法:

    library(data.table)
    library(googleVis)
    ##
    mdt <- data.table(motion)
    gdt <- mdt[
      ,.(frequency = .N), 
      keyby = "tstamp,fruit"]
    
    gdt[
      ,time_value := as.numeric(
        tstamp - min(gdt$tstamp))]
    gdt[
      ,scaled_date := min(
        as.Date(gdt$tstamp)) + time_value]
    ##
    plot_data <- data.frame(
      idvar = gdt$fruit,
      timevar = gdt$scaled_date,
      frequency = gdt$frequency,
      fruit = gdt$fruit)
    ##
    gmc <- gvisMotionChart(
      data = plot_data,
      idvar = "idvar",
      timevar = "timevar",
      yvar = "frequency",
      colorvar = "fruit",
      date.format = "%Y-%m-%d")
    ##
    R> plot(gmc)
    

    这是动态图表的快照: enter image description here

    原始数据,从您链接中的CSV文件中读取:

    Df <- read.csv(
      file = "~/tmp/gazedata.csv.txt",
      sep = ",", header = TRUE,
      colClasses = "character",
      stringsAsFactors = FALSE
    )
    ##
    motion <- data.frame(
      tstamp = as.POSIXct(
        as.numeric(substr(Df[,1], 1, 10)),
        tz = "UTC",
        origin = "1970-01-01 00:00:00"),
      fruit = Df$data
    )