xticks и гистограмма, отображаемые в разных положениях на графике

#python #matplotlib #data-science

#python #matplotlib #наука о данных

Вопрос:

У меня есть словарь имен dc, в котором у меня есть некоторые ключи и значения. Я хочу построить словарь на основе 10 лучших значений в словаре.

Я успешно справился с сортировкой словаря и построением гистограммы с его использованием. но когда я пытаюсь установить xticks, xticks разделяются гистограммой.

Вот мой код:

 dc = {0: 7, 1: 5, 2: 3, 3: 5, 4: 7, 5: 4, 6: 2, 7: 1, 8: 2, 9: 2, 11: 1, 12: 1, 13: 2, 14: 3, 15: 4, 16: 6, 17: 6, 18: 9, 19: 9, 20: 3, 21: 5, 22: 11, 23: 5, 24: 15, 25: 6, 26: 6, 27: 11, 28: 7, 29: 60, 30: 10, 31: 8, 32: 10, 33: 6, 34: 6, 35: 11, 36: 11, 37: 1, 38: 5, 39: 5, 40: 6, 41: 2, 42: 6, 43: 1, 44: 3, 45: 5, 47: 1, 48: 6, 49: 4, 50: 5, 51: 2, 52: 3, 53: 1, 54: 3, 55: 1, 56: 2, 58: 3, 60: 2, 62: 2, 63: 2, 80: 1}
dc_sorted = sorted(dc.items(), key=lambda x: x[1], reverse=True)
key_10 = [dc_sorted[i][0] for i in range(len(dc_sorted))][:10]
value_10= [dc_sorted[i][1] for i in range(len(dc_sorted))][:10]
plt.figure(figsize=(12,8))
for index in range(len(key_10)):
    plt.bar(key_10[index],value_10[index],color ='blue')
    plt.text(key_10[index],value_10[index],str(value_10[index]),color="green")
plt.xticks(np.arange(len(key_10)),key_10)
plt.show()
  

введите описание изображения здесь

Ответ №1:

X в гистограмме занимает положение линейки, которую вы хотите отобразить на рисунке. В вашем коде вы указываете значение ключа. Итак, ваши тики отображаются в 0-9, но ваши столбцы отображаются по значению ключей. Также для гистограммы вы можете передавать массив вместо того, чтобы отображать по одному столбцу за раз.

 dc = {0: 7, 1: 5, 2: 3, 3: 5, 4: 7, 5: 4, 6: 2, 7: 1, 8: 2, 9: 2, 11: 1, 12: 1, 13: 2, 14: 3, 15: 4, 16: 6, 17: 6, 18: 9, 19: 9, 20: 3, 21: 5, 22: 11, 23: 5, 24: 15, 25: 6, 26: 6, 27: 11, 28: 7, 29: 60, 30: 10, 31: 8, 32: 10, 33: 6, 34: 6, 35: 11, 36: 11, 37: 1, 38: 5, 39: 5, 40: 6, 41: 2, 42: 6, 43: 1, 44: 3, 45: 5, 47: 1, 48: 6, 49: 4, 50: 5, 51: 2, 52: 3, 53: 1, 54: 3, 55: 1, 56: 2, 58: 3, 60: 2, 62: 2, 63: 2, 80: 1}
dc_sorted = sorted(dc.items(), key=lambda x: x[1], reverse=True)
key_10 = [dc_sorted[i][0] for i in range(len(dc_sorted))][:10]
value_10= [dc_sorted[i][1] for i in range(len(dc_sorted))][:10]
plt.bar(np.arange(len(key_10)),value_10, color ='blue')
for index in range(len(key_10)):
    plt.text(index,value_10[index],str(value_10[index]),color="green")
plt.xticks(np.arange(len(key_10)),key_10)
plt.show()
  

введите описание изображения здесь

Ответ №2:

Если вы используете числа для оси x, plt.bar они будут использоваться в качестве x-позиции. Если вы используете строки, столбцы просто располагаются один за другим. Внутренне они будут пронумерованы 0,1,2,...

Обратите внимание, что ширина столбцов по умолчанию равна 0,8, которая измеряется в координатах x. Если ваши числа расположены далеко друг от друга, столбцы с числовой осью x также будут расположены далеко друг от друга и будут казаться узкими.

Вот сравнение между обоими способами:

 import matplotlib.pyplot as plt

dc = {0: 7, 1: 5, 2: 3, 3: 5, 4: 7, 5: 4, 6: 2, 7: 1, 8: 2, 9: 2, 11: 1, 12: 1, 13: 2, 14: 3, 15: 4, 16: 6, 17: 6, 18: 9, 19: 9, 20: 3, 21: 5, 22: 11, 23: 5, 24: 15, 25: 6, 26: 6, 27: 11, 28: 7, 29: 60, 30: 10, 31: 8, 32: 10, 33: 6, 34: 6, 35: 11, 36: 11, 37: 1, 38: 5, 39: 5, 40: 6, 41: 2, 42: 6, 43: 1, 44: 3, 45: 5, 47: 1, 48: 6, 49: 4, 50: 5, 51: 2, 52: 3, 53: 1, 54: 3, 55: 1, 56: 2, 58: 3, 60: 2, 62: 2, 63: 2, 80: 1}
dc_sorted = sorted(dc.items(), key=lambda x: x[1], reverse=True)

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12, 8))

# numeric keys
key_10 = [dc_sorted[i][0] for i in range(len(dc_sorted))][:10]
value_10 = [dc_sorted[i][1] for i in range(len(dc_sorted))][:10]
ax1.bar(key_10, value_10, color='blue')
for key, value in zip(key_10, value_10):
    ax1.text(key, value, f'{value}n', color="green", ha='center', va='center')
ax1.set_xticks(key_10)
ax1.set_title('numeric keys')

# keys converted to string
key_10 = [str(dc_sorted[i][0]) for i in range(len(dc_sorted))][:10]
ax2.bar(key_10, value_10, color='blue')
for key, value in zip(key_10, value_10):
    ax2.text(key, value, f'{value}n', color="green", ha='center', va='center')
ax2.set_xticks(range(len(key_10)))
ax2.set_xticklabels(key_10)
ax2.set_title('keys converted to string')

plt.show()
  

пример графика

PS: С ha='center' текст может быть центрирован по горизонтали. А с va='center' добавлением новой строки в строку текст будет красиво размещен поверх строки.