我想在海运中创建一个热图,并有一个很好的方式来查看标签.

有了ax.figure.tight_layout(),我就能得到

enter image description here

这显然很糟糕.

如果没有ax.figure.tight_layout(),标签就会被裁剪.

enter image description here

代码是

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sn

n_classes = 10
confusion = np.random.randint(low=0, high=100, size=(n_classes, n_classes))

label_length = 20

label_ind_by_names = {
    "A"*label_length: 0,
    "B"*label_length: 1,
    "C"*label_length: 2,
    "D"*label_length: 3,
    "E"*label_length: 4,
    "F"*label_length: 5,
    "G"*label_length: 6,
    "H"*label_length: 7,
    "I"*label_length: 8,
    "J"*label_length: 9,
}

# confusion matrix
df_cm = pd.DataFrame(
    confusion,
    index=label_ind_by_names.keys(),
    columns=label_ind_by_names.keys()
)
plt.figure()
sn.set(font_scale=1.2)
ax = sn.heatmap(df_cm, annot=True, annot_kws={"size": 16}, fmt='d')
# ax.figure.tight_layout()


plt.show()

我想在label_ind_by_names的基础上创建一个额外的图例,然后在热图上发布一个缩写,并能够在图例中查找缩写.

在海运中如何做到这一点?

推荐答案

您可以定义自己的legend handler,例如,对于整数:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sn

n_classes = 10
confusion = np.random.randint(low=0, high=100, size=(n_classes, n_classes))

label_length = 20

label_ind_by_names = {
    "A"*label_length: 0,
    "B"*label_length: 1,
    "C"*label_length: 2,
    "D"*label_length: 3,
    "E"*label_length: 4,
    "F"*label_length: 5,
    "G"*label_length: 6,
    "H"*label_length: 7,
    "I"*label_length: 8,
    "J"*label_length: 9,
}

# confusion matrix
df_cm = pd.DataFrame(
    confusion,
    index=label_ind_by_names.values(),
    columns=label_ind_by_names.values()
)

fig, ax = plt.subplots(figsize=(10, 5))
fig.subplots_adjust(left=0.05, right=.65)

sn.set(font_scale=1.2)
sn.heatmap(df_cm, annot=True, annot_kws={"size": 16}, fmt='d', ax=ax)

class IntHandler:
    def legend_artist(self, legend, orig_handle, fontsize, handlebox):
        x0, y0 = handlebox.xdescent, handlebox.ydescent
        text = plt.matplotlib.text.Text(x0, y0, str(orig_handle))
        handlebox.add_artist(text)
        return text

ax.legend(label_ind_by_names.values(),
                 label_ind_by_names.keys(),
                 handler_map={int: IntHandler()},
                 loc='upper left',
                 bbox_to_anchor=(1.2, 1))

plt.show()

enter image description here

Python相关问答推荐

为什么判断pd.DataFrame的值与判断pd.Series的值存在差异(如果索引中有值)?

将每个关键字值对转换为pyspark中的Intramame列

在pandas DataFrame上运行apply()时如何访问DateTime索引?

查找3D数组中沿一个轴的相同值序列的长度(与行程长度编码相关)

日程优化问题不知道更好的方式来呈现解决方案- Python / Gekko

自动编码器和极坐标

如何使用函数正确索引收件箱?

如何计算部分聚合数据的统计数据

Python中两个矩阵的自定义Hadamard风格产物

在Python中为变量的缺失值创建虚拟值

无法使用equals_html从网址获取全文

Locust请求中的Python和参数

更改matplotlib彩色条的字体并勾选标签?

将DF中的名称与另一DF拆分并匹配并返回匹配的公司

如何计算两极打印机中 * 所有列 * 的出现次数?

TARete错误:类型对象任务没有属性模型'

根据另一列中的nan重置值后重新加权Pandas列

如何从数据库上传数据到html?

为什么Django管理页面和我的页面的其他CSS文件和图片都找不到?'

Flash只从html表单中获取一个值