我试图在matplotlib图中的x刻度线下面绘制任意文本(参见下面的示例图)。我使用日期作为x轴,例如,我想显示与每个日期相关的某些变量的计数。
在下面的例子中,我使用图中0-1的相对位置作为文本所在位置的x坐标。然而,我只是猜测了这些相对值(使用试验和错误),所以我想知道如何使用x数据的实际位置而不是使用这些0-1来绘制x-ticks下方的文本。相对缩放是figtext中的默认值?
import numpy as np
import matplotlib.pyplot as plt
import datetime
x = [datetime.datetime(2010, 12, 1, 0, 0),
datetime.datetime(2011, 1, 1, 0, 0),
datetime.datetime(2011, 5, 1, 1, 0)]
y = [4, 9, 2]
fig, ax = plt.subplots()
ax.bar(x, y, width = 20)
xticks = ax.get_xticks()
xtick_rel_position = np.linspace(0.13, 0.81, len(xticks)) # <- these are just guessed
counts = np.random.randint(0, 25, len(xticks))
for i, xpos in enumerate(xtick_rel_position):
plt.figtext(xpos, 0.028, "Below tick\nlabel "+str(i),
size = 6, ha = 'center')
plt.figtext(xpos, 0.005, "Count: "+str(counts[i]),
size = 6, ha = 'center')
# For better aesthetics
ax.yaxis.set_visible(False)
plt.show()
我尝试将transform = ax.transAxes
包含ax.get_xticks()
的实际x坐标,但这并没有改变任何内容。
答案 0 :(得分:2)
将 ax.text 用于相对于轴位置而非图位置的文字位置:
import matplotlib.pyplot as plt
import datetime
import numpy as np
x = [datetime.datetime(2010, 12, 1, 0, 0),
datetime.datetime(2011, 1, 1, 0, 0),
datetime.datetime(2011, 5, 1, 1, 0)]
y = [4, 9, 2]
fig, ax = plt.subplots()
ax.bar(x, y, width = 20, align='center')
counts = np.random.randint(0, 25, len(ax.get_xticks()))
for i, xpos in enumerate(ax.get_xticks()):
ax.text(xpos,-1, "Below tick\nlabel "+str(i),
size = 6, ha = 'center')
ax.text(xpos, -1.25, "Count: "+str(counts[i]),
size = 6, ha = 'center')
答案 1 :(得分:0)
您可以使用date2num
功能进行转换,并使用DataFormatter
正确显示日期。最后get_xticks
用于获取文本的刻度位置,以准确显示在下面:
import numpy as np
import matplotlib.pyplot as plt
import datetime
import matplotlib
x = [datetime.datetime(2010, 12, 1, 0, 0),
datetime.datetime(2011, 1, 1, 0, 0),
datetime.datetime(2011, 5, 1, 1, 0)]
y = [4, 9, 2]
hfmt = matplotlib.dates.DateFormatter('%b %Y')
months = matplotlib.dates.MonthLocator(range(1, 13), bymonthday=1, interval=1)
xs = matplotlib.dates.date2num(x)
fig, ax = plt.subplots()
ax.bar(xs, y, width=20)
ax.xaxis.set_major_locator(months)
ax.xaxis.set_major_formatter(hfmt)
ax.yaxis.set_visible(False)
for i, x in enumerate(ax.get_xticks()):
plt.text(x, -1.3, "Below tick\nlabel {}\nCount x".format(i), size=7, ha='center')
fig.subplots_adjust(bottom=0.15) # Add space at bottom
plt.show()
这会显示: