matplotlib 是否将y轴标签与子图的中间对齐?

jobtbby3  于 2023-01-21  发布在  其他
关注(0)|答案(2)|浏览(241)

我正在使用Matplotlib,有大量的1D热图,每个热图都有自己的标签。但是,标签与图没有对齐,我无法自动工作。
这是一个MWE

import numpy as np
import matplotlib.pyplot as plt

data = np.random.rand(10, 1000)
dogs = ["woof", "bark", "bowwow"]
fig, axs = plt.subplots(10)
for i in range(10):
    axs[i].scatter(np.linspace(0, 1, 1000), np.linspace(0,1,1000)*0, 2000,
                     c=data[i, :], marker="|", cmap='inferno')
    axs[i].set_frame_on(False)
    axs[i].set_yticklabels([])
    axs[i].set_xticklabels([])
    axs[i].set_xticks([])
    axs[i].set_yticks([])
    axs[i].set_ylabel(dogs[i%3], rotation='horizontal')
plt.show()

我尝试了

axs[i].yaxis.set_label_coords(x, y)

对于x和y的各种值,似乎都不起作用。我更希望它自动对齐,文本的底部对应于单个图的底部。
附件是显示对齐问题的图像。
Example

oxcyiej7

oxcyiej71#

您可以通过seaborn创建热图,并使用yticklabels=[label_name]设置标签。将标签旋转到0度应该可以很好地对齐。注意,数据的形状应该是1xN

from matplotlib import pyplot as plt
import seaborn as sns
import numpy as np

labels = ['Alkaid', 'Mizar', 'Alioth', 'Megrez', 'Phecda', 'Merak', 'Dubhe']
nrows = len(labels)
fig, axs = plt.subplots(nrows=nrows, figsize=(10, 5))

for ax_i, data_i, label_i in zip(axs, np.random.randn(nrows, 1, 100).cumsum(axis=2), labels):
    sns.heatmap(data=data_i, xticklabels=[], yticklabels=[label_i], cmap='inferno', cbar=False, ax=ax_i)
    ax_i.tick_params(axis='y', rotation=0, labelsize=22, length=0) # length means length of the tick mark
plt.tight_layout()
plt.show()

cotxawn7

cotxawn72#

经过一番折腾,我发现

axs[0].set_ylabel("Pseudotime", fontsize=12, rotation='horizontal', ha='right', va='center')

足以对准Y标记。

相关问题