【问题标题】:seaborn heatmap annotation ValueError: Unknown format code 'g' for object of type 'numpy.str_'seaborn 热图注释 ValueError:“numpy.str_”类型的对象的未知格式代码“g”
【发布时间】:2021-09-01 14:18:50
【问题描述】:

我想画一个seaborn.heatmap 并只注释一些行/列。
所有单元格都有注释的示例:

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


n1 = 5
n2 = 10
M = np.random.random((n1, n2))   

fig, ax = plt.subplots()

sns.heatmap(ax = ax, data = M, annot = True)

plt.show()

these examples 之后(添加值注释 段),可以将带有每个单元格注释的数组作为annot 参数传递给seaborn.heatmap

annot : 布尔型或矩形数据集,可选
如果为 True,则在每个单元格中写入数据值。如果一个与数据形状相同的类数组, 然后使用它来注释热图而不是数据。 请注意,DataFrame 将匹配位置,而不是索引。

如果我尝试生成str 的数组并将其作为annot 参数传递给seaborn.heatmap,则会收到以下错误:

Traceback (most recent call last):
  File "C:/.../myfile.py", line 16, in <module>
    sns.heatmap(ax = ax, data = M, annot = A)
  File "C:\venv\lib\site-packages\seaborn\_decorators.py", line 46, in inner_f
    return f(**kwargs)
  File "C:\venv\lib\site-packages\seaborn\matrix.py", line 558, in heatmap
    plotter.plot(ax, cbar_ax, kwargs)
  File "C:\venv\lib\site-packages\seaborn\matrix.py", line 353, in plot
    self._annotate_heatmap(ax, mesh)
  File "C:\venv\lib\site-packages\seaborn\matrix.py", line 262, in _annotate_heatmap
    annotation = ("{:" + self.fmt + "}").format(val)
ValueError: Unknown format code 'g' for object of type 'numpy.str_'

生成ValueError 的代码(在这种情况下,我尝试删除第 4th 列的注释作为示例):

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


n1 = 5
n2 = 10
M = np.random.random((n1, n2))

A = np.array([[f'{M[i, j]:.2f}' for j in range(n2)] for i in range(n1)])
A[:, 3] = ''


fig, ax = plt.subplots(figsize = (6, 3))

sns.heatmap(ax = ax, data = M, annot = A)

plt.show()

这个错误的原因是什么?
如何生成seaborn.heatmap 并仅注释选定的行/列?

【问题讨论】:

    标签: python numpy matplotlib seaborn heatmap


    【解决方案1】:

    这是格式问题。如果您使用的是 non-numeric 标签(默认为:fmt='.2g'),则此处需要 fmt = '',该标签仅考虑数值,而对于文本格式的标签会引发错误。

    import seaborn as sns
    import matplotlib.pyplot as plt
    import numpy as np
    
    
    n1 = 5
    n2 = 10
    M = np.random.random((n1, n2))
    
    A = np.array([[f'{M[i, j]:.2f}' for j in range(n2)] for i in range(n1)])
    A[:, 3] = ''
    
    
    fig, ax = plt.subplots(figsize = (6, 3))
    
    sns.heatmap(ax = ax, data = M, annot = A, fmt='')
    
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 2020-11-28
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多