8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

Matplotlib Chart 将 xticks 标签放在最前面

Jeyan 2月前

22 0

我从这个答案中找到了一个很好的例子,可以在 python 的 matplotlib 中绘制雷达图。我的 xtick 标签很长,可以延伸到雷达图中。因此,标签文本被线条覆盖...

答案 中找到了一个很好的例子,可以在 python 的 matplotlib 中绘制雷达图 .

我的 xtick 标签很长,延伸到了雷达图内。因此,标签文本被雷达图的线条覆盖,如下面的屏幕截图所示。不幸的是,标签甚至从图表区域被切断了。我已经尝试过 plt.tight_layout() 修复它,但没有成功。

Label Text of Axis in the background

有没有办法:

  1. p4

  2. p5

并获取图表区域中的所有标签,以便它们不会被切断?

我使用的代码是:

将 pandas 导入为 pd 将 numpy 导入为 np 从 matplotlib 导入 pyplot 为 plt

def create_radar(df, *, id_column, title=None, max_values=None, padding=1.25, width=9, length=9):
    cm = 1/2.54
    categories = df._get_numeric_data().columns.tolist()
    data = df[categories].to_dict(orient='list')
    ids = df[id_column].tolist()
    if max_values is None:
        max_values = {key: padding*max(value) for key, value in data.items()}

    normalized_data = {key: np.array(value) / max_values[key] for key, value in data.items()}
    num_vars = len(data.keys())
    tiks = list(data.keys())
    tiks += tiks[:1]
    angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False).tolist() + [0]
    fig, ax = plt.subplots(figsize=(width*cm, length*cm), subplot_kw=dict(polar=True))

    for i, model_name in enumerate(ids):
        values = [normalized_data[key][i] for key in data.keys()]
        actual_values = [data[key][i] for key in data.keys()]
        values += values[:1]  # Close the plot for a better look
        ax.plot(angles, values, label=model_name)
        ax.fill(angles, values, alpha=0.15)
        for _x, _y, t in zip(angles, values, actual_values):
            if isinstance(t, float) and t > 1:
                t = f'{t:.0f}'
            elif isinstance(t, float) and t <= 1:
                t = f'{t:.2%}'
            else:
                str(t)
            if i % 2 == 0:
                ax.text(_x, _y+.02, t, size='xx-small', va='top', ha='right')
            else:
                ax.text(_x, _y-.02, t, size='xx-small', va='bottom', ha='left')

    ax.fill(angles, np.ones(num_vars + 1), alpha=0.05)
    ax.set_yticklabels([])
    ax.set_xticks(angles)
    #pos_list = np.arange(len(tiks))
    #ax.xaxis.set_major_locator(FixedLocator((pos_list)))
    #ax.xaxis.set_major_formatter(FixedFormatter((tiks)))
    ax.set_xticklabels(tiks, size="xx-small")
    ax.legend(loc='lower right',
              #bbox_to_anchor=(0.1, 0.1)
              )

    if title is not None:
        plt.suptitle(title)
    plt.show()

radar = create_radar

create_radar(
    pd.DataFrame({
        'x': [*'abcde'],
        'supeeeer long category name 1': [10,11,12,13,14],
        'supeeeer long category name 2': [0.1, 0.3, 0.4, 0.1, 0.9],
        'supeeeer long category name 4': [1e5, 2e5, 3.5e5, 8e4, 5e4],
        'supeeeer long category name 5': [9, 12, 5, 2, 0.2],
        'supeeeer long category name 6': [1,1,1,1,5]
    }),
    id_column='x',
)

生成:

Radar Chart Matplotlib

帖子版权声明 1、本帖标题:Matplotlib Chart 将 xticks 标签放在最前面
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Jeyan在本站《matplotlib》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 将使刻度标签出现在图表前面。也许添加一些换行符将有助于您将标签放在图表区域外部

返回
作者最近主题: