在 R 中创建连续的一维热图
Creating a continuous 1d heatmap in R
由于缺少更好的名称,我想在 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))
但与另一个问题类似,我想要一个平滑的颜色过渡。不幸的是,我对二维答案的理解不够好,无法将其适应一维。
我不太确定我理解你想要什么,但这是解决[我认为是]你的问题的尝试:
首先,你的vector很短,freq
的变化很突兀,所以会很有"tile-like"的剧情感觉。你需要先解决这个问题。我的方法是使用 spline
插值:
newdf=data.frame(x=spline(df)[[1]],freq=spline(df)[[2]],y=rep(1,times=3*length(df$x)))
请注意,我还在数据框中创建了一个 y
向量。
现在可以使用 lattice
的 levelplot
:
绘制
levelplot(freq~x*y,data=newdf)
这会产生更平滑的情节(据我了解,这就是您所需要的)。它也可以用 ggplot
:
绘制
ggplot(newdf,aes(x=x,y=y,fill=freq))+geom_tile()
========== 编辑添加 ============
请注意,您可以使用 spline
的 n
参数控制新的向量长度,从而实现更平滑的过渡 (spline(df,n=100)[[1]]
) 如果您遵循此选项,使确保你调整了 times
你在 y
的定义中重复了 1
!!默认 n
是输入向量长度的 3 倍。
由于您的数据是频率,因此将它们呈现为原始数据对我来说更有意义:
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:
由于缺少更好的名称,我想在 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))
但与另一个问题类似,我想要一个平滑的颜色过渡。不幸的是,我对二维答案的理解不够好,无法将其适应一维。
我不太确定我理解你想要什么,但这是解决[我认为是]你的问题的尝试:
首先,你的vector很短,freq
的变化很突兀,所以会很有"tile-like"的剧情感觉。你需要先解决这个问题。我的方法是使用 spline
插值:
newdf=data.frame(x=spline(df)[[1]],freq=spline(df)[[2]],y=rep(1,times=3*length(df$x)))
请注意,我还在数据框中创建了一个 y
向量。
现在可以使用 lattice
的 levelplot
:
levelplot(freq~x*y,data=newdf)
这会产生更平滑的情节(据我了解,这就是您所需要的)。它也可以用 ggplot
:
ggplot(newdf,aes(x=x,y=y,fill=freq))+geom_tile()
========== 编辑添加 ============
请注意,您可以使用 spline
的 n
参数控制新的向量长度,从而实现更平滑的过渡 (spline(df,n=100)[[1]]
) 如果您遵循此选项,使确保你调整了 times
你在 y
的定义中重复了 1
!!默认 n
是输入向量长度的 3 倍。
由于您的数据是频率,因此将它们呈现为原始数据对我来说更有意义:
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(默认):