当绘制共享x轴的子图时,x-ticks消失

时间:2017-10-19 06:59:27

标签: python pandas matplotlib

当我尝试在同一个子图上绘制一条线和一个区域时会发生这种情况。在我调用ay = ax.twinx()并在ay上绘图后,我发现我的x-ticks消失了。

这是导致此错误的代码。

fig, axes = plt.subplots(nrows=2, ncols=1, figsize=[12,12])
data=pd.DataFrame([[1,2,3],[2,3,4],[3,2,4]])
ix = np.unravel_index(0, axes.shape)
ax=axes[ix]
y=pd.DataFrame(data.iloc[:,0]-data.iloc[:,1])
ax2=ax.twinx()
data.plot(ax=ax,color=['navy','red'])
ax2.plot(y.values, linewidth=2.0)

x-ticks-disappear

正如您所看到的,x-ticks消失了。 但是,如果继续绘图,则可以发现最后一个子图不受影响。

fig, axes = plt.subplots(nrows=2, ncols=1, figsize=[12,12])
data=pd.DataFrame([[1,2,3],[2,3,4],[3,2,4]])
ix = np.unravel_index(0, axes.shape)
ax=axes[ix]
y=pd.DataFrame(data.iloc[:,0]-data.iloc[:,1])
ax2=ax.twinx()
data.plot(ax=ax,color=['navy','red'])
ax2.plot(y.values, linewidth=2.0)
ix = np.unravel_index(1, axes.shape)
ax=axes[ix]
y=pd.DataFrame(data.iloc[:,0]-data.iloc[:,1])
ax2=ax.twinx()
data.plot(ax=ax,color=['navy','red'])
ax2.plot(y.values, linewidth=2.0)

enter image description here

1 个答案:

答案 0 :(得分:2)

有两种选择。一个是基于这个问题的答案:matplotlib - pandas - No xlabel and xticks for twinx axes in subploted figures 这是为了扭转绘图的顺序。首先绘制两个子图,然后为两个子图创建双轴。

import matplotlib.pyplot as plt
import pandas as pd

fig, axes = plt.subplots(nrows=2, ncols=1)
data=pd.DataFrame([[1,2,3],[2,3,4],[3,2,4]])

ax=axes[0]
y=pd.DataFrame(data.iloc[:,0]-data.iloc[:,1])
data.plot(ax=ax)

ax3=axes[1]
y=pd.DataFrame(data.iloc[:,0]-data.iloc[:,1])
data.plot(ax=ax3)

ax2=ax.twinx()
ax2.plot(y.values)
ax4=ax3.twinx()
ax4.plot(y.values)

plt.show()

enter image description here

现在有时上面可能不是一个选项,所以第二种可能的解决方案是在生成完整的绘图后再次设置滴答。

[t.set_visible(True) for t in ax.get_xticklabels()]

完整示例:

import matplotlib.pyplot as plt
import pandas as pd


fig, axes = plt.subplots(nrows=2, ncols=1)
data=pd.DataFrame([[1,2,3],[2,3,4],[3,2,4]])

ax=axes[0]
y=pd.DataFrame(data.iloc[:,0]-data.iloc[:,1])
ax2=ax.twinx()
data.plot(ax=ax)
ax2.plot(y.values)

ax3=axes[1]
y=pd.DataFrame(data.iloc[:,0]-data.iloc[:,1])
ax4=ax3.twinx()
data.plot(ax=ax3)
ax4.plot(y.values)

[t.set_visible(True) for t in ax.get_xticklabels()]

plt.show()