Adding title to the column of subplot below suptitle

Question:

Is there a simple way to add in to my original code so that I can add another title to both column of my subplot? for example like somewhere in the pink region shown in the picture below.

Someone refer me to look at this post for solution but I am looking to see if there is a method without using the for loop

enter image description here

My code:

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()
Asked By: SacreD

||

Answers:

I could imagine creating an empty row of subplots at the top, with each of the subplots having its own title would act as a column title.

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()

enter image description here

Note that I’m using loops here in order to simplify things. Of course you can type in the commands for each subplots individually, if that is desireable for any reason.

For others coming across this problem, we can simply use plt.figtext() to directly add text where desired.

In this case, it would be something like:

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

I’m guessing on the y value (0.8), so we would need to experiment with the x,y coordinates for positioning. figtext() can also take a font dict to handle formatting.

Answered By: Tenbor
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.