在子图中创建表
Posted
技术标签:
【中文标题】在子图中创建表【英文标题】:Create Table in subplot 【发布时间】:2015-04-25 05:58:16 【问题描述】:我有一个 python 图,然后想在与其相邻的子图中的表中有一组统计数据。我使用了一种临时方法,在该方法中,我创建了一个带有白色轴颜色的子图,然后在子图中制作了一个表格。如果你仔细观察,你会发现桌子上有白线穿过它。我的代码如下。
import pandas as pd
import numpy as np
import datetime as dt
import matplotlib.pyplot
from patsy import dmatrices
import statsmodels.api as sm
import matplotlib.gridspec as gridspec
gs = gridspec.GridSpec(1, 2,width_ratios=[6,1])
ax1 = plt.subplot(gs[0])
plt.plot_date(sp_df.index,np.log(sp_df['PX_LAST']),'k')
sells = sp_df[(sp_df['hurst'] > 0.5) & (sp_df['sharpe'] < 0.5) & (sp_df['20dma'] < sp_df['65dma'])].index
buys = sp_df[(sp_df['hurst'] > 0.5) & (sp_df['sharpe'] > 0.5) & (sp_df['20dma'] > sp_df['65dma']) & (sp_df['50dma'] > sp_df['200dma'])].index
plt.plot_date(buys,np.log(sp_df.ix[buys]['PX_LAST']),'g^')
plt.plot_date(sells,np.log(sp_df.ix[sells]['PX_LAST']),'rv')
plt.xlim(sp_df.index[0] - dt.timedelta(days=90),sp_df.index[-1] + dt.timedelta(days=90))
ax2 = plt.subplot(gs[1])
total_return = 2.50
annualized_return = 1.257
sharpe_ratio = .85
max_dd = .12
dd_duration = 300
stats = "Total Return" : "%0.2f%%" % ((total_return - 1.0) * 100.0),
"Annualized Return" : "%0.2f%%" %((annualized_return - 1.0) * 100.0),
"Sharpe Ratio" : "%0.2f" % sharpe_ratio,
"Max Drawdown" : "%0.2f%%" % (max_dd * 100.0),
"Drawdown Duration" : str(dd_duration) + " days"
bbox=[0.0,0.0,.5, .5]
stats = pd.DataFrame(stats,index=range(1)).T
plt.table(cellText = stats.get_values(),colWidths=[0.6]*2,rowLabels=stats.index,colLabels=['Metrics'],loc='right')
plt.tick_params(axis='both',top='off',left='off',labelleft='off',right='off',bottom='off',labelbottom='off')
ax = plt.gca()
ax.spines['bottom'].set_color('white')
ax.spines['top'].set_color('white')
ax.spines['left'].set_color('white')
ax.spines['right'].set_color('white')
fig = plt.gcf()
fig.set_size_inches(11.5,8.5)
配图
【问题讨论】:
怀疑您正在使用一些具有白色网格的默认值,这就是您所看到的。关掉电网就行了。ax.grid(False)
嘿,这就是我最终要做的。谢谢!
【参考方案1】:
基于this answer你也可以使用Latex来创建表格。 为了便于使用,您可以创建一个函数,将您的数据转换为相应的文本字符串:
import numpy as np
import matplotlib.pyplot as plt
from math import pi
from matplotlib import rc
rc('text', usetex=True)
# function that creates latex-table
def latex_table(celldata,rowlabel,collabel):
table = r'\begintable \begintabular|1|'
for c in range(0,len(collabel)):
# add additional columns
table += r'1|'
table += r' \hline'
# provide the column headers
for c in range(0,len(collabel)-1):
table += collabel[c]
table += r'&'
table += collabel[-1]
table += r'\\ \hline'
# populate the table:
# this assumes the format to be celldata[index of rows][index of columns]
for r in range(0,len(rowlabel)):
table += rowlabel[r]
table += r'&'
for c in range(0,len(collabel)-2):
if not isinstance(celldata[r][c], basestring):
table += str(celldata[r][c])
else:
table += celldata[r][c]
table += r'&'
if not isinstance(celldata[r][-1], basestring):
table += str(celldata[r][-1])
else:
table += celldata[r][-1]
table += r'\\ \hline'
table += r'\endtabular \endtable'
return table
# set up your data:
celldata = [[32, r'$\alpha$', 123],[200, 321, 50]]
rowlabel = [r'1st row', r'2nd row']
collabel = [r' ', r'$\alpha$', r'$\beta$', r'$\gamma$']
table = latex_table(celldata,rowlabel,collabel)
# set up the figure and subplots
fig = plt.figure()
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
ax1.plot(np.arange(100))
ax2.text(.1,.5,table, size=50)
ax2.axis('off')
plt.show()
这个函数的基本思想是创建一个长字符串,称为table
,可以解释为Latex-command。重要的是导入rc
并设置rc('text', uestec=True)
,保证字符串可以理解为Latex。
使用+=
附加字符串;输入是原始字符串,因此是r
。示例数据突出显示了数据格式。
最后,通过这个例子,你的图看起来像这样:
【讨论】:
我没有意识到您必须下载 LaTeX 安装。我现在要安装 MiKTeX 并再试一次。没有 LaTeX 的解决方案有机会吗?以上是关于在子图中创建表的主要内容,如果未能解决你的问题,请参考以下文章