2016-05-30 39 views
0

假设我想绘制以下数据:如何在ggplot的纵坐标中绘制不规则数据的热图?

# First set of X coordinates 
x <- seq(0, 10, by = 0.2) 
# Angles from 0 to 90 degrees 
angles <- seq(0, 90, length.out = 10) 
# Convert to radian 
angles <- deg2rad(angles) 
# Create an empty data frame 
my.df <- data.frame() 
# For each angle, populate the data frame 
for (theta in angles) { 
    y <- sin(x + theta) 
    tmp <- data.frame(x = x, y = y, theta = as.factor(theta)) 
    my.df <- rbind(my.df, tmp) 
} 

x1 <- seq(0, 12, by = 0.3) 
y1 <- sin(x1 - 0.5) 
tmp <- data.frame(x = x1, y = y1, theta = as.factor(-0.5)) 
my.df <- rbind(my.df, tmp) 

ggplot(my.df, aes(x, y, color = theta)) + geom_line() 

这给了我一个很好的情节:

enter image description here

现在我想提请热图出这个数据集。有教程herethere这样做使用geom_tile来做到这一点。

所以,让我们试试:

# Convert the angle values from factors to numerics 
my.df$theta <- as.numeric(levels(my.df$theta))[my.df$theta] 
ggplot(my.df, aes(theta, x)) + geom_tile(aes(fill = y)) + scale_fill_gradient(low = "blue", high = "red") 

Too bad

这并不工作,原因是我的X坐标不具有相同的步骤:

x <- seq(0, 10, by = 0.2) VS x1 <- seq(0, 12, by = 0.3)

但只要我使用相同的步骤x1 <- seq(0, 12, by = 0.2),它的工作原理:

Tada!

我现实生活中,我的数据集不定时间隔(这是实验数据),但我仍然需要将其显示为热图。我能怎么做?

+1

你有没有一起来看看:http://stackoverflow.com/questions/7001710/how-can-i-force-ggplots-geom-tile-to-fill-every-方面? – bVa

+0

geom_tile()使用数据中的最小步骤来确定切片的大小。您示例中的最小步骤很小,以至于瓷砖不再可见。所以你需要创建一个更粗糙的数据集。例如。通过舍入theta和x。或者将y的值插入粗糙网格。 – Thierry

+0

@bVa现在正在看它。我尝试过并且无法使其工作 – Ben

回答

2

您可以使用akima将函数内插到适合于热图图形的表单中。

library(akima) 
library(ggplot2) 
my.df.interp <- interp(x = my.df$theta, y = my.df$x, z = my.df$y, nx = 30, ny = 30) 
my.df.interp.xyz <- as.data.frame(interp2xyz(my.df.interp)) 
names(my.df.interp.xyz) <- c("theta", "x", "y") 

ggplot(my.df.interp.xyz, aes(x = theta, y = x, fill = y)) + geom_tile() + 
scale_fill_gradient(low = "blue", high = "red") 

enter image description here

如果您希望使用不同的分辨率,您可以更改nxny参数interp

ggplot2做的另一种方法是使用stat_summary_2d

library(ggplot2) 
ggplot(my.df, aes(x = theta, y = x, z = y)) + stat_summary_2d(binwidth = 0.3) + 
scale_fill_gradient(low = "blue", high = "red") 

enter image description here