在R中创建连续的1d热图

时间:2015-08-01 09:48:11

标签: r ggplot2 heatmap

由于缺少一个更好的名字,我想在R中创建一个连续的1-d热图,即this question的一维版本

要使用的玩具数据:

df <- data.frame(x=1:20,
  freq=c(8, 7, 5, 6, 10, 4, 2, 9, 3, 10, 1, 8, 4, 7, 2, 6, 7, 6, 9, 9))

我可以使用

创建粗网格输出
ggplot(data=df, aes(x=x, y=1)) + geom_tile(aes(fill=freq))

但与其他问题类似,我希望有一个平滑的颜色过渡。不幸的是,我不能很好地理解2-d的答案,以使其适应1-d。

2 个答案:

答案 0 :(得分:4)

由于您的数据是频率,因此将它们显示为原始数据更有意义:

df2 <- unlist(apply(df, 1, function(x) rep(x[1], x[2])))

然后我会使用内核密度来创建类别的平滑表示:

df2 <- density(df2, adjust = 1)
df2 <- data.frame(x = df2$x, y = df2$y) #shouldn't there be an as.data.frame method for this?

然后绘制为瓷砖:

ggplot(df2, aes(x = x, y = 1, fill = y)) + geom_tile()

您可以使用adjust调用中的density参数来更改平滑级别。

调整1(默认值): plot1 调整0.5: plot2 调整0.3: plot3

答案 1 :(得分:1)

我不完全确定我理解你想要什么,但这是试图解决[我认为]你的问题:

首先,你拥有的矢量非常短,freq上的变化是非常突然的,所以这将形成一个非常“瓦片般”的情节感觉。你需要先解决这个问题。我的方法是使用spline插值:

 newdf=data.frame(x=spline(df)[[1]],freq=spline(df)[[2]],y=rep(1,times=3*length(df$x)))

请注意,我还在数据框中创建了y向量。

现在可以使用lattice的{​​{1}}:

进行绘制
levelplot

这会产生更平滑的情节(据我所知,这就是你需要的)。它也可以用levelplot(freq~x*y,data=newdf)

绘制
ggplot

==========编辑添加============

请注意,您可以使用ggplot(newdf,aes(x=x,y=y,fill=freq))+geom_tile() 的{​​{1}}参数控制新的向量长度,从而实现更平滑的过渡(spline)如果您按照此选项操作,请确保在n的定义中调整spline(df,n=100)[[1]]重复times !!默认1是输入向量长度的3倍。