使用热图调整子图
Adjust subplot with heatmaps
我有一个带有混淆矩阵的 Subplots
,它显示为 HeatMap
。
我想调整图表以使其更易读并执行以下操作:
1) 在列上方加一个大标题'Targets'
2) 加一个大Ylabel 'Predictions'
3) 每一列只有一个大图例,因为它们显示的是相同的东西
4 ) 为每列添加列名
['Train CM', 'Train Norm CM', 'Validation CM', 'Validation Norm CM']
和行名称 [f'Epoch {i}' for i in range(n_epoch)]
。我喜欢 here
但只适用于列而不适用于行,我不知道为什么。
我的代码:
cols = ['Train CM', 'Train Norm CM', 'Validation CM', 'Validation Norm CM']
rows = [f'Epoch {i}' for i in range(n_epoch)]
f, axes = plt.subplots(nrows = n_epoch, ncols = 4, figsize=(40, 30))
for ax, col in zip(axes [0], cols):
ax.set_title(col, size='large')
for ax, row in zip(axes[:,0], rows):
ax.set_ylabel(row, rotation=0, size='large')
f.tight_layout()
for e in range(n_epoch):
for c in range(4):
# take conf matrix from lists cm_Train or cm_Validation of ConfusionMatrix() objects
if c == 0:
cm = np.transpose(np.array([list(item.values()) for item in cm_Train[e].matrix.values()]))
elif c == 1:
cm = np.transpose(np.array([list(item.values()) for item in cm_Train[e].normalized_matrix.values()]))
elif c == 2:
cm = np.transpose(np.array([list(item.values()) for item in cm_Validation[e].matrix.values()]))
else:
cm = np.transpose(np.array([list(item.values()) for item in cm_Validation[e].normalized_matrix.values()]))
sns.heatmap(cm, annot=True, fmt='g', ax = axes[e, c], linewidths=.3)
我正在展示一个空图的解决方案,因为我没有你的数据。这是你想要的吗:
n_epoch = 4
cols = ['Train CM', 'Train Norm CM', 'Validation CM', 'Validation Norm CM']
rows = [f'Epoch {i}' for i in range(n_epoch)]
f, axes = plt.subplots(nrows = n_epoch, ncols = 4, figsize=(12, 8))
f.text(0, 0.5, 'Predictions', ha='center', va='center', fontsize=20, rotation='vertical')
plt.suptitle("One big title", fontsize=18, y=1.05)
for ax, col in zip(axes [0], cols):
ax.set_title(col, size='large')
for ax, row in zip(axes[:, 0], rows):
ax.set_ylabel(row, size='large')
plt.tight_layout()
放置颜色条:在这里,您放置跨越每列所有行的颜色条。但是,这里 tight_layout()
不兼容,因此您必须将其关闭。
f, axes = plt.subplots(nrows = n_epoch, ncols = 4, figsize=(12, 8))
for i, ax in enumerate(axes.flat):
im = ax.imshow(np.random.random((20,20)), vmin=0, vmax=1)
if i%4 == 0:
f.colorbar(im, ax=axes[:,int(i/4)].ravel().tolist(), aspect=30, pad=0.05)
f.text(0.08, 0.5, 'Predictions', ha='center', va='center', fontsize=20, rotation='vertical')
plt.suptitle("One big title", fontsize=18)
for ax, col in zip(axes [0], cols):
ax.set_title(col, size='large')
for ax, row in zip(axes[:, 0], rows):
ax.set_ylabel(row, size='large')
我有一个带有混淆矩阵的 Subplots
,它显示为 HeatMap
。
1) 在列上方加一个大标题'Targets'
2) 加一个大Ylabel 'Predictions'
3) 每一列只有一个大图例,因为它们显示的是相同的东西
4 ) 为每列添加列名
['Train CM', 'Train Norm CM', 'Validation CM', 'Validation Norm CM']
和行名称 [f'Epoch {i}' for i in range(n_epoch)]
。我喜欢 here
但只适用于列而不适用于行,我不知道为什么。
我的代码:
cols = ['Train CM', 'Train Norm CM', 'Validation CM', 'Validation Norm CM']
rows = [f'Epoch {i}' for i in range(n_epoch)]
f, axes = plt.subplots(nrows = n_epoch, ncols = 4, figsize=(40, 30))
for ax, col in zip(axes [0], cols):
ax.set_title(col, size='large')
for ax, row in zip(axes[:,0], rows):
ax.set_ylabel(row, rotation=0, size='large')
f.tight_layout()
for e in range(n_epoch):
for c in range(4):
# take conf matrix from lists cm_Train or cm_Validation of ConfusionMatrix() objects
if c == 0:
cm = np.transpose(np.array([list(item.values()) for item in cm_Train[e].matrix.values()]))
elif c == 1:
cm = np.transpose(np.array([list(item.values()) for item in cm_Train[e].normalized_matrix.values()]))
elif c == 2:
cm = np.transpose(np.array([list(item.values()) for item in cm_Validation[e].matrix.values()]))
else:
cm = np.transpose(np.array([list(item.values()) for item in cm_Validation[e].normalized_matrix.values()]))
sns.heatmap(cm, annot=True, fmt='g', ax = axes[e, c], linewidths=.3)
我正在展示一个空图的解决方案,因为我没有你的数据。这是你想要的吗:
n_epoch = 4
cols = ['Train CM', 'Train Norm CM', 'Validation CM', 'Validation Norm CM']
rows = [f'Epoch {i}' for i in range(n_epoch)]
f, axes = plt.subplots(nrows = n_epoch, ncols = 4, figsize=(12, 8))
f.text(0, 0.5, 'Predictions', ha='center', va='center', fontsize=20, rotation='vertical')
plt.suptitle("One big title", fontsize=18, y=1.05)
for ax, col in zip(axes [0], cols):
ax.set_title(col, size='large')
for ax, row in zip(axes[:, 0], rows):
ax.set_ylabel(row, size='large')
plt.tight_layout()
放置颜色条:在这里,您放置跨越每列所有行的颜色条。但是,这里 tight_layout()
不兼容,因此您必须将其关闭。
f, axes = plt.subplots(nrows = n_epoch, ncols = 4, figsize=(12, 8))
for i, ax in enumerate(axes.flat):
im = ax.imshow(np.random.random((20,20)), vmin=0, vmax=1)
if i%4 == 0:
f.colorbar(im, ax=axes[:,int(i/4)].ravel().tolist(), aspect=30, pad=0.05)
f.text(0.08, 0.5, 'Predictions', ha='center', va='center', fontsize=20, rotation='vertical')
plt.suptitle("One big title", fontsize=18)
for ax, col in zip(axes [0], cols):
ax.set_title(col, size='large')
for ax, row in zip(axes[:, 0], rows):
ax.set_ylabel(row, size='large')