Изменение меток по оси Y для минимизации беспорядка, но НЕ показа точек данных, кроме того, что наблюдалось в наборе данных - PullRequest
0 голосов
/ 14 апреля 2020

Так что это просто пример кода, который будет генерировать пример визуализации:


# Importing necessary libraries 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime
from dateutil.parser import parse

%matplotlib inline

# Below, I just convert date strings into an actual date object.

date_strings = ['2020-01-20 03:32:44',
'2020-03-26 05:13:07',
'2020-03-26 13:32:09',
'2020-03-26 23:57:49',
'2020-03-27 15:30:00',
'2020-03-28 00:04:32',
'2020-03-28 13:26:15',
'2020-03-29 00:11:22',
'2020-04-02 00:30:00',
'2020-04-06 14:00:00']

dates = []

for date in date_strings:
    dt = parse(date)
    print(dt.date())
    dates.append(dt.date())

# finally making the graph:

x1 = np.array([x for x in range(10)])
x = dates
y = [x+60 for x in range(10)]

plt.xticks(ticks=dates,labels=dates,rotation='30')
plt.plot(x,y)
plt.scatter(x,y)

plt.show()

Что я получаю, это:

img

Теперь это хитрый, потому что большинство обычных способов исправить это включают в себя случайные точки даты в середине. Например, 15 февраля может внезапно появиться тиковый ярлык.

Однако Я не хочу включать тиковые ярлыки, где точка данных фактически не была записана .

По сути, для моих требований условия кажутся немного строгими:

  • На оси x не должно быть меток, показывающих, что они не встречаются в данных. (Я могу сделать это)
  • Первая и последняя даты должны всегда показываться. (Я также могу сделать это)
  • Любые даты между могут быть показаны без создания чрезмерного беспорядка на оси x, это должно быть показано (это та часть, где нет существующего решения кажется, мне помогает!)

1 Ответ

2 голосов
/ 14 апреля 2020

Вот моя попытка решения.

Отказ от ответственности, возможно, есть лучший способ сделать это, и я просто скомбинировал что-то, чтобы посмотреть, смогу ли я добиться некоторого снижения помех. Я не понимаю код полностью, но я добился результата.

Тем не менее, я использовал этот пост , чтобы найти решение, и оно могло бы послужить полезным ресурсом и лучшим объяснением того, что я придумал.

Код решения

import numpy as np
import matplotlib.pyplot as plt
from dateutil.parser import parse

date_strings = ['2020-01-20 03:32:44',
'2020-03-26 05:13:07',
'2020-03-26 13:32:09',
'2020-03-26 23:57:49',
'2020-03-27 15:30:00',
'2020-03-28 00:04:32',
'2020-03-28 13:26:15',
'2020-03-29 00:11:22',
'2020-04-02 00:30:00',
'2020-04-06 14:00:00']

dates = []

for date in date_strings:
    dt = parse(date)
    print(dt.date())
    dates.append(dt.date())

x1 = np.array([x for x in range(10)])
x = dates
y = [x+60 for x in range(10)]

plt.xticks(ticks=dates,labels=dates,rotation='90')

#solution starts
N = 10
plt.gca().margins(x=0)
plt.gcf().canvas.draw()
tl = plt.gca().get_xticklabels()
maxsize = max([t.get_window_extent().width for t in tl])
m = 0.01 # inch margin
s = maxsize/plt.gcf().dpi*N+2*m
margin = m/plt.gcf().get_size_inches()[0]

plt.gcf().subplots_adjust(left=margin, right=25.-margin)
plt.gcf().set_size_inches(s, plt.gcf().get_size_inches()[1])
plt.plot(x,y)
plt.scatter(x,y)

plt.show()

Результирующий график

Незаполненный график с пробелом между отметками по оси X

Примечания

plt.gcf().subplots_adjust(left=margin, right=25.-margin)

Изменение параметра right изменит интервал x-ticks. Однако эта текущая реализация имеет компромисс:

Точность и интервал VS Ширина изображения

Чем меньше число, тем меньше ширина занимает пространство изображения. Однако изображение теряет Точность и Интервал для представления точек графика.

Я обнаружил, что 25 - это хорошее число за счет дорогой ширины изображения. Я не уверен, что это будет проблемой, но подумал, что упомяну об этом.

m

Имеет небольшое влияние на ширину изображения, если изменить его в одиночку.

Чем меньше число, тем меньше ширина изображения.

plt.xticks(ticks=dates,labels=dates,rotation='90')

[R] otation влияет на интервал графика, аналогично вправо параметр.

Чем ближе число становится параллельным оси x, тем хуже точность и интервал, тем дешевле ширина изображения.

Чем ближе число становится параллельным оси y, тем лучше Точность и интервал, более дорогая ширина изображения.

Я понимаю, что в исходном коде было 30 для этого параметра вращение . Не уверен, что это важно для поддержки в решении, но я подумал, что упомяну об этом.

Надеюсь, это помогло.

...