Проблема в том, что разделитель, созданный с помощью make_axes_locatable
, гарантирует, что новые оси точно такие же, как и те, из которых он вырезан. Это главная цель этой функции; но здесь это как-то ортогонально желанию иметь другой размер.
Решение состоит в том, чтобы не использовать этот тип делителя и создать цветную полосу обычным способом с помощью plt.colorbar
или fig.colorbar
. Это позволяет использовать аргументы shrink
и aspect
. Поскольку с каждой стороны данных имеется 5% -ый запас, вы можете уменьшить цветовую полосу до 90%.
plt.colorbar(sm, orientation='horizontal', pad=-0.2, shrink=0.9, aspect=30,
ticks=[-1, 0, 1, 2, 3, 4, 5])
Полный код:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from matplotlib.colors import BoundaryNorm, ListedColormap
from matplotlib.cm import ScalarMappable
x = np.arange(1, 1142)
y = np.zeros(len(x))
z = np.random.randint(-1, 5, size=x.shape)
cmap = ListedColormap(['#FF0000', '#D52B00', '#AA5500', '#808000', '#55AA00', '#2BD500', '#00FF00'])
norm = BoundaryNorm([-1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5], cmap.N)
points = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)
lc = LineCollection(segments, cmap=cmap, norm=norm)
lc.set_array(z)
lc.set_linewidth(10)
plt.gca().add_collection(lc)
plt.xlim(x.min() - (x.max() * 0.05), x.max() + (x.max() * 0.05))
plt.ylim(-1.1, 1.1)
plt.tick_params(axis='both', which='both', bottom=False, labelbottom=False,
left=False, labelleft=False)
sm = ScalarMappable(norm=norm, cmap=cmap)
sm.set_array([])
plt.colorbar(sm, orientation='horizontal', pad=-0.2, shrink=0.9, aspect=30,
ticks=[-1, 0, 1, 2, 3, 4, 5])
plt.show()
