Python 在x轴上有时间的Matplotlib绘图中,如何使长轴和短轴标签不重叠?
我试图从数据框列Python 在x轴上有时间的Matplotlib绘图中,如何使长轴和短轴标签不重叠?,python,matplotlib,Python,Matplotlib,我试图从数据框列pandas中绘制一个柱状图,'Time',该列每天都有大刻度线,每小时都有小刻度线,并且在不同的“偏移”处都有标签 到目前为止,我得到的是 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("
pandas
中绘制一个柱状图,'Time'
,该列每天都有大刻度线,每小时都有小刻度线,并且在不同的“偏移”处都有标签
到目前为止,我得到的是
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轴上绘制具有重叠标签的绘图:
我相信我可以通过每3小时使用
RRuleLocator
而不是HourLocator
来增加小时刻度线之间的间隔。但是,如何防止每天午夜的小时标签与当天日期的标签重叠?有没有办法垂直偏移这两组标签?这当然只是许多可能选项中的一个:我会将字体大小顺序的填充设置为主要标签
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()