matplotlib: как удалить вертикальную линию из графика cdf для значений даты и времени - PullRequest
0 голосов
/ 05 июня 2018

Следующий код рисует файл 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 of datetime values

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

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

дает

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

1 Ответ

0 голосов
/ 06 июня 2018

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

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 with offending points removed

...