Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 海生热图注释在单元格中的位置 SeaN热图中的注释默认位于每个单元的中间。 是否可以将注释移动到“左上角”。_Python_Matplotlib_Seaborn - Fatal编程技术网

Python 海生热图注释在单元格中的位置 SeaN热图中的注释默认位于每个单元的中间。 是否可以将注释移动到“左上角”。

Python 海生热图注释在单元格中的位置 SeaN热图中的注释默认位于每个单元的中间。 是否可以将注释移动到“左上角”。,python,matplotlib,seaborn,Python,Matplotlib,Seaborn,您可以使用seaborn的注释,并设置垂直(va)和水平(ha)对齐方式,如下所示(有时效果不好): 另一种手动放置标签的方法如下: import seaborn as sns import numpy as np import matplotlib.pylab as plt data = np.random.randint(100, size=(5,5)) ax = sns.heatmap(data) # put labels manually for y in range(data.s

您可以使用seaborn的
注释,并设置垂直(va)和水平(ha)对齐方式,如下所示(有时效果不好):

另一种手动放置标签的方法如下:

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

data = np.random.randint(100, size=(5,5))
ax = sns.heatmap(data)

# put labels manually
for y in range(data.shape[0]):
    for x in range(data.shape[1]):
        plt.text(x, y+1, '%d' % data[data.shape[0] - y - 1, x],
         ha='left',va='top', color='r')
plt.show()


要了解更多信息并理解matplotlib中的文本布局(为什么第一个示例不好?),请阅读此主题:

一个好主意可能是使用热图中的注释,这些注释由
annot=True
参数生成,然后将它们向上移动半个像素宽,向左移动半个像素宽。 为了使此移动位置成为文本本身的左上角,
ha
va
关键字参数需要设置为
annot\u kws
。 移位本身可以使用平移变换来完成

import seaborn as sns
import numpy as np; np.random.seed(0)
import matplotlib.pylab as plt
import matplotlib.transforms

data = np.random.randint(100, size=(5,5))
akws = {"ha": 'left',"va": 'top'}
ax = sns.heatmap(data,  annot=True, annot_kws=akws)

for t in ax.texts:
    trans = t.get_transform()
    offs = matplotlib.transforms.ScaledTranslation(-0.48, 0.48,
                    matplotlib.transforms.IdentityTransform())
    t.set_transform( offs + trans )

plt.show()

这种行为有点违反直觉,因为变换中的
+0.48
将标签向上移动(与轴的方向相反)。seaborn版本0.8似乎纠正了这种行为;对于seaborn 0.8或更高版本的绘图,请使用更直观的变换

offs = matplotlib.transforms.ScaledTranslation(-0.48, -0.48,
                    matplotlib.transforms.IdentityTransform())

热图注释放置在
xticks
yticks
x,y
位置。默认情况下,注释以记号位置为中心。通过设置
ha=left
va=top
annot_kws
中所做的一切就是设置相对于记号位置的文本位置,而不是相对于单元格的位置:注意注释现在位于记号标签的左侧,顶部现在与记号标签的中心对齐。非常右侧。我特别添加了最后一个链接来澄清这种行为。还要注意,第二种方法中的标签是不正确的:因为y位置从上到下,但是循环从下到上,标签是垂直翻转的。(看看(4,3)和(4,1)。两者中较轻的一个应该显示标签
1
,但它显示的是
27
是的,但是当你在循环中更改
x
y
时,你可以在任何需要的位置放置标签,而不带
ha
va
。我现在不是说
ha
va
。你的seco中的标签第二个数字与数据不符。我认为这是正确的答案……在接受它之前,我只需等待几个小时。同样,您对我的帮助非常完美。谢谢!为了获得显示的行为,我相信ScaledTranslation的前两个参数都应该是否定的。@NasaGeek问题要求“左上角”。要获得该值,您需要
~-0.5、+0.5)
。如果您同时使用负数(
~-0.5、-0.5)
),则注释将位于“左下角”,另外
为“va”:“bottom”
,这不是问题所要求的。@importantanceofbeingernest那么我只能假设matplotlib或seaborn发生了一些变化。在mpl 2.0.2和seaborn 0.8.0上,您的确切代码将注释向下和向左移动到相邻的单元格中。@NasaGeek在seaborn更新中一定有什么变化,在热图代码。我相应地更新了答案。谢谢你指出这一点!
offs = matplotlib.transforms.ScaledTranslation(-0.48, -0.48,
                    matplotlib.transforms.IdentityTransform())