Создание аннотаций на оси тепловых карт - PullRequest
0 голосов
/ 11 октября 2018

Я хотел бы сделать тепловую карту с некоторой дополнительной аннотацией на оси, подобной рисунку, показанному ниже.На правой вертикальной оси есть скобки и аннотации для обозначения строк определенной меткой.

Возможно ли что-то подобное в matplotlib?

enter image description here

1 Ответ

0 голосов
/ 12 октября 2018

Далее я определяю функцию, которая создает фигурную скобку на основе левого нижнего угла, ширины и высоты в качестве входных данных.
Затем ее можно использовать в цикле вместе со списками ширины и положения элемента.группы и их названия.

Обратите внимание: как первый выстрел, у этого подхода все еще есть некоторые недостатки:

  • базовая форма полностью растянута, это означает, что округление фигурных скобок изменяется с высотой (и шириной курса, которая здесь постоянна).Это может быть оптимизировано на следующем шаге.
  • , как только вы используете стиль ggplot (plt.style.use('ggplot')), он больше не отображается.Я думал, что это из-за некоторых патчей, используемых ggplo-style и их z-порядка, но до сих пор я не смог решить эту проблему.

Код:

def CurlyBrace(ll_corner=(0, 0), width=1, height=1):
    import matplotlib.path as mpath
    import matplotlib.patches as mpatches
    import numpy as np
    Path = mpath.Path
    verts = np.array([(0, 0), (.5, 0), (.5, .2), (.5, .3), (.5, .5), (1, .5), (.5, .5), (.5, .7), (.5, .8), (.5, 1), (0, 1)])
    verts[:, 0] *= width
    verts[:, 1] *= height
    verts[:, 0] += ll_corner[0]
    verts[:, 1] += ll_corner[1]

    cb_patch = mpatches.PathPatch(
        Path(verts,
             [Path.MOVETO, Path.CURVE3, Path.CURVE3, Path.LINETO, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.LINETO, Path.CURVE3, Path.CURVE3]),
        fc="none", clip_on=False, transform=ax.transData)
    return cb_patch


import imageio

im = imageio.imread(pic_dir + 'sample_heatmap.png')
fig, ax = plt.subplots()
ax.imshow(im)


bands = np.array([0, 175, 320, 448, 585, 610, 815])
bnames = ['H3K4me3', 'H3K9me3', 'H3K27me3', 'H3K36me3', 'CTCF', 'H3K4me1']
for y, h, bn in zip(bands, np.diff(bands), bnames):
    cb = CurlyBrace([990, y+h*0.025], 30, h*.95)
    ax.add_patch(cb)
    ax.text(1030, y+h/2, bn, va='center')

plt.tight_layout(rect=[0.05, 0, 0.85, 1])

Результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...