ggplot2热图:如何保留标签顺序?

7

我正在尝试使用casbon的解决方案在ggplot2中绘制热力图,使用csv数据。

http://biostar.stackexchange.com/questions/921/how-to-draw-a-csv-data-file-as-a-heatmap-using-numpy-and-matplotlib

问题是x-label试图重新排序。例如,如果我在该示例数据中交换标签COG0002和COG0001,则x-label仍按排序顺序显示(cog0001,cog0002,cog0003... cog0008)。
是否有任何方法可以防止这种情况发生?我希望它按照csv文件中的顺序排序。
谢谢

pp


下面有很好的答案。在研究这个问题时,我要提醒你注意'有序因子'。除非你知道自己在做什么,否则不要使用它。将水平按特定顺序排列和使用有序因子是不同的。例如,有序因子会导致一些建模软件默认使用多项式效应而不是处理效应。 - John
3个回答

7

如果我没记错的话,当使用默认的levels参数调用factor(x)时,级别被设置为levels = sort(unique(x))。

你可以通过设置levels = unique(x)来覆盖此操作。

例如:

set.seed(1)
x = sample(letters, 100, replace = TRUE)
head(x, 5)

[1] "g" "j" "o" "x" "f"

levels(factor(x))

[1] "a"、"b"、"c"、"d"、"e"、"f"、"g"、"h"、"i"、"j"、"k"、"l"、"m"、"n"、"o"、"p"、"q"、"r" 和 "s"

[20] "t"、"u"、"v"、"w"、"x"、"y" 和 "z"

levels(factor(x, levels = unique(x)))

[1] "g" "j" "o" "x" "f" "y" "r" "q" "b" "e" "u" "m" "s" "z" "d" "k" "a" "w" "i"

[20] "p" "v" "c" "n" "t" "l" "h"

您可以看到,将levels设置为unique(x)可以保留数据中出现的顺序。


6
如果您想直接从CSV文件中保留顺序:
foomelt$COG <- factor(foomelt$COG, levels = unique(as.character(foo[[1]])))

1
在这种情况下不是问题,但如果有重复的条目,则应该使用unique(as.character(foo[[1]])) - Marek

2

您尝试在绘图之前重新排序因子水平了吗? 例如:

foomelt$COG = factor(foomelt$COG,levels(foomelt$COG)[c(2,1,3:8)])

我现在无法尝试,所以不能确定它是否有效。


我认为我无法手动排序,因为我的数据大约有100个或更多的点。 - Tg.

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