Как я могу решить, что мой номер шоу перекрывают мою гистограмму, когда я использую matplotlib? - PullRequest
0 голосов
/ 19 ноября 2018

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 голосов
/ 19 ноября 2018

Я бы обновил 2 вещи в том, как вы чертите это:

  1. установить выравнивание текста - verticalalignment='bottom' (или сокращение va), что делает размещение метки нечувствительнымдо длины этикетки.

  2. используйте plt.annotate вместо plt.text.Для вашего случая использования параметры очень похожи, но они также устойчивы как к масштабу данных, так и к текущему уровню масштабирования.

xytext=(0,5) делает начало текста вцентр вашего бара и 5 точек над ним (включая textcoords = 'точки смещения').

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)
0 голосов
/ 19 ноября 2018

Если я правильно понимаю, вы хотите, чтобы числа печатались над полосами? Если это так, то просто измените смещение для y в вызове text (). В настоящее время вы добавляете 100, но имейте в виду, что это выражается в координатах оси, поэтому 100 все еще является небольшим значением, учитывая полный диапазон вашей оси y. Попробуйте 500, например.
Чтобы установить одинаковое смещение для всех баров, вы должны определить свое смещение с относительной точки зрения. Вы можете попробовать 1.15 * y вместо y+100 в вызове text ().

...