在R中创建连续的一维热图

6

为了方便,我想在R中创建一个连续的1维热力图,即这个问题的1维版本。

使用的玩具数据:

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个回答

5

因为你的数据是频率,所以更有意义的做法是将它们呈现为原始数据:

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()

你可以在 density 调用中使用 adjust 参数来改变平滑的程度。

默认为 1: plot1 调整为 0.5: plot2 调整为 0.3: plot3


谢谢,外观方面这正是我想要的。然而,平滑后的版本看起来并不像我的原始网格版本:平滑版本在两侧比中心更暗,而我的原始版本在中间有较暗的列。我希望能够反映相同程度的颜色强度。 - Ricky

1
我不完全确定我理解了你想要什么,但这是我试图解决[我认为是]你的问题的尝试:
首先,你拥有的向量非常短,而且freq的变化非常突然,所以这将使绘图具有非常“平铺状”的感觉。你需要先解决这个问题。我的方法是使用spline插值:
 newdf=data.frame(x=spline(df)[[1]],freq=spline(df)[[2]],y=rep(1,times=3*length(df$x)))

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

现在可以使用latticelevelplot进行绘制:

levelplot(freq~x*y,data=newdf)

这将产生更平滑的图形(据我理解,这正是您所需要的)。也可以使用ggplot绘制:

ggplot(newdf,aes(x=x,y=y,fill=freq))+geom_tile()

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

请注意,您可以通过 splinen 参数控制新向量的长度,从而实现更平滑的过渡(spline(df,n=100)[[1]])。如果您选择这个选项,请确保调整在 y 定义中重复 1 的次数!!默认值的 n 是输入向量长度的 3 倍。


谢谢,这似乎展示了我想要的内容。只是好奇,因为值始终为1,所以似乎不需要向量y,所以我可以在levelplotggplot中将其替换为1。我有什么遗漏吗? - Ricky
很好,它解决了你的需求。关于Y,你可以在绘图调用中直接定义为1,就像你说的那样。如果这回答了你的问题,你可以考虑将其标记为已接受。 - PavoDive

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