在子图中创建表

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 的解决方案有机会吗?

以上是关于在子图中创建表的主要内容,如果未能解决你的问题,请参考以下文章

关于在子表中创建限制性记录。 (Oracle 表单生成器)

如何将工作表放入 Tableau 中的一张饼图中?

Oracle 10g中如何创建表

Oracle 10g中如何创建表

Oracle 10g中如何创建表

Oracle外键需要建索引吗?