Как сделать так, чтобы на графике Matplotlib со временем на оси x не перекрывались метки большой и малой осей? - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь построить гистограмму из столбца pandas DataFrame, '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:

enter image description here

Полагаю, я мог бы увеличить расстояние между самими часовыми отметками, используя RRuleLocator каждые 3 часа, скажем, вместо HourLocator. Но как я могу предотвратить совмещение метки часа в полночь каждый день с меткой даты дня? Есть ли способ сместить эти два набора меток по вертикали?

1 Ответ

0 голосов
/ 21 января 2019

Это, конечно, только один из многих возможных вариантов: я бы установил отступ порядка размера шрифта для основных меток.

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...