繁体   English   中英

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

[英]How to plot text below xticks (using x-coords) in matplotlib when x-axis are dates?

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

期望的输出

我试过包括transform = ax.transAxes和来自ax.get_xticks()的实际 x 坐标, ax.get_xticks()不会改变任何东西。

使用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')

新图片

您可以使用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 截图

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM