如何使用matplotlib画出整齐的显著性图例?

我想画一个横轴为特征重要性,纵轴为特征名称的条形图,如果该特征p<0.001,就在条形图旁加上3个星号,并在空白处用类似图例的样子显示出来。我用plt.text手动做了个图例出来,但是可以看到这个手动图例对不齐。如果这个图例可以对齐,那就是我想实现的效果了。
如果设置图例的话,由于显著性并不是条形图本身的内容,再加上图例形状里也没有星号,该如何进行设置呢?

img

import matplotlib.pyplot as plt
x_sorted = ['A', 'B', 'C', 'D', 'E']
importances_sorted = [0.1, 0.2, 0.1, 0.4, 0.2]
p_values_sorted = [0.02, 0.004, 0.1, 0.0001, 0.008]
sign = []
for i in range(len(p_values_sorted)):
    if p_values_sorted[i] < 0.001:
        sign.append('***')
    elif 0.001 <= p_values_sorted[i] < 0.01:
        sign.append('**')
    elif 0.01 <= p_values_sorted[i] < 0.05:
        sign.append('*')
    else:
        sign.append('')
plt.figure(figsize=[11, 7])
fig = plt.barh(x_sorted, importances_sorted, height=0.5,)
for index, i in enumerate(fig):
    width = i.get_width()
    plt.text(width+0.005, i.get_y()+0.135, sign[index], va='center', ha='left', fontsize=23)
plt.text(0.35, 3.7, '***  p<0.001\n**   p<0.01\n*    p<0.05', fontsize=23, bbox=dict(fc='white', ec='k', lw=1, alpha=0.5, pad=10))
plt.show()

这个一般没有好方法,你可以对程序进行以下修改;


str1 = \
    """
    *** p<0.001
    **  p<0.010
    *   p<0.050
    """

plt.text(0.35, 3.7, str1, fontsize=23,verticalalignment="center",horizontalalignment="right",
         bbox=dict(fc='white', ec='k', lw=1, alpha=0.5, pad=10))
plt.show()

运行结果为:

img


基本可以实现对其,目前也只能这样了,因为这不属于常规作图

加图例,参考

import matplotlib.pyplot as plt

# 定义图例文本和图例图形
legend_labels = ['p < 0.001', 'p < 0.01', 'p < 0.05']
legend_markers = ['*', '**', '***']

# 添加图例
plt.legend(legend_markers, legend_labels)

```c


```

您可以在绘制条形图的时候,使用plt.text函数,指定一个偏移量,将星号放置在条形图的右边。例如,假设条形图的高度为height,那么可以使用以下代码将星号放置在条形图的右边:

plt.text(i.get_width() + 0.005, i.get_y() + height / 2, sign[index], va='center', ha='left', fontsize=23)
此外,您也可以使用类似的方法,调整图例的位置,使其对齐。例如,可以使用以下代码调整图例的位置:

plt.text(0.35, 3.7, '*** p<0.001\n** p<0.01\n* p<0.05', fontsize=23, bbox=dict(fc='white', ec='k', lw=1, alpha=0.5, pad=10))
调整x和y的值,即可将图例放置在您希望的位置。

使用matplotlib画出整齐的显著性图例,可以使用以下方法:

1.在matplotlib中,显著性图例通常用于标记不同的数据点或数据系列,以便让读者更容易理解图表的信息。
2.在创建图表时,使用matplotlib的plot函数绘制图表。在绘制每个数据点或数据系列时,使用label参数为其指定一个显著性图例的标签。
3.在图表绘制完成后,使用matplotlib的legend函数创建一个显著性图例。在调用legend函数时,可以使用loc参数指定显著性图例的位置,使用bbox_to_anchor参数指定显著性图例的对齐方式,使用ncol参数指定显著性图例的列数,使用frameon参数控制是否显示显著性图例的边框等。

import matplotlib.pyplot as plt

# 绘制折线图
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], label='y = x^2')
plt.plot([1, 2, 3, 4], [2, 5, 10, 17], label='y = x^2 + 1')

# 创建显著性图例
plt.legend(loc='upper right', bbox_to_anchor=(1, 1), ncol=1, frameon=False)

或者参考

import matplotlib.pyplot as plt

# 绘制折线图
plt.plot([1, 2, 3, 4], [1, 4, 9, 16], label='y = x^2')
plt.plot([1, 2, 3, 4], [2, 5, 10, 17], label='y = x^2 + 1')

# 创建显著性图例
plt.legend(loc='upper right', bbox_to_anchor=(1, 1), ncol=1, frameon=False,
           title='Curves', fontsize=16, facecolor='white', edgecolor='black')

可参考该博主系列文章【超级详细matplotlib使用教程,手把手教你画图!(多个图、刻度、标签、图例等)】,链接:https://blog.csdn.net/sinat_39620217/article/details/115670663