是否有一些轴标签可以覆盖matplotlib图中的多列?

问题描述 投票:0回答:1

我正在使用matplotlib用plt.imshow创建一个热图。

Y轴表示时间,可以直接使用。X轴代表功能,是我要修改的轴。

[某些功能是标签和列的1:1映射,即:标签length仅与一列关联

另一方面,某些功能是标签和列的1:n映射,即:标签colors与三列关联,每一列代表一种颜色。

我想实现的是让所有1:n标签都跨越它们所关联的列,如下所示:

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

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

这可能吗?

提前寻求帮助:-)

python matplotlib axis-labels
1个回答
0
投票

以下方法使用放大的小刻度线进行分隔,并使用大刻度线放置刻度标签:

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.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')
© www.soinside.com 2019 - 2024. All rights reserved.