我希望我的x轴具有类似这种格式的标签
0 1 2 3 4 5 Xlabel
但我尝试下面的代码,结果我得到2行
self.axes.set_xticks(np.arange(0,6,1))
self.axes.set_xlabel('Xlabel', fontsize=9,x=1,y=1)
=>我的结果:(
0 1 2 3 4 5
Xlabel
答案 0 :(得分:42)
设置xlabel时,x
参数以轴为单位分配位置,因此0是原点,1是图的右边缘。 y
会被忽略,因为它预计会成为默认值,就在刻度线下方。
要覆盖此行为,您可以使用Axis
set_label_coords
method以轴为单位设置位置。您也可以通过提供转换来使用其他单位。
以下是此示例:
import matplotlib.pyplot as plt
import numpy as np
ax = plt.gca()
ax.set_xticks(np.arange(0,6,1))
label = ax.set_xlabel('Xlabel', fontsize = 9)
ax.xaxis.set_label_coords(1.05, -0.025)
plt.savefig('labelAtEnd.png')
plt.show()
导致:
选择x值(1.05)将标签定位在Axes框架外。选择y值(-0.025)作为您想要的位置的最佳猜测。使用变换,可以自动将文本与Tick
标签对齐。
修改强>
这是使用变换的扩展示例。使用最后一个ticklabel的变换并不是更有帮助,因为它没有考虑文本的大小以及它是如何对齐的。因此,为了得到一些有用的效果,我必须1)对我的x标签使用相同的字体大小,2)将垂直对齐(va)定位到' top'和3)将水平对齐定位到'左&#39 ;.每个刻度的变换是针对x的数据单位(因为它是x轴)和针对y(0到1)的轴单位设置的,但是被x轴的固定填充(以像素为单位)置换。
import matplotlib.pyplot as plt
import numpy as np
ax = plt.gca()
ax.set_xticks(np.arange(0,6,1))
ax.set_yticks(np.arange(0,6,1))
label = ax.set_xlabel('xlabel', ha='left', va = 'top', )#fontsize = 9)
# need to draw the figure first to position the tick labels
fig = plt.gcf()
fig.draw(fig.canvas.get_renderer())
# get a tick and will position things next to the last one
ticklab = ax.xaxis.get_ticklabels()[0]
trans = ticklab.get_transform()
ax.xaxis.set_label_coords(5.1, 0, transform=trans)
plt.savefig('labelAtEnd2.png')
plt.show()
这导致:
答案 1 :(得分:18)
除了@Yann已经说过的内容之外,用annotate
执行此操作实际上更容易。当放大/平移时,它也将保持在正确的位置。
import matplotlib.pyplot as plt
import matplotlib as mpl
ticklabelpad = mpl.rcParams['xtick.major.pad']
fig, ax = plt.subplots()
ax.set_xlim([0, 5])
# Add the label as annotation. The "5" is the padding betweent the right side
# of the axis and the label...
ax.annotate('XLabel', xy=(1,0), xytext=(5, -ticklabelpad), ha='left', va='top',
xycoords='axes fraction', textcoords='offset points')
plt.show()
答案 2 :(得分:3)
这是我使用@JoeKington方法的变体。 我将最后一个刻度标签更改为轴名称。首先,我将最后一个刻度设置为空字符串,然后使用annotate()。我使用了annotate()因为我需要控制轴标签的字体大小。
import numpy as np
import matplotlib.pyplot as plt
plt.xlim(50, 70)
plt.ylim(100, 250)
ax = plt.gca()
# clears last tick label
xticks = ax.get_xticks().tolist()
xticks[-1] = ''
ax.set_xticklabels(xticks)
yticks = ax.get_yticks().tolist()
yticks[-1] = ''
ax.set_yticklabels(yticks)
# sets axes labels on both ends
ax.annotate('$t$', xy=(0.98, 0), ha='left', va='top', xycoords='axes fraction', fontsize=20)
ax.annotate('$x$', xy=(0, 1), xytext=(-15,2), ha='left', va='top', xycoords='axes fraction', textcoords='offset points', fontsize=20)
plt.show(block=True)
也许有人知道更优雅的方式来做这件事,因为这是非常复杂的操作。
答案 3 :(得分:0)
我使用@JoeKington提供的解决方案,扩展了对ax.annotate(...)
产生的文本施加标签字体属性的功能。
当轴标签的格式与其他文本的格式不同时,这很重要。
import matplotlib.pyplot as plt
import matplotlib as mpl
ticklabelpad = mpl.rcParams['xtick.major.pad']
fig, ax = plt.subplots()
ax.set_xlim([0, 5])
dx_in_points = 5
fontproperties = ax.xaxis.get_label().get_fontproperties()
ax.annotate('XLabel', xy=(1,0), xytext=(dx_in_points, -ticklabelpad), ha='left', va='top',
xycoords='axes fraction', textcoords='offset points', fontproperties=fontproperties)
plt.show()