Я изо всех сил пытаюсь найти оптимальные настройки для построения временных рядов, которые могут сильно отличаться по длине. Чтобы дать вам больше контекста, входные данные генерируются FIO, поэтому они поступают в микросекундах на оси «время» и всех других измерениях на оси «значение» (например, IOPS, пропускная способность, задержка завершения, задержка отправки и т. Д. .)
Проблема: тест, генерирующий данные, может выполняться в течение часа, или десяти минут, или десяти часов. Кроме того, точки данных IOPS намного меньше, чем задержка отправки (вы не можете измерить что-то в секунду чаще, чем раз в секунду, но задержка отправки обычно составляет 1-2 микросекунды).
Когда я не изменяю xticks
, шкала на оси X (время) обычно ничего не стоит (то есть она либо слишком разрежена, либо слишком плотна). Для каждого отдельного случая я могу найти «достаточно хорошее» значение для xticks
, но я не могу придумать, как это выяснить автоматически.
Вот некоторые из моих упражнений, извините, они немного вне контекста, но должны хотя бы проиллюстрировать направление, которое я пробовал.
def plot_one(self, args):
file_name, file, plot_histogram = args
logging.info('plotting: {}'.format(file_name))
if type(file) is bytes:
file = BytesIO(file)
df = pd.read_csv(file, header=None, usecols=(0, 1))
df.columns = ['offset', 'nsec']
df = df.groupby(['offset']).mean()
df['offset'] = df.index
if plot_histogram:
ax = df['nsec'].plot.hist(title=os.path.basename(file_name))
figure = ax.get_figure()
figure.savefig(file_name + '_hist.png', bbox_inches='tight')
max_offset = df['offset'].iloc[-1]
ratio = max(1, min(max_offset // 4000, 40))
height = 5
width = int(height * ratio)
xticks, step = None, None
if max_offset > 10000:
xticks = pd.Series(data=range(0, max_offset // 1000)) * 1000
step = 1000
else:
xticks = pd.Series(data=range(0, max_offset))
step = 1
ax = df.plot(
title=os.path.basename(file_name),
x='offset',
y='nsec',
grid=True,
figsize=(width, height),
xticks=xticks,
rot=90,
)
ax.set_xticklabels(xticks // step)
ax.set_xlim(0, df['offset'].iloc[-1])
figure = ax.get_figure()
figure.savefig(file_name + '.png', bbox_inches='tight')
logging.info('saving figure: {}.png'.format(file_name))