当x轴是日期时,如何在matplotlib中的xticks(使用x坐标)下方绘制文本?

p-r*_*bot 5 python datetime text matplotlib

我试图在 matplotlib 图中的 x 刻度线下方绘制任意文本(请参见下面的示例图)。我使用日期作为 x 轴,例如,我想显示与每个日期关联的某些变量的计数。

在下面的示例中,我使用图中 0-1 的相对位置作为文本应放置的 x 坐标。然而,我只是猜测了这些相对值(使用反复试验),所以我想知道如何使用 x 数据的实际位置而不是使用这些 0-1 相对缩放来绘制 x 刻度下方的文本这是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()
Run Code Online (Sandbox Code Playgroud)

期望的输出

我尝试过包含transform = ax.transAxes实际的 x 坐标,ax.get_xticks()但这不会改变任何内容。

sto*_*645 6

使用ax.text作为相对于轴位置的文本位置,而不是 Fig 位置:

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')
Run Code Online (Sandbox Code Playgroud)

新图片


Mar*_*ans 0

您可以使用该date2num函数进行转换,并使用 aDataFormatter来正确显示日期。最后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() 
Run Code Online (Sandbox Code Playgroud)

这将显示:

Matplotlib 截图