matplotlib:为日期时间值的 cdf 定制的 x 轴刻度
matplotlib: customised x-axis ticks for cdf of datetime values
我有一个日期时间列表的 cdf。在 运行 以下代码之后,其中 objDate
是日期时间值列表(格式:%Y-%m-%d),我得到了在 x 轴上每两年显示一次刻度的 cdf值范围。我如何通过指定获得沿 x 轴刻度的自定义标签:
1.范围(最小年份和最大年份)
2. 时间间隔(假设相隔 6 个月,因此刻度标签就像 01/17、07/17、01/18、07/18,...)
import matplotlib.pyplot as plt
import pandas as pd
ser = pd.Series(objDate)
ser.hist(cumulative=True, density=1, bins=500, histtype='step')
plt.show()
关于第二个问题,您可以使用matplotlib.dates
定位器和格式化程序。这些在 hist
.
的情况下工作正常
import matplotlib.pyplot as plt
plt.rcParams['axes.axisbelow'] = True
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', linewidth=2)
ax.xaxis.set_major_locator(dates.MonthLocator([1,7]))
ax.xaxis.set_major_formatter(dates.DateFormatter("%m/%y"))
plt.setp(ax.get_xticklabels(), rotation=60)
plt.show()
对于第一个问题,这并不容易,因为matplotlib 总是假设要勾选完整的轴。一个解决方案是将正在使用的定位器子类化,并允许它采用限制性参数。
from datetime import datetime
import matplotlib.pyplot as plt
plt.rcParams['axes.axisbelow'] = True
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', linewidth=2)
class RestrictedLocator(dates.MonthLocator):
def __init__(self, dmin=None, dmax=None, **kw):
self.dmin = dmin
self.dmax = dmax
dates.MonthLocator.__init__(self, **kw)
def __call__(self):
try:
dmin, dmax = self.viewlim_to_dt()
except ValueError:
return []
self.dmin = self.dmin.replace(tzinfo=dmin.tzinfo)
self.dmax = self.dmax.replace(tzinfo=dmin.tzinfo)
dmin = np.max([dmin, self.dmin])
dmax = np.min([dmax, self.dmax])
return self.tick_values(dmin, dmax)
loc = RestrictedLocator(dmin=datetime(2015,1,1),
dmax = datetime(2017,12,31),
bymonth=[1,7])
ax.xaxis.set_major_locator(loc)
ax.xaxis.set_major_formatter(dates.DateFormatter("%m/%y"))
plt.setp(ax.get_xticklabels(), rotation=60)
plt.show()
我有一个日期时间列表的 cdf。在 运行 以下代码之后,其中 objDate
是日期时间值列表(格式:%Y-%m-%d),我得到了在 x 轴上每两年显示一次刻度的 cdf值范围。我如何通过指定获得沿 x 轴刻度的自定义标签:
1.范围(最小年份和最大年份)
2. 时间间隔(假设相隔 6 个月,因此刻度标签就像 01/17、07/17、01/18、07/18,...)
import matplotlib.pyplot as plt
import pandas as pd
ser = pd.Series(objDate)
ser.hist(cumulative=True, density=1, bins=500, histtype='step')
plt.show()
关于第二个问题,您可以使用matplotlib.dates
定位器和格式化程序。这些在 hist
.
import matplotlib.pyplot as plt
plt.rcParams['axes.axisbelow'] = True
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', linewidth=2)
ax.xaxis.set_major_locator(dates.MonthLocator([1,7]))
ax.xaxis.set_major_formatter(dates.DateFormatter("%m/%y"))
plt.setp(ax.get_xticklabels(), rotation=60)
plt.show()
对于第一个问题,这并不容易,因为matplotlib 总是假设要勾选完整的轴。一个解决方案是将正在使用的定位器子类化,并允许它采用限制性参数。
from datetime import datetime
import matplotlib.pyplot as plt
plt.rcParams['axes.axisbelow'] = True
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', linewidth=2)
class RestrictedLocator(dates.MonthLocator):
def __init__(self, dmin=None, dmax=None, **kw):
self.dmin = dmin
self.dmax = dmax
dates.MonthLocator.__init__(self, **kw)
def __call__(self):
try:
dmin, dmax = self.viewlim_to_dt()
except ValueError:
return []
self.dmin = self.dmin.replace(tzinfo=dmin.tzinfo)
self.dmax = self.dmax.replace(tzinfo=dmin.tzinfo)
dmin = np.max([dmin, self.dmin])
dmax = np.min([dmax, self.dmax])
return self.tick_values(dmin, dmax)
loc = RestrictedLocator(dmin=datetime(2015,1,1),
dmax = datetime(2017,12,31),
bymonth=[1,7])
ax.xaxis.set_major_locator(loc)
ax.xaxis.set_major_formatter(dates.DateFormatter("%m/%y"))
plt.setp(ax.get_xticklabels(), rotation=60)
plt.show()