Python Matplotlib bug?表格打印不一致
此代码:Python Matplotlib bug?表格打印不一致,python,database,matplotlib,plot,Python,Database,Matplotlib,Plot,此代码: %matplotlib inline import pandas as pd import matplotlib.pyplot as plt dc = pd.DataFrame({'A' : [1, 2, 3, 4],'B' : [4, 3, 2, 1],'C' : [3, 4, 2, 2]}) plt.plot(dc) plt.legend(dc.columns) plt.tight_layout() dcsummary = pd.DataFrame([dc.mean(),
%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
dc = pd.DataFrame({'A' : [1, 2, 3, 4],'B' : [4, 3, 2, 1],'C' : [3, 4, 2, 2]})
plt.plot(dc)
plt.legend(dc.columns)
plt.tight_layout()
dcsummary = pd.DataFrame([dc.mean(), dc.sum()],index=['Mean','Total'])
plt.table(cellText=dcsummary.values,colWidths = [0.25]*len(dc.columns),
rowLabels=dcsummary.index,
colLabels=dcsummary.columns,
cellLoc = 'center', rowLoc = 'center',
loc='top')
fig = plt.gcf()
#plt.show()
将得到如下()所示的结果:
但是,如果禁用内联打印并启用plt.show()
,结果将如下所示:
也就是说,如果禁用内联打印,表格将从图形中切断。因为这是我所做的唯一更改,我认为这是matplotlib的一个错误,它无法产生一致的结果
希望这可以在未来的版本中修复。同时,我现在如何修复它(假设我的实际表是使用pd.read\u sql
从数据库中提取的,并且它的行数可以随时变化)?PS,在给出解决方案时,请确保在添加图形标题时它仍然有效。谢谢
更新:更多的研究表明,这个问题与plt.tight\u layout()
无关。以下是我一起编译的一个示例,它没有plt.tight_layout()
,但是当禁用图形内联打印时,除了标题和表格外,表格也不会正确显示:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')
n=6
df = pd.DataFrame({
'person':[x*16 for x in list('ABCDEF')],
'score1':np.random.randn(n),
'score2':np.random.randn(n),
'score3':np.random.randn(n),
'score4':np.random.randn(n),
'score5':np.random.randn(n)
})
print(df)
plt.close('all') # close all open figures
fig, ax = plt.subplots()
# X: pd.options.display.mpl_style = 'default' # cause system freeze
df.set_index(['person']).plot(kind='barh', ax = ax, width=0.85, fontsize=8)
ax.invert_yaxis()
plt.title("Matplotlib table plotting")
#plt.tight_layout()
# Add a table
plt.table(cellText=df.values,colWidths = [0.25]*len(df.columns),
rowLabels=df.index,
colLabels=df.columns,
cellLoc = 'center', rowLoc = 'center',
loc='top')
plt.show()
问题仍然是,如何修复上述图表
谢谢只要摆脱紧凑的布局,无需内联打印即可正常工作。您可以将
bbox\u inches='tight'
设置为plt.savefig
以消除多余的空白,而不截断绘图。我确实需要plt.tight\u layout()
(请参阅),以便不消除多余的空白,而是为我的y标签获得额外的空白。我能两个都要吗?Thx.此外,这可能是一个错误,但是在计算紧凑布局的空间时,目前没有考虑表,因为这是一个实验性的特性,我恐怕答案是“否”:直接引用如下:“紧凑布局自动调整子地块参数,以便子地块适合于图形区域。这是一项实验性功能,在某些情况下可能不起作用。它只检查标签、轴标签和标题的范围。“只要摆脱紧凑的布局,无需内联打印即可正常工作。您可以将bbox\u inches='tight'
设置为plt.savefig
以消除多余的空白,而不截断绘图。我确实需要plt.tight\u layout()
(请参阅),以便不消除多余的空白,而是为我的y标签获得额外的空白。我能两个都要吗?Thx.此外,这可能是一个错误,但是在计算紧凑布局的空间时,目前没有考虑表,因为这是一个实验性的特性,我恐怕答案是“否”:直接引用如下:“紧凑布局自动调整子地块参数,以便子地块适合于图形区域。这是一项实验性功能,在某些情况下可能不起作用。它仅检查标签、轴标签和标题的范围。”