【问题标题】:Change background color of imshow subplots in loop [duplicate]在循环中更改 imshow 子图的背景颜色 [重复]
【发布时间】:2021-09-03 03:36:24
【问题描述】:

我正在按以下方式循环绘制图像:

plt.figure(figsize=(20, 35))
for i in range(len(batchX)): # 32 images
   plt.subplot(8, 4, 1 + i)
   plt.title("IMG{} - Pred: {},  GT: {}".format(i+1, classes[int(pred[i][0])], classes[int(batchy[i])]))
   plt.imshow(batchX[i])
plt.tight_layout()
plt.show()

我想根据特定条件更改每个图的背景颜色(您可能已经猜到,当预测等于或不等于基本事实时)。

我尝试在 imshow() 之前的循环中添加它:

if classes[int(pred[i][0])] == classes[int(batchy[i])]:
   plt.gcf().set_facecolor("green")
else:
   plt.gcf().set_facecolor("red")

但是,只有最后一次 plt.gcf() 调用将被考虑在内,因为当 plt.show() 运行时,它将查看颜色设置,使所有背景变为绿色或红色。

我还能通过什么其他方式实现这一目标?

【问题讨论】:

  • 我正在尝试获取包含所有图的单个图像。

标签: python matplotlib plot data-visualization


【解决方案1】:

您可以使用subplots() 并遍历轴,最终以正确的背景颜色显示所有图。

fig, axs = plt.subplots(8,4, figsize=(20, 35))
# Flattens the Axes grid to more easily iterate
axs = axs.flatten()
# You must make sure that len(axes) >= len(batchX) (and batchy)
for i, X in enumerate(batchX):
    ax = axs[i]
    ax.set_title("IMG{} - Pred: {},  GT: {}".format(i+1, classes[int(pred[i][0])],\
        classes[int(batchy[i])]))
    if classes[int(pred[i][0])] == classes[int(batchy[i])]:
        ax.set_facecolor("green")
    else:
        ax.set_facecolor("red")
    ax.imshow(X)

plt.tight_layout()
plt.show()

【讨论】:

  • 背景保持白色。扁平化轴网格的巧妙技巧。
  • 在尝试更改背景颜色之前,您的图像是否有任何透明度?
  • 没有透明度。我可能还不够清楚,我说的是图像之外的情节背景,而不是图像的背景。
  • 确实,除非您执行某种动画(或多次显示),否则您无法更改图形的颜色并显示它。您可以在绘图 B 中绘制绘图 A,其中 A 的斧头具有面色,或者您可以在图像周围的绘图中添加填充。该图形将保持白色(或统一),但您将有彩色边框。
  • 感谢您的帮助。填充我使用img_bordered = cv2.copyMakeBorder(X, border, border, border, border, cv2.BORDER_CONSTANT, value=[0, 255, 0])的图像。
猜你喜欢
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多