繁体   English   中英

在Matplotlib图中,x轴上有时间,如何使长轴和短轴标签不重叠?

[英]In a Matplotlib plot with time on the x-axis, how to make the major and minor axis labels not overlap?

我正在尝试从pandas DataFrame列'Time'绘制直方图,该列每天都有主要的刻度线,每小时有次要的刻度线,并且在两个“ offset”处都有标签。

到目前为止,我所拥有的是

import datetime
import random
import dateutil.parser
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

start = dateutil.parser.parse("1 January 2019")
end = dateutil.parser.parse("3 January 2019")

data = [start + (end - start) * random.random() for _ in range(1000)]

df = pd.DataFrame(data, columns=['Time'])

fig, ax = plt.subplots(1, 1)
ax.hist(df['Time'], bins=mdates.drange(start, end, datetime.timedelta(hours=1)))
ax.xaxis.set_major_locator(mdates.DayLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%y'))
ax.xaxis.set_minor_locator(mdates.HourLocator())
ax.xaxis.set_minor_formatter(mdates.DateFormatter('%H:%M'))
ax.xaxis.grid(True, which='minor')
ax.yaxis.grid(True)
ax.set_ylabel('Counts per hour')
fig.autofmt_xdate()
plt.tight_layout()
plt.show()

这将导致在x轴上具有重叠标签的图:

在此处输入图片说明

我相信我可以增加间距之间使用的小时刻度标记本身RRuleLocator为每3小时,比方说,而不是HourLocator 但是,如何防止每天午夜的小时标签与当天的日期标签重叠? 有没有办法垂直偏移这两套标签?

当然,这只是许多可能的选项之一:我会将fontsize的顺序的填充设置为主要的ticklabel。

ax.tick_params(axis="x", which="major", pad=12)

完整的代码:

import datetime
import random
import dateutil.parser
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

start = dateutil.parser.parse("1 January 2019")
end = dateutil.parser.parse("3 January 2019")

data = [start + (end - start) * random.random() for _ in range(1000)]

df = pd.DataFrame(data, columns=['Time'])

fig, ax = plt.subplots(1, 1)
ax.hist(df['Time'], bins=mdates.drange(start, end, datetime.timedelta(hours=1)))
ax.xaxis.set_major_locator(mdates.DayLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%y'))
ax.xaxis.set_minor_locator(mdates.HourLocator((0,6,12,18,)))
ax.xaxis.set_minor_formatter(mdates.DateFormatter('%H:%M'))
ax.xaxis.grid(True, which='minor')
ax.yaxis.grid(True)
ax.set_ylabel('Counts per hour')

ax.tick_params(axis="x", which="major", pad=12)

plt.tight_layout()
plt.show()

在此处输入图片说明

暂无
暂无

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

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