Python 重叠的yticklabels:是否可以控制seaborn中热图的单元大小?

Python 重叠的yticklabels:是否可以控制seaborn中热图的单元大小?,python,matplotlib,heatmap,axis-labels,seaborn,Python,Matplotlib,Heatmap,Axis Labels,Seaborn,我有一个大约有200个观测值的数据集,我想把它绘制成热图。每个观察都有一个与之关联的字符串,我想显示它。我的问题是,我无法阅读这些标签,因为它们相互重叠。因此,我的问题是,是否可以以某种方式将热图的单元格大小设置为yticklabel的字体大小,或者是否有其他解决方法 在下面的示例中,我使用随机数据进行说明: import seaborn as sns import numpy as np data = np.random.rand(200, 10) ax = sns.heatmap(data)

我有一个大约有200个观测值的数据集,我想把它绘制成热图。每个观察都有一个与之关联的字符串,我想显示它。我的问题是,我无法阅读这些标签,因为它们相互重叠。因此,我的问题是,是否可以以某种方式将热图的单元格大小设置为
yticklabel
的字体大小,或者是否有其他解决方法

在下面的示例中,我使用随机数据进行说明:

import seaborn as sns
import numpy as np
data = np.random.rand(200, 10)
ax = sns.heatmap(data)
for item in ax.get_yticklabels():
    item.set_rotation(0)
这给了我:

有没有办法使这些标签可读?在理想情况下,我会有一个选项,允许我将单元格高度设置为
yticklabels
的fontsize。可能吗

编辑:

如评论中所述,一种可能性是增加数字的大小。我试着这样做:

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

data = np.random.rand(200, 10)

fig, ax = plt.subplots()
fig.set_size_inches(38.5, 10.5)

ax2 = sns.heatmap(data, ax=ax)
for item in ax2.get_yticklabels():
    item.set_rotation(0)

这给了我相同的输出。我是否正确使用了它?

为标签留出更多空间的唯一方法是增加矩阵的高度。唯一的其他选择是减小字体大小,但我想这不是你想要的。 因此,您可以根据矩阵中的行数和标签的字体大小来计算理想的图形高度。保存生成的绘图时,将获得预期结果。调用
plt.show()
时看到的GUI窗口的高度似乎仅限于屏幕高度:

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

# create some random data
data = np.random.rand(150, 10)

# get the tick label font size
fontsize_pt = plt.rcParams['ytick.labelsize']
dpi = 72.27

# comput the matrix height in points and inches
matrix_height_pt = fontsize_pt * data.shape[0]
matrix_height_in = matrix_height_pt / dpi

# compute the required figure height 
top_margin = 0.04  # in percentage of the figure height
bottom_margin = 0.04 # in percentage of the figure height
figure_height = matrix_height_in / (1 - top_margin - bottom_margin)


# build the figure instance with the desired height
fig, ax = plt.subplots(
        figsize=(6,figure_height), 
        gridspec_kw=dict(top=1-top_margin, bottom=bottom_margin))

# let seaborn do it's thing
ax = sns.heatmap(data, ax=ax)

# save the figure
plt.savefig('/tmp/test.png')
结果:


是否可以只打印5个或10个标签中的1个?不,我想所有标签都要显示出来,这会让它变得很棘手。你可以将其切成两半,然后在右侧绘制一半,在另一侧绘制一半?但我如何知道哪个标签属于哪一行?在理想的情况下,我会有一个选项,上面写着:
cellheight=acreaseOfyTickLabel
如果你想让所有这些标签都可见,你显然需要更多的空间。你试过简单地增加身材高度吗?太棒了!正是我要找的!我现在投票,以后可能会接受,这取决于其他答案的质量。编辑:您可能还希望将旋转
yticklabels
的方式添加到代码中。很高兴我能提供帮助。在您的示例中,将旋转设置为0,这是默认值(因此设置它实际上没有任何作用)。测量旋转文本对象的文本高度要困难得多,因为这取决于字体系列等其他因素……那么我们可能会有不同版本的
seaborn
。我需要旋转=0来获得水平输出,看起来是这样的。我不经常使用它,所以我可能有一个过时的版本(0.7.dev)。。。顺便说一句:pyplot提供了一个方便的函数来设置多个美工师的属性,您可以使用它来使旋转设置更加紧凑:
plt.setp(ax.get_-yticklabels(),'rotation',0)
哦,很高兴知道,谢谢!不幸的是,我只能投票一次;)