Маркировка в барах в Barchart с pyplot и Pandas не удалась - PullRequest
0 голосов
/ 28 июня 2018

Моя цель - создать диаграмму и аннотировать столбцы, вставив в них значение, которое им соответствует.

Что-то не так с моим кодом, но я не знаю, что:

Мои данные:

top_15

         Total
Country 
China   228100
India   183289
Pakistan    92869
Philippines 81537
United Kingdom of Great Britain and Northern Ireland    60356
Republic of Korea   49094
Iran (Islamic Republic of)  45713
United States of America    38151
Sri Lanka   35156
Romania 33823
Russian Federation  28283
France  25550
Afghanistan 21941
Ukraine 21113
Morocco 21092

Мой код:

top_15.plot(kind='barh', figsize=(10, 10), color='steelblue')
plt.xlabel('Number of Immigrants')
plt.title('Top 15 Conuntries Contributing to the Immigration to Canada between 1980 - 2013')

# annotate value labels to each country
for index, value in enumerate(top_15.loc[:,'Total']): 
    label = format(int(value), ',') # format int with commas

    # place text at the end of bar (subtracting 47000 from x, and 0.1 from y to make it fit within the bar)
    plt.annotate(label, xy=(value - 47000, index - 0.10), color='white')

plt.show()

Выход:

enter image description here

Ваш совет будет оценен.

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Не уверен, что вы искали, но попробуйте изменить строку: plt.annotate(label, xy=(value - 47000, index - 0.10), color='white')

в: plt.text(value, index, label, ha='right', va='center')

0 голосов
/ 28 июня 2018

Проблема с вашим кодом заключается в том, что вы вычитаете значение x, то есть 47000 (это больше, чем наименьшее значение), просто уменьшите это число до 47 (или любое число больше, чем наименьшее значение), и оно будет работать. Также измените цвет текста на черный, если у вас белый фон

% %matplotlib inline
import matplotlib.pyplot as plt
top_15.plot(kind='barh', figsize=(10, 10), color='steelblue')
plt.xlabel('Number of Immigrants')
plt.title('Top 15 Conuntries Contributing to the Immigration to Canada between 1980 - 2013')

# annotate value labels to each country
for index, value in enumerate(top_15.loc[:,'Total']): 
    label = format(int(value), ',') # format int with commas

    # place text at the end of bar (subtracting 47000 from x, and 0.1 from y to make it fit within the bar)
    plt.annotate(label, xy=(value - 47, index - 0.10), color='black')

plt.show()

enter image description here

Альтернативный подход:

% matplotlib inline
import matplotlib.pyplot as plt
ax = df.plot(kind='barh', figsize=(15,10),color="steelblue", fontsize=13);

ax.set_title("Top 15 Conuntries Contributing to the Immigration to Canada between 1980 - 2013", fontsize=18)
ax.set_xlabel("Number of Immigrants", fontsize=18);

for i in ax.patches:
    # get_width pulls left or right; get_y pushes up or down
    ax.text(i.get_width()+.1, i.get_y()+.31, \
            str(round((i.get_width()), 2)), fontsize=10, color='black')
0 голосов
/ 28 июня 2018

Вы можете определить положение аннотации с помощью xy. Вы устанавливаете разные значения для каждой страны с помощью value - 47000. Это приводит также к некоторым отрицательным значениям (вне графика). Чтобы показать все из них в начале бара, вы можете использовать фиксированное значение, например:

xy=(1000, index - 0.10)

Или значение, которое больше, чем наименьшее (в этом случае оно будет в конце столбца):

 xy=(value - 21000, index - 0.10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...