python - 有没有办法在 python matplotlib 中设置特定子图的背景颜色?

标签 python matplotlib subplot

我想使用 subplot 制作一个多重图,这样一个或多个特定子图的背景颜色与其他子图不同,如下例所示:
example
请注意,我对设置子图外部补丁的背景颜色而不是图内部的背景颜色感兴趣(可以使用 facecolor='gray' 完成)。这是因为我想绘制密度图并且我想将其中的一些与其余的区分开来。
我发现了类似的问题 this例如,每行子图都有不同的背景颜色,但我无法修改代码以便可以将颜色应用于特定的子图(例如 (1,2)、(1,3)、(2, 1) 和 (2,2) 如上图所示)。
这是一个示例代码:

import numpy as np
import matplotlib.pyplot as plt

fig, subs = plt.subplots(3,3,figsize=(10,10))

images = []
for i in range(3):
    for j in range(3): 
        data = np.random.rand(20,20)
        images.append(subs[i, j].imshow(data))
        subs[i, j].label_outer()

plt.show()
任何帮助将不胜感激。

最佳答案

根据[这篇文章]你可以使用fig.patches.extend在图形上绘制一个矩形。用高zorder矩形将位于子图的顶部,低 zorder它可以落后。
现在,属于子地块周围的确切区域没有明确定义。
一种简单的方法是为每个子图提供相等的空间,但这对于共享轴和图形边缘附近的空白都不太适用。
示例代码使用不同数量的列和行来确保水平和垂直计算不会翻转。

import numpy as np
import matplotlib.pyplot as plt

fig, subs = plt.subplots(3, 4, figsize=(10, 8))
images = []
for i in range(3):
    for j in range(4):
        data = np.random.rand(20, 20)
        images.append(subs[i, j].imshow(data))
        subs[i, j].label_outer()

m, n = subs.shape
for _ in range(50):
    i = np.random.randint(m)
    j = np.random.randint(n)
    color = ['r', 'b', 'g'][np.random.randint(3)]
    fig.patches.extend([plt.Rectangle((j / n, (m - 1 - i) / m), 1 / n, 1 / m,
                                      fill=True, color=color, alpha=0.2, zorder=-1,
                                      transform=fig.transFigure, figure=fig)])
plt.show()
each subplot equal size
另一种方法是使用 subs[i, j].get_tightbbox(fig.canvas.get_renderer()) ,但该边界框仅包含属于子图的文本,仅此而已。
一种更复杂的方法计算相邻子图之间的差异,并使用它来扩大子图轴所占的面积:
m, n = subs.shape
bbox00 = subs[0, 0].get_window_extent()
bbox01 = subs[0, 1].get_window_extent()
bbox10 = subs[1, 0].get_window_extent()
pad_h = 0 if n == 1 else bbox01.x0 - bbox00.x0 - bbox00.width
pad_v = 0 if m == 1 else bbox00.y0 - bbox10.y0 - bbox10.height
for _ in range(20):
    i = np.random.randint(m)
    j = np.random.randint(n)
    color = ['r', 'b', 'g'][np.random.randint(3)]
    bbox = subs[i, j].get_window_extent()
    fig.patches.extend([plt.Rectangle((bbox.x0 - pad_h / 2, bbox.y0 - pad_v / 2),
                                      bbox.width + pad_h, bbox.height + pad_v,
                                      fill=True, color=color, alpha=0.2, zorder=-1,
                                      transform=None, figure=fig)])
add padding depending on distance between subplots
根据地块的布局,它仍然不完美。该方法可以进一步细化,例如对第一列和最低行进行特殊处理。如果重叠不是问题,边界框也可以通过 get_tightbbox() 的结果进行扩展。 ,使用较浅的颜色和 alpha=1 .
这是四个边都有刻度标签的图的样子:
ticks all around

关于python - 有没有办法在 python matplotlib 中设置特定子图的背景颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66823850/

相关文章:

python - 使用颜色编码节点绘制邻接矩阵

python - 使用袖扣设置多个带有移动平均线的子图并离线绘制

python - 使用 matplotlib 一个颜色条来指示多个子图的数据范围?

python - 用另一个列表中的值替换列表中的特定值

python - 垃圾邮件机器人使我的日志文件困惑 [Django]

Python cgi 性能

python - Matplotlib 奇子图

python - 限制外键 Django 的模型选择

python /matplotlib : create graph with changing background colors

python - 在python中导入/读取csv文件,然后绘图,给出x=y图?