我想用共享x轴制作一个子图网格。绘图(出于某些方便原因)应通过访问Pandas DataFrame的plot方法来完成。另外,我想让x-tick-labels显示在网格的第一行中。我尝试使用以下代码实现这一目标:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
x = np.linspace(0,10,100)
nrows = 4
ncols = 3
fig, axes = plt.subplots(nrows, ncols, sharex=True)
for i, ax in enumerate(axes.reshape(-1)):
y = np.cos(x+i*np.pi)
df = pd.DataFrame(y, index=x)
# ax.plot(x, y) # shows top labels
df.plot(ax=ax, legend=None) # doesn't show top labels
if i < ncols:
# first row: plot x-ticks + x-labels
ax.tick_params(which='both', labeltop=True, top=True)
# also none of these approaches works:
# plt.setp(ax.get_xticklabels(), visible=True)
# ax.xaxis.set_tick_params(which='both', labeltop=True, top=True, colors='g')
# for label in ax.get_xticklabels():
# label.set_visible(True)
plt.show()
使用Matplotlib的原始绘图例程可以工作,但是当我使用Pandas方法时,刻度标签保持隐藏状态。
有什么想法,为什么以及如何解决这个问题?
提前多谢
马库斯
最佳答案
您可以先按照当前操作来创建图,然后再通过创建双轴为所需的子图或子图的行/列设置刻度。
本示例仅根据需要为第一行设置x-ticklabel。您在plt.show()
之前添加这些行。 i<3
此处仅表示第一行,因为这是在此处按顺序访问子图的方式。 both
表示主要和次要刻度线。由于您尚未显示次要价格变动,因此目前您只获得主要价格变动。如果需要,可以自定义if
语句以将x-ticklabel添加到另一行。我必须从您的代码中删除if i < ncols:
命令才能使其正常工作。
完整的工作代码
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib
import sys
print (sys.version)
# 3.6.5 |Anaconda, Inc.|
print (matplotlib.__version__)
# 2.2.2
print (pd.__version__)
# 0.23.0
x = np.linspace(0,10,100)
nrows = 4
ncols = 3
fig, axes = plt.subplots(nrows, ncols, sharex=True,figsize=(12,6))
for i, ax in enumerate(axes.reshape(-1)):
y = np.cos(x+i*np.pi)
df = pd.DataFrame(y, index=x)
df.plot(ax=ax, legend=None) # doesn't show top labels
if i < 3:
ax1 = ax.twiny()
ax1.set_xlim(ax.get_xlim())
ax1.tick_params(axis='x', which='both', bottom=False, top=True, labelbottom=False)
plt.tight_layout()
plt.show()