2

各位,

考虑以下示例

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

fig, (ax1,ax2) = plt.subplots(2,1)
dates = pd.date_range("2018-01-01","2019-01-01",freq = "1d")
x = pd.DataFrame(index = dates, data = np.linspace(0,1,len(dates)) )
x.plot(ax=ax1)
y = np.random.random([len(dates),100]) * x.values 
ax2.pcolormesh(range(len(x)), np.linspace(-1,1,100), y.T)
plt.show()

阴谋

此时,我希望两个轴 (ax1,ax2) 共享 x 轴,即在第二个轴上显示正确的 pandas 日期。sharex=True似乎不起作用。我怎样才能做到这一点?我尝试了不同的可能性,但没有成功。

编辑:由于 pandas 日期格式优于原生 matplotlib 格式,请为我提供使用 pandas 日期格式的解决方案(例如,在交互式环境中缩放使用 pandas 日期格式效果更好)。感谢您!

4

2 回答 2

3

一种方法是使用 matplotlib 进行所有绘图,这样使用不同的时间格式就没有问题:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

fig, (ax1,ax2) = plt.subplots(2,1, sharex='col')
dates = pd.date_range("2018-01-01","2019-01-01",freq = "1d")
x = pd.DataFrame(index = dates, data = np.linspace(0,1,len(dates)) )

#x.plot(ax=ax1)
ax1.plot(x.index, x.values)


y = np.random.random([len(dates),100]) * x.values
ax2.pcolormesh(x.index, np.linspace(-1,1,100), y.T)

fig.tight_layout()
plt.show()

这给出了以下情节:

上述代码的结果

于 2019-02-13T11:50:44.563 回答
1

似乎工作正常的是首先将同一条线绘制到应该承载图像的轴上,然后绘制图像,然后再次删除该线。它的作用是告诉 pandas 将其定位器和格式化程序应用于该轴;他们将在移除线路后留下。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

fig, (ax1,ax2) = plt.subplots(2,1, sharex=True)
dates = pd.date_range("2018-01-01","2019-01-01",freq = "1d")
x = pd.DataFrame(index = dates, data = np.linspace(0,1,len(dates)) )
x.plot(ax=ax1)
y = np.random.random([len(dates),100]) * x.values 

x.plot(ax=ax2, legend=False)
ax2.pcolormesh(dates, np.linspace(-1,1,100), y.T)
ax2.lines[0].remove()

plt.show()

在此处输入图像描述

请注意,在缩放或平移时,此解决方案可能会有一些警告。认为它更像是一种 hack,只要它有效就使用它,但一旦它不起作用就不要责怪任何人。

于 2019-02-13T16:02:53.037 回答