【问题标题】:Howto force Pandas and native matplotlib to share axis如何强制 Pandas 和原生 matplotlib 共享轴
【发布时间】:2019-02-13 11:03:42
【问题描述】:

各位,

考虑以下示例

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 日期格式效果更好)。谢谢你!

【问题讨论】:

  • 你尝试了什么没有成功?
  • 关于编辑,除了带有这些单位的绘图之外,几乎不可能使用 pandas 定位器/格式化程序(使用其专用的单位系统)。

标签: python pandas matplotlib


【解决方案1】:

一种方法是使用 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()

这给出了以下情节:

【讨论】:

  • x.plot(ax=ax1, x_compat=True) 也可以达到同样的效果。
【解决方案2】:

似乎工作正常的是首先将同一条线绘制到应该承载图像的轴上,然后绘制图像,然后再次删除该线。它的作用是告诉 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,只要它有效就使用它,但一旦无效就不要责怪任何人。

【讨论】:

  • 想到的其他事情是用第二个 Axes 实例覆盖子图,就像在 this answer 的第一个示例中所做的那样。然后可以使一个轴的刺不可见,并在其中绘制 pcolormesh。然后可以按照您在此处执行的方式使用第二个轴来获取所需的 xtick 标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 2019-02-03
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多