Python 当sharex时,使标签在熊猫图中可见
我想用共享x轴的子地块制作一个网格。为了方便起见,应通过访问熊猫数据框的绘图方法进行绘图。此外,我希望在网格的第一行显示x-tick标签。我试图通过以下代码实现这一点:Python 当sharex时,使标签在熊猫图中可见,python,pandas,matplotlib,plot,label,Python,Pandas,Matplotlib,Plot,Label,我想用共享x轴的子地块制作一个网格。为了方便起见,应通过访问熊猫数据框的绘图方法进行绘图。此外,我希望在网格的第一行显示x-tick标签。我试图通过以下代码实现这一点: 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
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.pyplot作为plt
将numpy作为np导入
作为pd进口熊猫
x=np.linspace(0,10100)
nrows=4
ncols=3
图,轴=plt.子批次(nrows、NCOL、sharex=真)
对于i,枚举中的ax(轴整形(-1)):
y=np.cos(x+i*np.pi)
df=pd.DataFrame(y,index=x)
#ax.绘图(x,y)#显示顶部标签
df.plot(ax=ax,legend=None)#不显示顶部标签
如果i
使用Matplotlib中的原始绘图例程,但使用Pandas方法时,标签保持隐藏。
有什么想法吗?为什么以及如何解决这个问题
提前非常感谢,Markus您可以先按当前操作创建绘图,然后通过创建双轴来设置所需子地块或子地块行/列的刻度
此示例根据需要仅为第一行另外设置x-TickLabel。将这些行添加到
plt.show()
之前<代码>i是否只在第一行中使用x标签?还是第一排和最后一排?对不起,我应该说得更具体一点;我想把它们都放在最后一排和第一排。然而,第一行中的标签应该位于子批次的顶部。这很棘手。我只是花了一个小时在这个问题上,没有找到解决办法。一个类似的问题已经出现了,但没有任何令人满意的答案-不确定是否相关。@Markus:好的,我让它工作了。请看下面我编辑的答案,谢谢你的回答。您的建议确实适用于底部刻度/标签。但是,如果我想在第一行中显示上面的记号/标签(在最后一行中,它应该仍然显示底部的记号/标签),那么不知怎么的,它不起作用。它只显示不带标签的记号。还有,什么让我惊讶;仅当我在示例中的for循环之外调用此循环时,您的解决方案才有效。如果i<3:ax.tick_params(axis='x',which='both',bottom=True,top=False,labelbottom=True)直接在for循环中调用语句也不起作用。这里的解决方案对我来说不起作用,与我放置循环的位置无关。我用(MPL2.2.2,pd 0.20.1)和(mpl3.0.0,pd 0.23.4)进行了测试。@ImportanceOfBeingErnest:我用的是'2.2.2'
和0.23.0
。@Markus:是的,你必须在for循环之后和之外调用这个for循环。在jupyter和as脚本中运行这个时有区别吗?
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()