Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在x轴上有时间的Matplotlib绘图中,如何使长轴和短轴标签不重叠?_Python_Matplotlib - Fatal编程技术网

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