【问题标题】:How can I keep a subplot table from stretching?如何防止子图表拉伸?
【发布时间】:2021-04-07 05:56:33
【问题描述】:

我应该如何更改以下脚本以保持子图(在右侧_不拉伸?有没有办法设置子图的任一绘图区域?当我通过函数中的行/列大小调整时令人沮丧,但是当绘图时它只是扩展以填充该区域。在左侧子图中是完整列表(22 行)。在右侧,我只传递了 df 行的一半,它垂直填充?谢谢。

import pandas as pd
import matplotlib.pyplot as plt
import six

plt.rcParams['font.family'] = "Lato"

raw_data = dict(TF_001=[42, 39, 86, 15, 23, 57, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
                        21, 22, 23, 24, 25],
                SP500=[52, 41, 79, 80, 34, 47, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
                       23, 24, 25],
                Strategy=[62, 37, 84, 51, 67, 32, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
                          22,
                          23, 24, 25],
                LP_Port=[72, 43, 36, 26, 53, 88, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
                         22, 23, 24, 25])

df = pd.DataFrame(raw_data, index=pd.Index(
    ['Sharpe Ratio', 'Sortino Ratio', 'Calmars Ratio', 'Ulcer Index', 'Max Drawdown', 'Volatility',
     'VaR', 'CVaR', 'R-Squared', 'CAGR', 'Risk-of-Ruin', 'Gain-Pain Ratio', 'Pitfall Indicator',
     'Serentity Ratio', 'Common Sense Ratio', 'Kelly Criteria', 'Payoff Ratio', 'Ratio-A',
     'Ratio-B', 'Ratio-C', 'Ratio-D', 'Ratio-E'], name='Metric'),
                  columns=pd.Index(['TF_001', 'SP500', 'Strategy', 'LP_Port'], name='Series'))


def create_table(data,
                 ax=None,
                 col_width=None,
                 row_height=None,
                 font_size=8,
                 header_color='#E5E5E5',
                 row_colors=None,
                 edge_color='w',
                 header_columns=0,
                 bbox=None):
    if row_colors is None:
        row_colors = ['#F1F8E9', 'w']
    if bbox is None:
        bbox = [0, 0, 1, 1]
    data_table = ax.table(cellText=data.values,
                          colLabels=data.columns,
                          rowLabels=data.index,
                          bbox=bbox,
                          cellLoc='center',
                          rowLoc='left',
                          colLoc='center',
                          colWidths=([col_width] * len(data.columns)))
    cell_map = data_table.get_celld()
    for i in range(0, len(data.columns)):
        cell_map[(0, i)].set_height(row_height * 0.2)

    data_table.auto_set_font_size(False)
    data_table.set_fontsize(font_size)

    for k, cell in six.iteritems(data_table._cells):
        cell.set_edgecolor(edge_color)
        if k[0] == 0 or k[1] < header_columns:
            cell.set_text_props(weight='heavy', color='black')
            cell.set_facecolor(header_color)
        else:
            cell.set_facecolor(row_colors[k[0] % len(row_colors)])

    for row, col in data_table._cells:
        if (row == 0) or (col == -1):
            data_table._cells[(row, col)].set_alpha(0.8)

    return ax


fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 7), constrained_layout=False)

create_table(df, ax1, col_width=1.1, row_height=0.25, font_size=8)

create_table(df.iloc[0:11, ], ax2, col_width=1.1, row_height=0.25, font_size=8)

ax1.set_title("- Conventional Risk Measures -",
              fontsize=10,
              fontweight='heavy',
              loc='center')
ax1.axis('off')

ax2.set_title("- Second Order Risk Measures -",
              fontsize=10,
              fontweight='heavy',
              loc='center')
ax2.axis('off')

plt.suptitle('EF QuantOne - Performance and Risk Assessment ("PaRA")',
             x=0.0175,
             y=0.9775,
             ha='left',
             fontsize=12,
             weight='heavy')

plt.tight_layout()

plt.savefig('risk_parameter_table[1].pdf',
            orientation='portrait',
            pad_inches=0.5)

plt.show()

【问题讨论】:

    标签: matplotlib subplot


    【解决方案1】:

    想通了……

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import six
    
    plt.rcParams['font.family'] = "Lato"
    
    raw_data = dict(TF_001=[42, 39, 86, 15, 23, 57, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
                            21, 22, 23, 24, 25],
                    SP500=[52, 41, 79, 80, 34, 47, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
                           23, 24, 25],
                    Strategy=[62, 37, 84, 51, 67, 32, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
                              22,
                              23, 24, 25],
                    LP_Port=[72, 43, 36, 26, 53, 88, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
                             22, 23, 24, 25])
    
    df = pd.DataFrame(raw_data, index=pd.Index(
        ['Sharpe Ratio', 'Sortino Ratio', 'Calmars Ratio', 'Ulcer Index', 'Max Drawdown', 'Volatility',
         'VaR', 'CVaR', 'R-Squared', 'CAGR', 'Risk-of-Ruin', 'Gain-Pain Ratio', 'Pitfall Indicator',
         'Serentity Ratio', 'Common Sense Ratio', 'Kelly Criteria', 'Payoff Ratio', 'Ratio-A',
         'Ratio-B', 'Ratio-C', 'Ratio-D', 'Ratio-E'], name='Metric'),
                      columns=pd.Index(['TF_001', 'SP500', 'Strategy', 'LP_Port'], name='Series'))
    
    
    def create_table(data,
                     ax=None,
                     col_width=None,
                     row_height=None,
                     font_size=8,
                     header_color='#E5E5E5',
                     row_colors=None,
                     edge_color='w',
                     header_columns=0,
                     bbox=None):
        if row_colors is None:
            row_colors = ['#F1F8E9', 'w']
        if bbox is None:
            bbox = [0, 0, 1, 1]
        data_table = ax.table(cellText=data.values,
                              colLabels=data.columns,
                              rowLabels=data.index,
                              bbox=bbox,
                              cellLoc='center',
                              rowLoc='left',
                              colLoc='center',
                              colWidths=([col_width] * len(data.columns)))
        cell_map = data_table.get_celld()
        for i in range(0, len(data.columns)):
            cell_map[(0, i)].set_height(row_height * 0.2)
    
        data_table.auto_set_font_size(False)
        data_table.set_fontsize(font_size)
    
        for k, cell in six.iteritems(data_table._cells):
            cell.set_edgecolor(edge_color)
            if k[0] == 0 or k[1] < header_columns:
                cell.set_text_props(weight='heavy', color='black')
                cell.set_facecolor(header_color)
            else:
                cell.set_facecolor(row_colors[k[0] % len(row_colors)])
    
        for row, col in data_table._cells:
            if (row == 0) or (col == -1):
                data_table._cells[(row, col)].set_alpha(0.8)
    
        return ax
    
    
    # fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(11, 8.5), constrained_layout=False)
    
    fig = plt.figure(figsize=(12, 10))
    w, h = fig.get_size_inches()
    div = np.array([w, h, w, h])
    
    col_width = 1.1
    row_height = 0.25
    
    ax1_subplot_size = (np.array(df.shape[::-1]) + np.array([0, 1])) * np.array(
        [col_width, row_height])
    ax1 = fig.add_axes(np.array([1.6, 1, 4.4, 5.75]) / div)
    
    ax2_subplot_size = (np.array(df.shape[::-1]) + np.array([0, 1])) * np.array(
        [col_width, row_height])
    ax2 = fig.add_axes(np.array([7.5, 3.75, 4.4, 3]) / div)
    
    create_table(df, ax1, col_width, row_height, font_size=8)
    create_table(df.iloc[0:11, ], ax2, col_width, row_height, font_size=8)
    
    ax1.set_title("- Conventional Risk Measures -",
                  fontsize=10,
                  fontweight='heavy',
                  loc='center')
    ax1.axis('off')
    
    ax2.set_title("- Second Order Risk Measures -",
                  fontsize=10,
                  fontweight='heavy',
                  loc='center')
    ax2.axis('off')
    
    plt.suptitle('EF QuantOne - Performance and Risk Assessment ("PaRA")',
                 x=0.0175,
                 y=0.9775,
                 ha='left',
                 fontsize=12,
                 weight='heavy')
    
    # plt.tight_layout()
    
    plt.savefig('risk_parameter_table[1].pdf',
                orientation='portrait',
                pad_inches=0.5)
    
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 2013-08-19
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 2018-01-22
      • 1970-01-01
      相关资源
      最近更新 更多