[英]Matplotlib x-axis at the top, no x axis label, no major tick labels, but outer major and minor tick wanted
[英]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.