如何在 R 中对字符串数据类型使用 google 动态图或散点图?

How to use google motionchart or scatterchart for string data type in R?

我的数据类型是字符串,所以我想知道如何使用 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 中做什么?

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

  1. 我不确定是谁将这些数据集放在一起,但由于我在上面的评论中提到的原因,他们要么把时间戳弄乱了,要么遗漏了一些关于如何破译它们的非常关键的信息。
  2. 我使用了我认为最(回复:不一定正确)的 19 个字符时间戳的适当转换 - 即,将前 10 位数字作为秒数自 Unix 时代以来;但尽管这个数据集很奇怪。 5000 多个观测值少于 300 个唯一时间戳(使用 10 位数字法)?
  3. 我不知道这是课程作业还是类似的东西,你被指示使用 gvisScatterChartgvisMotionChart,但在我看来,这两个都不是特别适合这个数据集。我选择了两者中的后者。我不确定是否可以用前者表示您的数据。无论如何,您应该记住,如何 展示您的数据至少与 您展示的内容 一样重要。 googleVis 提供了一些简洁的工具,有时非常有用,但我个人觉得界面有点过于局限(可能是由于 Google 图表 API,不一定是包开发人员)。在这种情况下,gvisMotionChart 似乎不会让您绘制比日常观察更不原子的东西,所以我不得不将 1 秒的间隔转换为 1 天的间隔。

无论如何,考虑到上述问题,这里有一种可能的方法:


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)

这是动态图表的快照:


以及从您 link 中的 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
)