我正在尝试实现自定义比例(源自matplotlib.scale.ScaleBase
)和自定义转换(源自matplotlib.transforms.Transform
)以进行特殊的时间序列绘制,因此它仅用于x轴并且对于某种形式的日期时间数据,即numpy日期时间数组或pandas DateIndex
。
转换需要知道x值表示的实际时间,但不幸的是浮点数被传递到Transform.transform_non_affine
方法,并且它不知道时间单位是什么(秒?分钟?小时?天?)。
from matplotlib import scale as mscale
from matplotlib import transforms as mtransforms
import numpy as np
import pandas as pd
import datetime
class MyScale(mscale.ScaleBase):
name = 'myscale'
def __init__(self, axis, **kwargs):
super(MyScale, self).__init__()
def get_transform(self):
return MyTransform()
def set_default_locators_and_formatters(self, axis):
return
class MyTransform(mtransforms.Transform):
input_dims = 1
output_dims = 1
is_separable = True
has_inverse = True
def __init__(self):
super(MyTransform, self).__init__()
def transform_non_affine(self, a):
# ideally some time-dependent transforms here instead...
print a, a.dtype
return np.asanyarray(a)
def inverted(self):
raise NotImplementedError('not implemented')
然后,如果我这样做:
t = pd.date_range('20160420 07:42', '20160421 12:12', freq='30T')
ts = pd.Series(np.arange(t.size), index=t)
import matplotlib.pyplot as plt
plt.gca().set_xscale('myscale')
ts.plot()
我看到以下打印件:
[ 24352302. 24354012.] float64
[ 24352302.] float64
[ 24353280.] float64
[ 24354012.] float64
[ 24352380.] float64
[ 24352560.] float64
[ 24352740.] float64
[ 24352920.] float64
[ 24353100.] float64
[ 24353280.] float64
[ 24353460.] float64
[ 24353640.] float64
[ 24353820.] float64
[ 24354000.] float64
[ 24352302. 24352302.] float64
[ 24352302. 24352302.] float64
[ 24352302.] float64
[ 24352302.] float64
[ 24352302.] float64
[ 24352302.] float64
[ 24353280. 24353280.] float64
[ 24353280. 24353280.] float64
[ 24353280.] float64
[ 24353280.] float64
[ 24353280.] float64
[ 24353280.] float64
[ 24353280.] float64
[ 24354012. 24354012.] float64
[ 24354012. 24354012.] float64
...
[ 13. 13.] float64
[ 0.] float64
[ 0.] float64
[ 0.] float64
[ 0.] float64
[ 0.] float64
[ 0.] float64
[ 0.] float64
[ 0. 1.] float64
[ 0. 1.] float64
...
[ 24352302. 24352332. 24352362. 24352392. 24352422. 24352452.
24352482. 24352512. 24352542. 24352572. 24352602. 24352632.
24352662. 24352692. 24352722. 24352752. 24352782. 24352812.
24352842. 24352872. 24352902. 24352932. 24352962. 24352992.
24353022. 24353052. 24353082. 24353112. 24353142. 24353172.
24353202. 24353232. 24353262. 24353292. 24353322. 24353352.
24353382. 24353412. 24353442. 24353472. 24353502. 24353532.
24353562. 24353592. 24353622. 24353652. 24353682. 24353712.
24353742. 24353772. 24353802. 24353832. 24353862. 24353892.
24353922. 24353952. 24353982. 24354012.] float64
...
那个long数组是实际的日期时间数组,看起来像是以分钟为单位转换为float:
.>>> np.datetime64(24352302, 'm')
numpy.datetime64('2016-04-20T02:42-0500')
任何想法如何解决这个问题?