Редактирование меток и положения отметок оси на тепловой карте морского дна приводит к появлению пустого графика - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь построить тепловую карту морского побережья с пользовательскими местоположениями и метками на обеих осях.Фрейм данных выглядит следующим образом:

Фрейм данных

Я могу построить это нормально с помощью seaborn.heatmap:

fig, ax = plt.subplots(figsize=(8, 8))
sns.heatmap(genome_freq.applymap(lambda x: np.log10(x+1)),
            ax=ax)
plt.show()

Обычная тепловая карта

У меня есть список позиций, которые я хотел бы установить в качестве xticks (binned_chrom_genome_pos):

[1000000, 248000000, 491000000, 690000000, 881000000, 1062000000, 1233000000, 1392000000, 1538000000, 1679000000, 1814000000, 1948000000, 2081000000, 2195000000, 2301000000, 2402000000, 2490000000, 2569000000, 2645000000, 2709000000, 2772000000, 2819000000, 2868000000, 3023000000]

Однако, когда я пытаюсь изменить xticks, графикстановится пустым:

plt.xticks(binned_chrom_genome_pos)

Модифицированная тепловая карта

Я также заметил, что метки оси X не соответствуют указанным галочкам.

Возможнокто-нибудь поможет мне правильно построить это?

1 Ответ

0 голосов
/ 26 мая 2019

почему код делает то, что делает

ax.get_xticks() возвращает позиции тиков.Вы можете видеть, что они находятся между 0,5 и 3000. Эти значения относятся к индексу ваших данных.Большие значения, установленные plt.xticks или ax.set_xticks, по-прежнему интерпретируются как индексы данных.Таким образом, если у вас есть 10 строк данных и для xticks установлено значение [0, 1000], данные на вашем рисунке будут занимать только 1% от x-диапазона и, следовательно, исчезнут.Я не уверен, что я проясняю себя, поэтому приведу пример с синтетическими данными:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

#generating data
dic = {a:np.random.randint(0,1000,100) for a in range(0,1000000, 10000)}
genome_freq = pd.DataFrame(dic, index=range(0,1000000, 10000))

#plotting heatmaps
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))

sns.heatmap(genome_freq.applymap(lambda x: np.log10(x+1)),
            ax=ax1)

sns.heatmap(genome_freq.applymap(lambda x: np.log10(x+1)),
            ax=ax2)


old_ticks = ax2.get_xticks()
print(np.min(old_ticks), np.max(old_ticks), len(old_ticks)) # prints 0.5 99.5 34

ax2.set_xticks([0,300]) # setting xticks with values way larger than your index squishes your data

plt.show()

enter image description here

что можно сделать дляисправить это

Итак, вы хотите изменить xticks в зависимости от размера ваших данных, а затем переписать xticklabels:

, учитывая новые метки из вашего вопроса:

new_labels = [1000000, 248000000, 491000000, 690000000, 881000000, 1062000000, 1233000000, 1392000000, 1538000000, 1679000000, 1814000000, 1948000000, 2081000000, 2195000000, 2301000000, 2402000000, 2490000000, 2569000000, 2645000000, 2709000000, 2772000000, 2819000000, 2868000000, 3023000000]

len(new_labels) # returns 24

fig, ax = plt.subplots(figsize=(4, 4))
sns.heatmap(genome_freq.applymap(lambda x: np.log10(x+1)),
            ax=ax)

Итак, теперь нам нужно 24 равномерно распределенных клика между первым минимумом и первым максимумом.Мы можем использовать np.linspace для достижения этого:

old_ticks = ax.get_xticks()
new_ticks = np.linspace(np.min(old_ticks), np.max(old_ticks), len(new_labels))
ax.set_xticks(new_ticks)
ax.set_xticklabels(new_labels)
plt.show()

enter image description here

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