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

时间:2016-03-10 20:53:05

标签: python text matplotlib

我试图在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()

desired output

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

2 个答案:

答案 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')

newimage

答案 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() 

这会显示:

Matplotlib screenshot