【问题标题】:Set multiple titles for a matplotlib subplot为 matplotlib 子图设置多个标题
【发布时间】:2018-05-26 09:56:57
【问题描述】:

我正在创建通过matplotlib_venn 制作的维恩图的子图。这是我正在制作的情节:

请注意右上角图中缺少的标题。这是因为每当我调用ax.set_title 时,它都会替换现有的子情节标题。创建此图的代码是:

oadoi_colors = ['all', 'closed', 'closed + green', 'bronze', 'green', 'hybrid', 'gold']
collections = ['Combined', 'Crossref', 'Unpaywall', 'Web of Science']
figure, axes = matplotlib.pyplot.subplots(nrows=len(oadoi_colors), ncols=len(collections), figsize=(2.7 * len(collections), 2.7 * len(oadoi_colors)))
subplot_label_rectprops = {'facecolor': '#fef2e2', 'boxstyle': 'round'}

for (oadoi_color, collection), df in coverage_df.groupby(['oadoi_color', 'collection']):
    i = oadoi_colors.index(oadoi_color)
    j = collections.index(collection)
    ax = axes[i, j]
    venn_plotter(df, ax=ax)
    if i == 0:
        text = ax.set_title(collection, loc='center', y=1.1)
        text.set_bbox(subplot_label_rectprops)
        # Top-right subplot cannot titled twice: https://stackoverflow.com/questions/36602347
    if j == len(collections) - 1:
        text = ax.set_title(oadoi_color.title(), x=1.1, y=0.5, verticalalignment='center', rotation=270)
        text.set_bbox(subplot_label_rectprops)

venn_plotter 是一个调用matplotlib_venn.venn3_unweighted 的函数。 df 是数据的pandas.DataFrame

在 matplotlib title demo 中,您似乎可以设置多个标题...但我不知道如何使用子图来做到这一点。

有一个answer to a similar question 建议使用set_ylabel。但是,设置 ylabel 对这些维恩图没有影响。

【问题讨论】:

    标签: python matplotlib venn-diagram matplotlib-venn


    【解决方案1】:

    问题是每个轴子图都只有一个标题。如果您第二次拨打set_title,第一个标题将被替换。
    标题和文本之间没有太大区别。因此,您可以决定对列使用标题,对行使用文本。

    import matplotlib.pyplot as plt
    
    fig, axes = plt.subplots(3,3)
    for i in range(3):
        for j in range(3):
            ax = axes[i,j]
            if i == 0:
                title = ax.set_title("column title", loc='center', y=1.1)
            if j == 2:
                text = ax.text(1.1,0.5,"row title", size=12,
                               verticalalignment='center', rotation=270)
    
    plt.show()
    

    【讨论】:

    • 注 1:ax.text() 仅限于其网格单元。如果您真的想在任何地方多次注释,请使用 plt.figtext(0.02, 0.5, 'mytext', fontsize=12, rotation=90)
    猜你喜欢
    • 2021-11-13
    • 2021-08-09
    • 1970-01-01
    • 2017-06-15
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    相关资源
    最近更新 更多