Возможно ли, чтобы некоторые метки оси покрывали несколько столбцов на графике matplotlib? - PullRequest
0 голосов
/ 20 апреля 2020

Я использую matplotlib для создания тепловой карты с plt.imshow.

Ось Y представляет время, и все в порядке, как есть. Ось X представляет элементы, которые я хотел бы изменить.

Некоторые функции представляют собой отображение метки и столбца в формате 1: 1, т. Е. Метка length связана только с одним столбцом

С другой стороны, некоторые функции представляют собой отображение метки и столбцов в формате 1: n, т. Е. Метка colors связана с тремя столбцами, каждый из которых представляет цвет.

Что бы я хотел хотелось бы, чтобы все метки 1: n охватывали столбцы, с которыми они связаны, например:

|-------|-------|-------|-------|-------|
|       |       |       |       |       |
|-------|-------|-------|-------|-------|
|       |       |       |       |       |
|-------|-------|-------|-------|-------|
|       |       |       |       |       |
|-------|-------|-------|-------|-------|

|_______|_______________________|_______|
    |               |               |   
 Length           Colors           Size 

Возможно ли это?

Заранее спасибо за помощь :-)

1 Ответ

2 голосов
/ 20 апреля 2020

В следующем подходе используются увеличенные второстепенные тики для разделения и основные тики для нанесения меток. Опционально, позиции минорных тиков могут также использоваться для рисования линий сетки в качестве дополнительного разделения.

from matplotlib import pyplot as plt
from matplotlib.ticker import FixedLocator
import numpy as np

plt.imshow(np.random.uniform(0, 1, (5, 5)), cmap='inferno')
plt.tick_params(axis='x', which='major', length=0)
plt.tick_params(axis='x', which='minor', length=15)
plt.xticks([0, 2, 4], ['Length', 'Colors', 'Size'])
plt.gca().xaxis.set_minor_locator(FixedLocator([-0.5, 0.5, 3.5, 4.5]))
# plt.grid(axis='x', which='minor', color='white', lw=2)
plt.show()

example plot

PS: позиции для младших и крупных тиков может быть рассчитан из массива ширины:

widths = np.array([1, 3, 1])
bounds = np.insert(widths, 0, 0).cumsum() - 0.5
ticks_pos = (bounds[:-1] + bounds[1:]) / 2 # np.convolve(bounds, [.5, .5], 'valid')
...