在suptitle下方的subplot中添加列标题

6

有没有一种简单的方法可以在我的原始代码中添加另一个标题到我的子图的两个列中?例如,就像下面图片中粉色区域的某个地方。

有人建议我查看post以获取解决方案,但我想看看是否有一种不使用for循环的方法。

enter image description here

我的代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt


path = 'R:\\Temp\\xx\\'
path1 = 'R:\\Temp\\xx\\'

def Hue(im_file):
    im = cv2.imread(im_file)
    im = cv2.cvtColor(im, cv2.COLOR_BGR2HSV_FULL) # Get Hue value= range[0,360]
    im1 = im[776, 402]
    Hue = im1[0]
    return Hue

def Saturation(im_file):
    im = cv2.imread(im_file)
    im = cv2.cvtColor(im, cv2.COLOR_BGR2HSV_FULL) #return Saturation value = range[0,255]
    im1 = im[776, 402]
    Saturation = im1[1]
    return Saturation

def Value(im_file):
    im = cv2.imread(im_file)
    im = cv2.cvtColor(im, cv2.COLOR_BGR2HSV_FULL) #return Value(Brightness) value = range[0,255]
    im1 = im[776, 402]
    Value = im1[2]
    return Value   

def BlueComponent(im_file):
    im = cv2.imread(im_file) #return blue value
    im1 = im[776, 402]
    b = im1[0]
    return b

def GreenComponent(im_file):
    im = cv2.imread(im_file) #return green value 
    im1 = im[776, 402]
    g = im1[1]
    return g

def RedComponent(im_file): #return red value 
    im = cv2.imread(im_file)
    im1 = im[776, 402]
    r = im1[2]
    return r

myHueList = []
mySaturationList = []
myValueList = []
myBlueList = []
myGreenList = []
myRedList = []
myList = []
num_images = 99 # number of images

dotPos = 0
for i in range(1770, 1869): # loop to auto-generate image names and run prior function 
    image_name = path + 'Cropped_Aligned_IMG_' + str(i) + '.png' # for loop runs from image number 1770 to 1868
    myHueList.append(Hue(image_name))
    mySaturationList.append(Saturation(image_name))
    myValueList.append(Value(image_name))
    myBlueList.append(BlueComponent(image_name))
    myGreenList.append(GreenComponent(image_name))
    myRedList.append(RedComponent(image_name))
    myList.append(dotPos)
    dotPos = dotPos + 0.5


print(myBlueList)
print(myGreenList)
print(myRedList)
print(myHueList)
print(mySaturationList)
print(myValueList)
print(myList)



for k in range(1770,1869):
    a = 'Cropped_Aligned_IMG_' + str(k)
    image_name = path + a + '.png'
    img_file = cv2.imread(image_name)

x = myList
y = myBlueList
y1 = myGreenList
y2 = myRedList
y3 = myHueList
y4 = mySaturationList
y5 = myValueList


plt.axes([0.1, 0.1, 1, 1])
plt.suptitle('BGR & HSV Color Decimal Code Against Function of Time(Hours)', fontsize=14, fontweight='bold')
plt.subplot(3,2,1)
plt.plot(x, y, 'b.-')
plt.title('Blue Component Color Decimal Code')
plt.xlabel('Time(Hours)')
plt.ylabel('Colour Code')

plt.subplot(3,2,3)
plt.plot(x, y1, 'g.-')
plt.title('Green Component Color Decimal Code')
plt.xlabel('Time(Hours)')
plt.ylabel('Colour Code')

plt.subplot(3,2,5)
plt.plot(x, y2, 'r.-')
plt.title('Red Component Color Decimal Code')
plt.xlabel('Time(Hours)')
plt.ylabel('Colour Code')

plt.subplot(3,2,2)
plt.plot(x, y3, 'b.-')
plt.title('Hue Component HSV Color Decimal Code')
plt.xlabel('Time(Hours)')
plt.ylabel('Colour Code')

plt.subplot(3,2,4)
plt.plot(x, y4, 'g.-')
plt.title('Saturation Component HSV Color Decimal Code')
plt.xlabel('Time(Hours)')
plt.ylabel('Colour Code')

plt.subplot(3,2,6)
plt.plot(x, y5, 'r.-')
plt.title('Value Component HSV Color Decimal Code')
plt.xlabel('Time(Hours)')
plt.ylabel('Colour Code')
plt.subplots_adjust(hspace = 0.5)
plt.show()

使用循环的问题是什么?它只允许概括想法。如果您不想使用循环,请不要使用它,并根据需要执行其中的任何操作。这个问题 在这里可能更相关。 - ImportanceOfBeingErnest
2个回答

15

我可以想象在顶部创建一个空的子图行,每个子图都有自己的标题,就像列标题一样。

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["figure.figsize"] = 6,8
colors = plt.rcParams["axes.prop_cycle"].by_key()["color"]

x = np.linspace(-3,3)
y = np.random.randn(len(x),6)

fig, axes = plt.subplots(ncols=2, nrows=3+1, gridspec_kw={"height_ratios":[0.02,1,1,1]})
fig.suptitle('Some long super title for the complete figure', 
             fontsize=14, fontweight='bold')
for i, ax in enumerate(axes.flatten()[2:]):
    ax.plot(x,y[:,i], color=colors[i%6])
    ax.set_title("Title {}".format(i+1))

for i, ax in enumerate(axes.flatten()[:2]):
    ax.axis("off")
    ax.set_title("Columntitle {}".format(i+1), fontweight='bold')

fig.subplots_adjust(hspace=0.5, bottom=0.1)
plt.show()

输入图片描述

请注意,我在这里使用循环以简化操作。当然,如果出于任何原因需要,您可以为每个子图单独键入命令。


0

对于遇到此问题的其他人,我们可以简单地使用 plt.figtext() 在需要的位置直接添加文本。

在这种情况下,代码应该类似于:

plt.figtext(0.33, 0.8, 'BGR')
plt.figtext(0.67, 0.8, 'HSV')

我猜测y值为0.8,因此我们需要尝试使用x、y坐标来调整位置。figtext()还可以使用字体字典来处理格式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接