почему код делает то, что делает
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](https://i.stack.imgur.com/bEcb7.png)
что можно сделать дляисправить это
Итак, вы хотите изменить 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()