【问题标题】:Creating a continuous 1d heatmap in R在 R 中创建连续的一维热图
【发布时间】:2015-08-01 09:48:10
【问题描述】:

由于没有更好的名称,我想在 R 中创建一个连续的一维热图,即 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))

但与其他问题类似,我希望有一个平滑的颜色过渡。不幸的是,我对二维答案的理解不够好,无法适应一维。

【问题讨论】:

    标签: r ggplot2 heatmap


    【解决方案1】:

    由于您的数据是频率,因此将它们呈现为原始数据对我来说更有意义:

    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(默认): 调整 0.5: 调整 0.3:

    【讨论】:

    • 谢谢,从外观上看,这就是我想要的。然而,平滑的水平看起来不像我原来的网格版本:平滑版本似乎在侧面而不是中心更暗,而我原来的中间有更暗的列。我希望能够反映相同级别的颜色强度
    【解决方案2】:

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

    首先,你的向量很短,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]])如果您遵循此选项,请确保调整times 您在y的定义中重复1!!。默认n 是输入向量长度的 3 倍。

    【讨论】:

    • 谢谢,这似乎显示了我想要的。只是好奇,似乎我不需要向量 y,因为该值始终为 1,所以我可以将其替换为 levelplotggplot 中的一个。我错过了什么吗?
    • 很好,它满足了您的需求。关于 Y,您可以直接在绘图调用中定义为 1,如您所说。如果这回答了您的问题,您可以考虑将其检查为已接受。
    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 2017-06-15
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多