当我使用matplotlib时,如何解决我的演出编号与条形图重叠的问题?

时间:2018-11-19 07:43:58

标签: python matplotlib bar-chart

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()和plt.text可能有问题,请给我一些建议,谢谢!

2 个答案:

答案 0 :(得分: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)

作为参考,仅使用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)

答案 1 :(得分:0)

如果我理解正确,您是否希望数字显示在条形上方?如果是这样,则只需在对text()的调用中修改y的偏移量即可。当前,您添加了100,但是请记住,这是用轴坐标表示的,因此考虑到y轴的总范围,100仍然是一个很小的值。例如尝试500。
为了为所有钢筋设置类似的偏移量,必须从相对角度定义偏移量。您可以在text()调用中尝试使用1.15 * y代替y+100