使用matplotlib时,如何解决显示编号与条形图重叠的问题?

2024-04-23 20:18:18 发布

您现在位置:Python中文网/ 问答频道 /正文

enter image description here

下面是我的代码:

def generate_bar_chart(self, x_data, y_data, legend, pic_name):

        n = len(x_data)

        plt.bar(range(n), y_data, align='center', color='steelblue', alpha=0.8, label=legend)

        plt.xticks(range(n), x_data, rotation=90)

        for x, y in enumerate(y_data):
            plt.text(x, y+100, '%s' % round(y, 1), ha='center', rotation=90, alpha=0.8)
        plt.grid(axis='y', linestyle='-', alpha=0.8)
        plt.legend()
        plt.tight_layout()
        pic_file = os.path.join(self.pic_path, pic_name)
        plt.savefig(pic_file)
        plt.close()

可能enumerate()和打印文本,请给我一些建议,谢谢!你知道吗


Tags: path代码nameselfalphadatabarrange
2条回答

我想更新两件事,你是如何策划这一点:

  1. 设置文本对齐方式-verticalalignment='bottom'(或缩写va),这使得标签放置对标签长度不敏感。

  2. 使用plt.annotate而不是plt.text。对于您的用例,这些参数非常相似,但是它对数据的比例和当前的缩放级别都很健壮。

xytext=(0,5)使文本从条的中心开始,并在其上方5个点(还包括textcoords='offset points')。你知道吗

for x, y in enumerate(y_data):
    plt.annotate('%s' % round(y, 1), xy=(x, y), 
        xytext=(0, 5), textcoords='offset points',
        va='bottom', ha='center', rotation=90)

作为参考,要实现#1可以使用plt.text

for x, y in enumerate(y_data):
    plt.text(x, y+300, '%s' % round(y, 1), ha='center',
        va='bottom', rotation=90, alpha=0.8)

如果我理解正确的话,你想把数字印在横条上面吗?如果是这样,那么只需在对text()的调用中修改y的偏移量。现在你加上100,但是记住这是用坐标轴表示的,所以考虑到你的y轴的总范围,100仍然是一个很小的值。例如,试试500。
为了将类似的偏移设置为所有条形图,必须从相对的角度定义偏移。您可以在text()调用中尝试1.15 * y而不是y+100。你知道吗

相关问题 更多 >