ggplot热图生成不出结果

3
我有一个包含1000多个数据点的大型数据文件。它是从其他23个.csv文件(称为alltraj)合并而成的大型文件。
它的格式看起来像这样:
    Track   X1        X         Y
1    Point    1 148.5000 306.83333
2    Point    2 149.8333 306.83333
3    Point    3 151.8333 307.16667
4    Point    4 152.5000 308.16667
5    Point    5 156.1667 309.16667
6    Point    6 159.1667 311.16667
7    Point    7 163.1667 311.83333
8    Point    8 166.5000 313.50000
9    Point    9 170.5000 316.16667
10   Point   10 177.1667 321.50000

其中X1是时间步长,而X和Y是鱼的位置。
我正在尝试使用以下代码制作我的X与Y轨迹频率热图:
(p <- ggplot(alltraj, aes(Y,X)) + 
    geom_tile(aes(fill = X1), colour = "white") + 
    scale_fill_gradient(low = "white",high = "steelblue"))

“然而,热力图完全未显示出来。看起来像这样:enter image description here 有人能告诉我我在代码中缺少什么导致它没有显示吗?先谢谢了!编辑:这里是我正在尝试运行的前50行代码(很不幸,比较杂乱):”
structure(list(Track = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "Point", class = "factor"), 
X1 = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 
13L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 
26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 
38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 
50L, 51L), X = c(148.5, 149.8333333, 151.8333333, 152.5, 
156.1666667, 159.1666667, 163.1666667, 166.5, 170.5, 177.1666667, 
180.8333333, 183.5, 186.1666667, 191.8333333, 192.8333333, 
194.1666667, 195.8333333, 195.5, 196.8333333, 197.1666667, 
197.1666667, 197.1666667, 198.5, 198.5, 198.8333333, 198.5, 
197.5, 198.8333333, 199.5, 199.5, 199.5, 199.8333333, 200.8333333, 
199.8333333, 201.1666667, 201.8333333, 202.5, 203.1666667, 
203.1666667, 203.1666667, 204.5, 204.5, 204.5, 204.5, 204.8333333, 
203.8333333, 203.8333333, 204.8333333, 206.1666667, 206.5
), Y = c(306.8333333, 306.8333333, 307.1666667, 308.1666667, 
309.1666667, 311.1666667, 311.8333333, 313.5, 316.1666667, 
321.5, 323.8333333, 325.8333333, 326.1666667, 327.5, 332.1666667, 
338.1666667, 341.5, 346.5, 351.1666667, 355.8333333, 360.1666667, 
364.1666667, 368.5, 371.8333333, 375.1666667, 376.5, 381.8333333, 
385.8333333, 389.5, 392.8333333, 395.8333333, 400.1666667, 
405.1666667, 408.8333333, 413.5, 417.1666667, 420.8333333, 
424.8333333, 427.8333333, 429.8333333, 433.1666667, 434.5, 
435.1666667, 435.1666667, 436.8333333, 436.8333333, 437.5, 
438.8333333, 439.8333333, 440.1666667)), row.names = c(NA, 
50L), class = "data.frame")

似乎我的热力图比例有误。当我使用前10行时,点的大小很合适,但当我使用前20行时,点变小了。当我使用前30行时,点更小了。当我使用50行时,它们几乎无法辨认。如何增加点的大小?

2
我已经复制了你的数据和代码并执行了它。它生成了一个带有瓷砖的图形,正如你所期望的那样。我注意到你的X轴从200开始,并且你没有任何观测值x>200 - KoenV
1
离题:如果您打算跟踪鱼的位置随时间变化的话,可以尝试使用geom_path。类似这样的代码:ggplot(alltraj, aes(Y,X)) + geom_path() + geom_point(aes(fill = X1), size = 2, shape = 21)。您还可以在geom_point中将size映射到X1 - markus
1个回答

3
你的代码生成了如下图所示的绘图:
alltraj <- readr::read_table("Track   X1        X         Y
Point    1 148.5000 306.83333
Point    2 149.8333 306.83333
Point    3 151.8333 307.16667
Point    4 152.5000 308.16667
Point    5 156.1667 309.16667
Point    6 159.1667 311.16667
Point    7 163.1667 311.83333
Point    8 166.5000 313.50000
Point    9 170.5000 316.16667
Point   10 177.1667 321.50000")

library("ggplot2")

p <- ggplot(alltraj, aes(Y,X)) + 
    geom_tile(aes(fill = X1), colour = "white") + 
    scale_fill_gradient(low = "white",high = "steelblue")

p

热力图不为空

热力图不为空。这很可能意味着您的可重现示例实际上无法重现问题... 当您运行上面的代码时会发生什么?

如果您忘记添加层(例如,只调用了 ggplot 但没有 geom_XXX),则通常会出现空图。如果您认为已经添加了一层但忘记了加上 + 符号,也会出现此问题...

例如,如果您运行以下代码(请注意第一行末尾缺少 + 符号),则最终将得到一个空图:

p <- ggplot(alltraj, aes(Y,X)) 
    geom_tile(aes(fill = X1), colour = "white") + 
    scale_fill_gradient(low = "white",high = "steelblue")

调查后编辑

使用geom_tile会在你指定的X和Y位置创建图块,这意味着你的X和Y已经按照网格排列!但是这里并非如此,结果就是产生了微小的图块(宽度为最小dX,高度为最小dY)。

解决方法是使用geom_bin2d,该函数首先对数据进行分组(即创建一个粗略的网格),然后再绘制。

在你的小例子中,差异不是很明显,但是图块已经变得更大了。您可以选择最合适的binwidth

ggplot(alltraj, aes(x=Y, y=X)) + 
    geom_bin2d(colour = "white", binwidth=10)

使用 geom_bin2d 绘制的热力图

但这也意味着您不能将X1用作fill(在分箱上下文中没有意义)。如果您需要绘制X1,则表示您正在使用错误的几何图形,热力图可能不合适。 Markus 在评论中建议您可能会对使用geom_path感兴趣。


如果我复制你的代码,我会得到与你相同的地图。问题在于我的表格有1000多行,所以我不能使用read_table并复制我的数据。如何编译它们,以便这将适用于我所有的数据点? - Chandler Nelson
@ChandlerNelson 试着提供一个可重现的例子 - 我不知道为什么你的图形最终为空,特别是在一个小例子上它似乎可以工作。你是否明确限制了x和y轴?此外,你知道你正在将X变量绘制在y轴上,反之亦然吗? - asachet
1
@markus:我很清楚 OP 的情节是什么样子的——这正是我问他是否明确限制了轴范围的原因。关于观察数量:根据帖子,数据集中至少有10个观察值,因此没有理由为空。在 OP 提供可重现的示例之前,我认为不能做更多的事情。 - asachet
@antoine-sac 抱歉,我对R和这个网站都非常陌生。我不确定如何在这里创建可重现的示例。如果我能以与您相同的方式读取数据集,但仅调整为更大的大小,则认为它会起作用。您知道我该怎么做吗? - Chandler Nelson
尝试隔离一部分数据以重现错误。例如,使用head(alltraj)而不是alltraj:这将仅使用前几行数据进行绘图。如果绘图为空,则与我们分享head(alltraj)。如果绘图有效,则尝试使用更多数据使其失败,使用head(alltraj, n=50)(将使用前50行)。一旦您获得了空白图,请分享您实际使用的数据和代码。您可以使用dput(head(alltraj))以可共享(尽管丑陋)的格式获取数据。 - asachet
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接