92088


以下のサイトを参考に、matplotlibで、PandasのDataFrameを、画像に保存下のですが、  
小数点以下の桁数をフォーマット指定することができず困っています。  
小数点以下、２桁で表示する方法を教えていただけないでしょうか。

参考にしたサイト:<https://tedukapm.tech/python/tableoutput/>

[code]

    import matplotlib.pyplot as plt
    import pandas as pd
    
    df = pd.DataFrame(
        data=[
            {'列１': 1.25, '列２': 0.58},
            {'列１': 0.10, '列２': 0.20}  # ←ゼロ埋めして、小数点以下２桁で表示させたい。
        ],
        index=['xx', 'yy']
    )
    df.style.set_precision(2)
    df.style.format('{:.2%}', na_rep='-')
    display(df)
    
    fig, ax = plt.subplots()  # 単位はインチ
    ax.axis('off')
    ax.axis('tight')
    
    arg_map = {
        'cellText': df.values,
        'colLabels': df.columns,
        'loc': 'center',
        'bbox': [0, 0, 1, 1],
    }
    table = ax.table(**arg_map)
    plt.savefig('image.png')
    
[/code]

以下、実行結果です。  
上段はdisplay(df)の結果。下段はplt.savefig(...)の結果が表示されています。  
下段の２行目の値も小数点以下２桁で表示させたいです。（列ごとにフォーマット指定できればなお良しです。）

[![画像の説明をここに入力](https://i.stack.imgur.com/aSpgu.png)](https://i.stack.imgur.com/aSpgu.png)


CC BY-SA 4.0
2022-11-08T13:02:09.177
92087
2022-11-09T15:12:40.377
2022-11-08T13:14:39.457
3060
35267
question
python python3 matplotlib
matplotlibでDataFrameを描画するときに、小数点桁数を指定する方法

[code]

    arg_map = {
        'cellText': df.applymap('{:.2f}'.format).values,
        'colLabels': df.columns,
        'loc': 'center',
        'bbox': [0, 0, 1, 1],
    }
    table = ax.table(**arg_map)
    plt.savefig('image.png')
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/KYZ1t.png)](https://i.stack.imgur.com/KYZ1t.png)


CC BY-SA 4.0
2022-11-08T13:34:45.320
92088
2022-11-08T13:34:45.320
47127
92087
answer


「小数点以下を2桁で表示」に加え「欠損値を `-` で表示」にも対応してみました（`df_fmt` 参照）。なお，`df`
を設定する形式を変えていますが表示の対応とは関係ありません。

[code]

    import matplotlib.pyplot as plt
    import pandas as pd
    
    df = pd.DataFrame([[1.25, None],  # 0.58 -> None
                       [0.10, 0.20]],
                      index=['xx', 'yy'], columns=['col1', 'col2'])
    
    df_fmt = df.applymap(lambda x: '-' if pd.isna(x) else f'{x:.2f}')
    display(df_fmt)
    
    fig, ax = plt.subplots()
    ax.axis('off')
    ax.axis('tight')
    
    arg_map = {
        'cellText': df_fmt.values,
        'colLabels': df.columns,
        'loc': 'center',
        'bbox': [0, 0, 1, 1]}
    
    table = ax.table(**arg_map)
    plt.savefig('image.png')
    
[/code]

また，「列毎にフォーマットを指定」にも上記を以下のように変更すれば対応できます。

[code]

    # df_fmt = df.applymap(lambda x: '-' if pd.isna(x) else f'{x:.2f}')
    df_fmt = pd.concat([
        df['col1'].apply(lambda x: '-' if pd.isna(x) else f'{x:.2f}'),
        df['col2'].apply(lambda x: '-' if pd.isna(x) else f'{x:.3f}')], axis=1)
    
[/code]

[![image.png](https://i.stack.imgur.com/YDteH.png)](https://i.stack.imgur.com/YDteH.png)


CC BY-SA 4.0
2022-11-09T14:20:43.287
92113
2022-11-09T15:12:40.377
2022-11-09T15:12:40.377
54588
54588
92087
answer