如何个性化 heatmap.2 (gplots) 中的行顺序?
How can I individualize the order of rows in heatmap.2 (gplots)?
我有兴趣使用 heatmap.2
可视化我的结果变量的分布,如 gplots
包中提供的那样。
这就是我的 数据集 的样子:
> head(data.w)
year Armenia Azerbaijan Bulgaria Croatia Cyprus Czech Republic Estonia Georgia
1998 0 0 1.14 0 1.21 1.32 1.43 0
1999 0 0 1.32 0 1.44 1.50 1.68 0
2000 0 0 1.32 0 1.63 1.59 1.75 0
2001 0.75 0 1.46 0 1.85 1.93 1.81 0
2002 0.82 0 1.74 0 2.04 2.00 2.00 0.34
2003 0.87 0 1.85 0 2.22 2.22 2.19 0.42
为了绘制 热图 ,我使用以下 代码 :
library(gplots)
library(grDevices)
min(data.w[,2:9])
max(data.w[,2:9])
data.wx <-as.matrix(data.w)
pdf("heatmap.pdf", width=10,height=5)
heatmap.2(as.matrix(t(data.w[,2:9])), trace="none",
Rowv=NULL, Colv=NULL, dendrogram="none",
labCol=data.w$year,labRow=data.w$cname,
lhei=c(0.1,1), lwid=c(0.1,1), margins=c(5,10),
colsep=1:16, rowsep=1:9, sepcolor="white",
col=gray.colors(8, start=1, end=0) )
dev.off()
总的来说,我对剧情比较满意:
然而,显示的国家实际上属于 两个不同的组 ,其中亚美尼亚、阿塞拜疆和格鲁吉亚属于 "neighbourhood" 组,其余国家属于小组 "enlargement"。
简而言之,我想按组成员资格拆分热图。在每个组中,国家不应按字母顺序或根据值列出,但我需要个性化根据某些特定标准排序。
重要的是,我不想
- 绘制两个单独的图,因为这会改变分布
颜色;
- 使用
RowSideColors
将行变量分组为
附加参数,例如建议 here 以便
对输入变量进行分类。
相反,最终的热图应该组织如下:
我需要在绘图中添加什么才能获得这样的 heatmap.2,其中行的顺序是个性化的?
请注意,不需要在分隔组的行之间额外 space。
万分感谢!
虽然不理想,但在上述情况下,我认为您可以通过删除 Rowv=NULL,
但保留 Colv=NULL, dendrogram="none",
来实现,这将对行进行排序但抑制绘制树状图。
仅凭头脑中的数据,我得到了这个 heatmap
使用此代码:
data.w = t(matrix(c(1998, 0, 0, 1.14, 0, 1.21, 1.32, 1.43, 0, 1999, 0, 0, 1.32, 0, 1.44, 1.50, 1.68, 0, 2000, 0, 0, 1.32, 0, 1.63, 1.59, 1.75, 0, 2001, 0, 0, 1.46, 0, 1.85, 1.93, 1.81, 0, 2002, 0, 0, 1.74, 0, 2.04, 2.00, 2.00, 0, 2003, 0, 0, 1.85, 0, 2.22, 2.22, 2.19, 0),9,6))
colnames(data.w) = c("year", "Armenia", "Azerbaijan", "Bulgaria", "Croatia", "Cyprus", "Czech Republic", "Estonia", "Georgia")
group = c(0,0,1,1,1,1,1,1,0)
library(gplots)
heatmap.2(as.matrix(t(data.w[,2:9])), trace="none",
# Rowv=NULL, Colv=NULL,
dendrogram="none",
# reorderfun = group,
labCol=data.w[,1],#labRow=data.w$cname,
lhei=c(0.1,1), lwid=c(0.1,1), margins=c(5,10),
colsep=1:16, rowsep=1:9, sepcolor="white",
col=gray.colors(8, start=1, end=0) )
如果加上其余年份,克罗地亚将与其他三个分开。
否则应该可以使用 reorderfun
选项来完成,但我不知道它是如何工作的。
Sebastian Raschka [http://sebastianraschka.com] 非常友善,帮助我解决了我的问题,我很乐意分享。
如果您想避免行(此处:国家名称)按字母顺序排列,您应该编写一个函数,根据需要对 DataFrame 中的国家/地区进行排序。为了简单起见并坚持使用示例,您也可以快速手动完成如此少的国家/地区:
data.w <- data.w[c("Cyprus","Czech Republic","Estonia","Bulgaria","Croatia","Armenia","Azerbaijan","Georgia")]
然后我们用占位符函数覆盖 heatmap.2 函数 reorderfun
,但是,它不会 "do" 任何东西,以便我们保持 DataFrame 的顺序。
总的来说,为了生成如上所示的热图(第二张图),代码应该是这样的。
heatmap.2(as.matrix(t(data.w)), trace="none",
Rowv=NULL, Colv=NULL, dendrogram="none",
reorderfun=function(d,w) { d },
labCol=data.w$year,labRow=data.w$cname,
lhei=c(0.1,3), lwid=c(0.1,3), margins=c(5,8),
colsep=1:16, rowsep=1:22, sepcolor="white",
col=gray.colors(8, start=1, end=0)
)
非常感谢塞巴斯蒂安!
我有兴趣使用 heatmap.2
可视化我的结果变量的分布,如 gplots
包中提供的那样。
这就是我的 数据集 的样子:
> head(data.w)
year Armenia Azerbaijan Bulgaria Croatia Cyprus Czech Republic Estonia Georgia
1998 0 0 1.14 0 1.21 1.32 1.43 0
1999 0 0 1.32 0 1.44 1.50 1.68 0
2000 0 0 1.32 0 1.63 1.59 1.75 0
2001 0.75 0 1.46 0 1.85 1.93 1.81 0
2002 0.82 0 1.74 0 2.04 2.00 2.00 0.34
2003 0.87 0 1.85 0 2.22 2.22 2.19 0.42
为了绘制 热图 ,我使用以下 代码 :
library(gplots)
library(grDevices)
min(data.w[,2:9])
max(data.w[,2:9])
data.wx <-as.matrix(data.w)
pdf("heatmap.pdf", width=10,height=5)
heatmap.2(as.matrix(t(data.w[,2:9])), trace="none",
Rowv=NULL, Colv=NULL, dendrogram="none",
labCol=data.w$year,labRow=data.w$cname,
lhei=c(0.1,1), lwid=c(0.1,1), margins=c(5,10),
colsep=1:16, rowsep=1:9, sepcolor="white",
col=gray.colors(8, start=1, end=0) )
dev.off()
总的来说,我对剧情比较满意:
然而,显示的国家实际上属于 两个不同的组 ,其中亚美尼亚、阿塞拜疆和格鲁吉亚属于 "neighbourhood" 组,其余国家属于小组 "enlargement"。
简而言之,我想按组成员资格拆分热图。在每个组中,国家不应按字母顺序或根据值列出,但我需要个性化根据某些特定标准排序。
重要的是,我不想
- 绘制两个单独的图,因为这会改变分布 颜色;
- 使用
RowSideColors
将行变量分组为 附加参数,例如建议 here 以便 对输入变量进行分类。
相反,最终的热图应该组织如下:
我需要在绘图中添加什么才能获得这样的 heatmap.2,其中行的顺序是个性化的? 请注意,不需要在分隔组的行之间额外 space。
万分感谢!
虽然不理想,但在上述情况下,我认为您可以通过删除 Rowv=NULL,
但保留 Colv=NULL, dendrogram="none",
来实现,这将对行进行排序但抑制绘制树状图。
仅凭头脑中的数据,我得到了这个 heatmap 使用此代码:
data.w = t(matrix(c(1998, 0, 0, 1.14, 0, 1.21, 1.32, 1.43, 0, 1999, 0, 0, 1.32, 0, 1.44, 1.50, 1.68, 0, 2000, 0, 0, 1.32, 0, 1.63, 1.59, 1.75, 0, 2001, 0, 0, 1.46, 0, 1.85, 1.93, 1.81, 0, 2002, 0, 0, 1.74, 0, 2.04, 2.00, 2.00, 0, 2003, 0, 0, 1.85, 0, 2.22, 2.22, 2.19, 0),9,6))
colnames(data.w) = c("year", "Armenia", "Azerbaijan", "Bulgaria", "Croatia", "Cyprus", "Czech Republic", "Estonia", "Georgia")
group = c(0,0,1,1,1,1,1,1,0)
library(gplots)
heatmap.2(as.matrix(t(data.w[,2:9])), trace="none",
# Rowv=NULL, Colv=NULL,
dendrogram="none",
# reorderfun = group,
labCol=data.w[,1],#labRow=data.w$cname,
lhei=c(0.1,1), lwid=c(0.1,1), margins=c(5,10),
colsep=1:16, rowsep=1:9, sepcolor="white",
col=gray.colors(8, start=1, end=0) )
如果加上其余年份,克罗地亚将与其他三个分开。
否则应该可以使用 reorderfun
选项来完成,但我不知道它是如何工作的。
Sebastian Raschka [http://sebastianraschka.com] 非常友善,帮助我解决了我的问题,我很乐意分享。
如果您想避免行(此处:国家名称)按字母顺序排列,您应该编写一个函数,根据需要对 DataFrame 中的国家/地区进行排序。为了简单起见并坚持使用示例,您也可以快速手动完成如此少的国家/地区:
data.w <- data.w[c("Cyprus","Czech Republic","Estonia","Bulgaria","Croatia","Armenia","Azerbaijan","Georgia")]
然后我们用占位符函数覆盖 heatmap.2 函数 reorderfun
,但是,它不会 "do" 任何东西,以便我们保持 DataFrame 的顺序。
总的来说,为了生成如上所示的热图(第二张图),代码应该是这样的。
heatmap.2(as.matrix(t(data.w)), trace="none",
Rowv=NULL, Colv=NULL, dendrogram="none",
reorderfun=function(d,w) { d },
labCol=data.w$year,labRow=data.w$cname,
lhei=c(0.1,3), lwid=c(0.1,3), margins=c(5,8),
colsep=1:16, rowsep=1:22, sepcolor="white",
col=gray.colors(8, start=1, end=0)
)
非常感谢塞巴斯蒂安!