繁体   English   中英

在seaborn热图上编辑轴标记和位置标记会导致空图

[英]Editing the labels and position of the axis ticks on a seaborn heatmap results in an empty plot

我试图用两个轴上的自定义位置和标签绘制一个seaborn热图。 数据框如下所示:

数据帧

我可以用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轴标签与指定的刻度不对应。

有人可以协助我正确地策划这个吗?

为什么代码会做它的功能

ax.get_xticks()返回刻度的位置。 您可以看到它们介于0.5和3000之间。这些值指的是数据的索引。 plt.xticksax.set_xticks设置的较大值仍被解释为数据索引。 因此,如果您有10行数据,并将xticks设置为[0, 1000] xticks [0, 1000] ,则图中的数据将仅占据x范围的1%,因此消失。 我不确定我是否清楚自己,所以我将举例说明合成数据:

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()

在此输入图像描述

可以做些什么来解决它

那么,你想要做的是根据你的数据大小改变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个均匀间隔的xticks。 我们可以使用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()

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM