【问题标题】:Why does coord_equal break my heatmap为什么 coord_equal 会破坏我的热图
【发布时间】:2016-06-11 20:29:35
【问题描述】:

我正在尝试使用以下数据创建热图:

> head(myData.aggregated)
             datetime value       date                time
1 2016-03-31 14:19:00     3 2016-03-31 2016-06-11 14:19:00
2 2016-03-31 14:49:00    69 2016-03-31 2016-06-11 14:49:00
3 2016-03-31 15:49:00     5 2016-03-31 2016-06-11 15:49:00
4 2016-03-31 16:19:00     7 2016-03-31 2016-06-11 16:19:00
5 2016-03-31 17:49:00     2 2016-03-31 2016-06-11 17:49:00
6 2016-03-31 18:19:00     7 2016-03-31 2016-06-11 18:19:00

> tail(myData.aggregated)
              datetime value       date                time
90 2016-04-06 13:19:00     1 2016-04-06 2016-06-11 13:19:00
91 2016-04-06 13:49:00    25 2016-04-06 2016-06-11 13:49:00
92 2016-04-06 14:19:00     7 2016-04-06 2016-06-11 14:19:00
93 2016-04-06 14:49:00     1 2016-04-06 2016-06-11 14:49:00
94 2016-04-06 22:19:00     3 2016-04-06 2016-06-11 22:19:00
95 2016-04-06 22:49:00    14 2016-04-06 2016-06-11 22:49:00

还有以下 ggplot2 命令。

ggplot(myData.aggregated, aes(x = time, y = date, fill = scale(value))) + geom_tile() + coord_equal()

只要我添加 coord_equal() 结果就是一个空白图。有人可以向我解释为什么会发生这种情况以及如何解决它。我的目标是每 30 分钟获得一个带有方形图块的热图。

更新 1:

> dput(head(myData.aggregated))
structure(list(datetime = structure(c(1459426740, 1459428540, 
1459432140, 1459433940, 1459439340, 1459441140), class = c("POSIXct", 
"POSIXt"), tzone = ""), value = c(3L, 69L, 5L, 7L, 2L, 7L), date = structure(c(16891, 
16891, 16891, 16891, 16891, 16891), class = "Date"), time = structure(c(1465647540, 
1465649340, 1465652940, 1465654740, 1465660140, 1465661940), class = c("POSIXct", 
"POSIXt"), tzone = "")), .Names = c("datetime", "value", "date", 
"time"), row.names = c(NA, 6L), class = "data.frame")

【问题讨论】:

  • 请在您的问题中输入dput(myDataSample) 的输出,其中myDataSample 是您的数据框样本,在使用您的代码运行时会显示相同的问题。
  • scale(x) 中的x 是什么?你的意思是scale(value)
  • 没错,我的意思是scale(value)

标签: r datetime ggplot2 heatmap


【解决方案1】:

TL;DR: y 轴跨越六个单位,x 轴跨越数万个单位。当您添加coord_equal 时,y 轴会被压缩到 x 轴物理长度的大约 1/10,000,从而有效地使绘图区域消失。 date 列(y 轴)恰好以天为单位,time 列(x 轴)以秒为单位,但两者都被 ggplot 视为无单位数字。您也可以以秒为单位指定 y 轴,但这仍然会为您提供一个纵横比至少为 6:1 的绘图。有关代码和其他详细信息,请参见下文。


实际情况如下:date 采用 Date 格式,因此以天为单位,范围为 6 天。 time 采用 POSIXct 格式,以秒为单位,范围(因为我们只对一天中的时间感兴趣,而与日期无关)为数万秒(最多为86,400 秒,或一天的长度)。

DatePOSIXct 格式的基础值只是分别附加了 DatePOSIXct 类的数值。结果,当您添加 coord_equal 时,y 轴上的一个单位与 x 轴上的 1 个单位占用相同的物理距离,因为 ggplot(显然)根据值的数值大小计算 coord_equal,不考虑他们的日期时间类。但整个 y 轴跨越 6 个单位,而 x 轴跨越数万个单位。因此,当您需要coord_equal 时,y:x 纵横比会被压缩到大约 1:10,000 左右,从而使绘图在所有实际用途中消失。

您可以以秒为单位指定 x 轴和 y 轴,但即便如此,y 轴将至少跨越 x 轴范围(6 天)的六倍(最多 1 天),从而产生 y: x 与coord_equal 的纵横比至少为 6:1,优于 1:10,000,但仍然不是很实用。

这是一个假数据的例子:

# Fake data
set.seed(4959)
dat = data.frame(datetime=seq(as.POSIXct("2016-03-31"), as.POSIXct("2016-04-06"), by="hour"))
dat$value = sample(1:50, nrow(dat), replace=TRUE)

ggplot(dat, 
       aes(x = as.POSIXct(as.numeric(datetime) %% 86400, 
                          tz="UTC", origin=as.Date("2016-01-01")), 
           y = as.POSIXct(as.Date(datetime)), 
           fill = scale(value))) + 
  geom_tile() + 
  labs(y="Date", x="Time") + 
  scale_x_datetime(date_labels="%H:%m") +
  coord_equal()

在上面的代码中,要创建 y 值,我们首先将其转换为 Date 格式,这会消除一天中的时间,然后再转换回 POSIXct,将单位转换为秒,但时间等于午夜给定日期的所有 datetime 值的那一天。

要创建 x 值,我们只需要以午夜后的秒数为单位的时间,因此我们计算 datetime 除以 86400(一天中的秒数)后的数值的余数。 tz=UTC 是正确设置时间所必需的,origin(可以是任何日期;我们只需要一天中的时间)对于使函数运行而不会出现错误是必需的。

下面是有和没有coord_equal 的情节。请注意,对于coord_equal,跨越一天时间(从午夜到午夜)的 x 轴与 y 轴上的一天长度相同。那是因为我们以秒为单位命名了 y 和 x 值。但是,只要 y 轴跨越几天而 x 轴只跨越一天,coord_equal 就会导致不理想的纵横比。

如果 y 值以天而不是秒为单位并且指定了 coord_equal,则以下演示了 y 轴如何相对于 x 轴被压扁:

ggplot(dat, 
       aes(x = as.POSIXct(as.numeric(datetime) %% 86400, 
                          tz="UTC", origin=as.Date("2016-01-01")), 
           y = as.Date(datetime), 
           fill = scale(value))) + 
  geom_tile() + 
  labs(y="Date", x="Time") + 
  scale_x_datetime(date_labels="%H:%m") + 
  coord_equal()

【讨论】:

    猜你喜欢
    • 2021-06-15
    • 2013-06-25
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多