热力图中的标签分组

3
我有一个数组,其中ij个条目是区域ij之间共同表达差异基因的数量。类似于这个问题这个问题,我想在x轴上对标签进行分组,以避免图形过于拥挤。Hawrylycz等人(2012)中的热图的xticklabels是我想要的一个很好的例子。 xticklabels是相对通用的区域。例如,在额叶下的所有列都对应于大脑内额叶结构。我不想复制yticklabels或条形图嵌入。对于热图中的每个框,我都有一个本体论。我选择绘制几个区域的结构,例如仅“额叶和顶叶”。使用本体论,我可以发现每个结构的一组列的起始索引和结束索引。如何使用这些索引来绘制组标签?

1
http://matplotlib.org/api/ticker_api.html#tick-locating 上有关于近乎完全的控制的详细信息。然而,ax.xticks',ax.set_xticklabels` 可能已经足够了。 - cphlewis
1
这个可能会有用:http://stanford.edu/~mwaskom/software/seaborn/examples/structured_heatmap.html - cphlewis
是的!在尝试回答我的问题时,我也发现了seaborn。 - mac389
我也在想,如果没有一个类可以像上面那样做标准图,那么制作一个将是一个很好的有用练习。 - cphlewis
1个回答

2

就像这样:

import pandas as pd
from numpy.random import random_integers
from numpy import reshape
import matplotlib.pyplot as plt
from matplotlib.ticker import FixedLocator, FixedFormatter
alph = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
lalph = list(alph.lower())
alph = list(alph)

df = pd.DataFrame(random_integers(0,100,(26,26)),columns=alph,
                  index=lalph)

# Two lines just to make a plaid image in imshow 
differ = reshape([sum(df[col2]-df[col]) for col2 in df for col in df], (26,26))
differ = pd.DataFrame(differ, columns=alph,index=alph)

# pick the labels you want
ticks = [2, 14, 18, 19, 22] # C=2 because A=0 because Python is 0-indexed
ticklabels = [alph[x] for x in ticks]

fig = plt.figure(figsize=(3,5))
ax = fig.add_subplot(111)
ax.imshow(differ)
ax.autoscale(False)

# display only the chosen ticks and ticklabels
ax.xaxis.set_major_locator(FixedLocator(ticks))
ax.xaxis.set_major_formatter(FixedFormatter(ticklabels))

enter image description here

您将拥有一组字符串,这些字符串命名基因,而不是作为字母列表使用的字符串,但imshow轴索引仍然是基础numpy数组的索引。


你如何绘制一个发夹或者横杠来表示'C'、'O'等的跨度? - mac389
1
这些条形图将成为第二个子图上的条形图,该子图与主子图共享X轴;垂直线条勾勒它们,使其一直延伸到主图的边缘。联动子图可能是最简单的方法。主子图中的白色轮廓,矩形带有白色边缘颜色和无面颜色。这是标准数据的标准绘图类型吗? - cphlewis
这是基因表达数据的标准绘图类型。R可以绘制这些图形。我更喜欢Python,因为我分析多种类型的数据,并且我发现Python代码更易于阅读。 - mac389

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