如何根据颜色图绘制 imshow 图例?

How to plot imshow legend based on colormap?

我正在尝试根据我的 imshow 图的颜色图绘制图例。

我可以通过使用 matplotlib.mpatches 和 matplotlib.colors 指定我想要的颜色和标签来做到这一点,正如我在一些示例中看到的那样,但我只想遵循 cmap 中的颜色。例如:

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

# Data
df = pd.DataFrame({"a":[0.1, 0.3, 0.4, 0.2, 0.5, 0.6],
                   "z":[5, 10, 15, 20, 25, 30],
                   "class":[1, 2, 3, 1, 3, 3]})

# 'Class' 2D cluster 
cluster = np.repeat(np.expand_dims(df["class"].values, 1), 10, 1)

f, ax = plt.subplots(nrows=1, ncols=2, figsize=(12,10))
ax[0].plot(df["a"], df["z"])
ax[1].imshow(cluster, interpolation='none', cmap="Paired",
             aspect='auto', vmin=1, vmax=3, extent=[0, 1, df["z"].min(), df["z"].max()])

ax[0].set_ylim(df["z"].min(), df["z"].max())

ax[1].legend()

在这里,我想根据我的 imshow 图中的“配对”cmap 绘制图例,使用这段代码,我只得到“没有找到要放入图例的标签的句柄”。谁能帮帮我?

我需要这样的东西:

您需要创建自定义图例,使用与 ax.imshow() 中相同的 cmap 和范数(vmin 和 vmax)。对于每个唯一的“class”,使用虚拟矩形创建句柄。

这是一个例子:

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

# Data
df = pd.DataFrame({"a": [0.1, 0.3, 0.4, 0.2, 0.5, 0.6],
                   "z": [5, 10, 15, 20, 25, 30],
                   "class": [1, 2, 3, 1, 3, 3]})

cluster = df["class"].values.reshape(-1, 1)

f, ax = plt.subplots(nrows=1, ncols=2, figsize=(12, 10))
ax[0].plot(df["a"], df["z"])
norm = plt.Normalize(vmin=df["class"].min(), vmax=df["class"].max())
cmap = plt.get_cmap('Paired')
ax[1].imshow(cluster, interpolation='none', cmap=cmap, norm=norm,
             aspect='auto', extent=[0, 1, df["z"].min(), df["z"].max()])

ax[0].set_ylim(df["z"].min(), df["z"].max())

handles = [plt.Rectangle((0, 0), 0, 0, color=cmap(norm(i)), label=i) for i in df["class"].unique()]
ax[1].legend(handles=handles, title='class')
plt.tight_layout()
plt.show()