Python Numpy Matplotlib设置Y-Label内联

时间:2015-08-16 20:32:01

标签: python numpy matplotlib plot

我想知道如何在下面的图中将Y标签设置为彼此内联。目前它们未对齐,因为Y值的空间不相等。

enter image description here

3 个答案:

答案 0 :(得分:2)

在这种情况下,根本不使用ylabel可能更容易。而是使用annotate将文本放置在距离轴左侧不变的偏移处。

作为您的问题的一个例子:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=4, sharex=True)
yranges = [(-1000, 100), (-0.001, 0.002), (0, 5), (0, 20)]
labels = ['$P_{EUC}[mm]$', '$P_z[mm]$', '$P_Y[mm]$', '$P_X[mm]$']

for ax, yrange, label in zip(axes, yranges, labels):
    ax.set(ylim=yrange, ylabel=label)

plt.show()

enter image description here

要解决此问题,最简单的方法是使用annotate。诀窍是将文本放在y=0.5坐标中,然后从图的左边缘沿x方向 5个点。语法有点冗长,但相对容易阅读。关键在xycoordstextcoords kwargs控制xyxytext的解释方式:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=4, sharex=True)
yranges = [(-1000, 100), (-0.001, 0.002), (0, 5), (0, 20)]
labels = ['$P_{EUC}[mm]$', '$P_z[mm]$', '$P_Y[mm]$', '$P_X[mm]$']

for ax, yrange, label in zip(axes, yranges, labels):
    ax.set(ylim=yrange)
    ax.annotate(label, xy=(0, 0.5), xytext=(5, 0), rotation=90,
                xycoords=('figure fraction', 'axes fraction'),
                textcoords='offset points', va='center', ha='left')

plt.show()

enter image description here

答案 1 :(得分:2)

您可以使用ax.yaxis.set_label_coords更优雅地使用x坐标的常量值,如here所示。以你的例子:

import matplotlib.pyplot as plt

labels = ['$P_{EUC}[mm]$', '$P_z[mm]$', '$P_Y[mm]$', '$P_X[mm]$']

fig,axs=plt.subplots(4,1,sharex=True)

axs[0].set_ylim(-1000,0)
axs[1].set_ylim(-0.0010,0.0020)
axs[2].set_ylim(0,5)
axs[3].set_ylim(0,20)

[axs[i].set_ylabel(labels[i]) for i in range(4)]

labelx = -0.1 # Change this to suit your needs
[axs[i].yaxis.set_label_coords(labelx,0.5) for i in range(4)]

fig.savefig('labelx.png')

enter image description here

答案 2 :(得分:0)

您可以使用AxesSubplots上的set_ylabel方法偏移x和y标签。 http://matplotlib.org/api/axes_api.html?highlight=y%20label#matplotlib.axes.Axes.set_ylabel

您还可以格式化y刻度标记。 http://matplotlib.org/api/axes_api.html?highlight=y%20label#matplotlib.axes.Axes.set_yticklabels

使用matplotlib文本对象时,如果要遍历子图,可以使用参数)来使用transform=ax.transAxes坐标而不是Figure坐标。

但我认为你所寻找的只是为了抵消它们。当文档稀疏时,使用Axes来浏览命名空间。

dir()

fig, ax = plt.subplots(1, 1) 包括dir(ax)

yaxis包括dir(ax.yaxis)

get_label包括dir(ax.yaxis.get_label())

set_x说:

help(ax.yaxis.get_label().set_x