matplotlib: как удалить вертикальную линию из графика cdf для значений даты и времени

Следующий код рисует cdf для значений даты и времени:

import matplotlib.pyplot as plt
import matplotlib.dates as dates
import numpy as np; np.random.seed(42)
import pandas as pd

objDate = dates.num2date(np.random.normal(735700, 300, 700))

ser = pd.Series(objDate)
ax = ser.hist(cumulative=True, density=1, bins=500, histtype='step')

plt.show()

cdf значений даты и времени

Как я могу удалить вертикальную линию в самом правом конце графика? Подход, упомянутый здесь, не работает как замена строки № 9 на:

ax = ser.hist(cumulative=True, density=1, bins=sorted(objDate)+[np.inf], histtype='step')

дает

TypeError: невозможно сравнить datetime.datetime с float


person SaadH    schedule 05.06.2018    source источник


Ответы (1)


CDF на самом деле рисуется как многоугольник, который в matplotlib определяется путем. Путь, в свою очередь, определяется вершинами (куда идти) и кодами (как туда добраться). В документации сказано, что мы не должны напрямую изменять эти атрибуты, но мы можем создать новый многоугольник, производный от старого, который соответствует нашим потребностям.

poly = ax.findobj(plt.Polygon)[0]
vertices = poly.get_path().vertices

# Keep everything above y == 0. You can define this mask however
# you need, if you want to be more careful in your selection.
keep = vertices[:, 1] > 0

# Construct new polygon from these "good" vertices
new_poly = plt.Polygon(vertices[keep], closed=False, fill=False,
                       edgecolor=poly.get_edgecolor(),
                       linewidth=poly.get_linewidth())
poly.set_visible(False)
ax.add_artist(new_poly)
plt.draw()

Вы должны прийти к чему-то вроде рисунка ниже:

CDF с удаленными проблемными точками

person bnaecker    schedule 06.06.2018
comment
Чего-то не хватает в первой строке? Это дает мне: ValueError: ordinal must be >= 1 - person SaadH; 06.06.2018
comment
@SaadH У меня это отлично работает, если я скопирую и вставлю ваш код и свой. Возможно, это связано с этой проблемой matplotlib, которая была исправлена ​​в конце 2017 года. Какая у вас версия? Бег? - person bnaecker; 06.06.2018
comment
Была 2.1.1, обновился до 2.2.2. Добавил свой код, а затем переместил plt.show() в последнюю строку, и все заработало! - person SaadH; 08.06.2018