Аннотируйте одну переменную на столбчатой диаграмме со стеком

#python #pandas #matplotlib

Вопрос:

У меня есть гистограмма, которая получает максимальное значение из группы, а затем объединяет оставшиеся более низкие значения вместе и объединяет их в «другую» группу.

Как я могу просто аннотировать группу с максимальным значением, игнорируя другую группу.

Этот код, который я нашел для аннотации на гистограммах, обычно хорошо работает, но будет аннотировать обе диаграммы. У кого-нибудь есть идеи, как я могу это исправить?

Например, вот пример моей проблемы

 import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

d = {'Group': ['a'], '6 Month Projection': [100]}
dff = pd.DataFrame(data=d)
# dff['6 Month Projection'] = dff['6 Month Projection']/1000000
# dff
fig, ax = plt.subplots()

x_bar = dff['Group']
y_bar = dff['6 Month Projection'][0]
z_bar = 50
# plt.bar(x_bar,y_bar)



plt.bar(x_bar, z_bar)
plt.bar(x_bar, y_bar, bottom=z_bar,color='orange')


for p in ax.patches:
    ax.annotate("%.2f" % p.get_height(), (p.get_x()   p.get_width() / 2., p.get_height()), ha='center', va='center', xytext=(0, 10), textcoords='offset points')



fig.text(0.9, 0.05, '$Group

Кто-нибудь знает, как я могу аннотировать только синий цвет?


Комментарии:

1. Вы могли бы нарезать патчи вместо того, чтобы повторять их в целом.

2. С .илок? Я устал от этого, но вернулся IndexError: invalid index to scalar variable.

3. Патчи-это не фрейм данных. так что нет, обычная повторяющаяся нарезка p = ax.patches[0] или что-то в этом роде. Если бы вы предоставили код с образцами данных, которые можно было бы использовать для построения репрезентативного графика, а также подробную информацию о желаемом результате, было бы проще дать более конкретный ответ..

4. Конечно, я обновлю вопрос. Одна минута

Ответ №1:

Есть много способов достичь того, чего вы хотите. Проще всего было бы пройтись по созданным патчам, когда были созданы только нижние. Другой способ-проверить, равно ли нулю положение бара по оси y:

 import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

d = {'Group': ['a'], '6 Month Projection': [100]}
dff = pd.DataFrame(data=d)
fig, ax = plt.subplots()

x_bar = dff['Group']
y_bar = dff['6 Month Projection'][0]
z_bar = 50

ax.bar(x_bar, z_bar)
ax.bar(x_bar, y_bar, bottom=z_bar, color='orange')

for p in ax.patches:
    if p.get_y() == 0:
        ax.annotate("%.2f" % p.get_height(), (p.get_x()   p.get_width() / 2., p.get_height()), ha='center', va='center',
                    xytext=(0, 10), textcoords='offset points')

fig.text(0.9, 0.05, '$Group

аннотирование нижних полос

Некоторые замечания:

  • с fig, ax = subplots(...) вами выберите "объектно-ориентированный" интерфейс построения графика; рекомендуется продолжать использовать ax его, чтобы указать matplotlib, какой "подзаголовок" использовать.
  • чтобы разместить текст только в верхней части панели, вам нужно подвести p.get_y() p.get_height() итог . (Это не имело бы значения для баров, у которых внизу 0.)

Ответ №2:

В matplotlib 3.4.0 или новее вы можете просто установить bar_label для первого контейнера:

 ax.bar_label(ax.containers[0], fmt='%.2f')
 
 import pandas as pd
from matplotlib import pyplot as plt

dff = pd.DataFrame({'Group': ['a', 'b'],
                    '6 Month Projection': [100, 175],
                    'Blue': [50, 75]})
fig, ax = plt.subplots()

x_bar = dff['Group']
y_bar = dff['6 Month Projection']
z_bar = dff['Blue']
ax.bar(x_bar, z_bar)
ax.bar(x_bar, y_bar, bottom=z_bar, color='orange')

# Set labels for first container only
ax.bar_label(ax.containers[0], fmt='%.2f')
fig.text(0.9, 0.05, '$Group

участок с аннотированными синими полосами



)
fig.text(0.1, 0.95, 'Revenue in Millions')
# ax.set_ylim(bottom=10.00)
# ax.set_ylim(top=12.75)
# fig.set_size_inches(10,5)
plt.show()
# # plt.xticks(y_pos, objects)
# # plt.ylabel('Usage')
# # plt.title('Programming language usage')

# plt.show()
Кто-нибудь знает, как я могу аннотировать только синий цвет?

Комментарии:

1. Вы могли бы нарезать патчи вместо того, чтобы повторять их в целом.

2. С .илок? Я устал от этого, но вернулся IndexError: invalid index to scalar variable.

3. Патчи-это не фрейм данных. так что нет, обычная повторяющаяся нарезка p = ax.patches[0] или что-то в этом роде. Если бы вы предоставили код с образцами данных, которые можно было бы использовать для построения репрезентативного графика, а также подробную информацию о желаемом результате, было бы проще дать более конкретный ответ..

4. Конечно, я обновлю вопрос. Одна минута

Ответ №1:

Есть много способов достичь того, чего вы хотите. Проще всего было бы пройтись по созданным патчам, когда были созданы только нижние. Другой способ-проверить, равно ли нулю положение бара по оси y:


аннотирование нижних полос

Некоторые замечания:

  • с fig, ax = subplots(...) вами выберите "объектно-ориентированный" интерфейс построения графика; рекомендуется продолжать использовать ax его, чтобы указать matplotlib, какой "подзаголовок" использовать.
  • чтобы разместить текст только в верхней части панели, вам нужно подвести p.get_y() p.get_height() итог . (Это не имело бы значения для баров, у которых внизу 0.)

Ответ №2:

В matplotlib 3.4.0 или новее вы можете просто установить bar_label для первого контейнера:



участок с аннотированными синими полосами

)
fig.text(0.1, 0.95, 'Revenue in Millions')
plt.show()

аннотирование нижних полос

Некоторые замечания:

  • с fig, ax = subplots(...) вами выберите "объектно-ориентированный" интерфейс построения графика; рекомендуется продолжать использовать ax его, чтобы указать matplotlib, какой "подзаголовок" использовать.
  • чтобы разместить текст только в верхней части панели, вам нужно подвести p.get_y() p.get_height() итог . (Это не имело бы значения для баров, у которых внизу 0.)

Ответ №2:

В matplotlib 3.4.0 или новее вы можете просто установить bar_label для первого контейнера:



участок с аннотированными синими полосами

)
fig.text(0.1, 0.95, 'Revenue in Millions')
# ax.set_ylim(bottom=10.00)
# ax.set_ylim(top=12.75)
# fig.set_size_inches(10,5)
plt.show()
# # plt.xticks(y_pos, objects)
# # plt.ylabel('Usage')
# # plt.title('Programming language usage')

# plt.show()

Кто-нибудь знает, как я могу аннотировать только синий цвет?

Комментарии:

1. Вы могли бы нарезать патчи вместо того, чтобы повторять их в целом.

2. С .илок? Я устал от этого, но вернулся IndexError: invalid index to scalar variable.

3. Патчи-это не фрейм данных. так что нет, обычная повторяющаяся нарезка p = ax.patches[0] или что-то в этом роде. Если бы вы предоставили код с образцами данных, которые можно было бы использовать для построения репрезентативного графика, а также подробную информацию о желаемом результате, было бы проще дать более конкретный ответ..

4. Конечно, я обновлю вопрос. Одна минута

Ответ №1:

Есть много способов достичь того, чего вы хотите. Проще всего было бы пройтись по созданным патчам, когда были созданы только нижние. Другой способ-проверить, равно ли нулю положение бара по оси y:


аннотирование нижних полос

Некоторые замечания:

  • с fig, ax = subplots(...) вами выберите «объектно-ориентированный» интерфейс построения графика; рекомендуется продолжать использовать ax его, чтобы указать matplotlib, какой «подзаголовок» использовать.
  • чтобы разместить текст только в верхней части панели, вам нужно подвести p.get_y() p.get_height() итог . (Это не имело бы значения для баров, у которых внизу 0.)

Ответ №2:

В matplotlib 3.4.0 или новее вы можете просто установить bar_label для первого контейнера:



участок с аннотированными синими полосами

)
fig.text(0.1, 0.95, ‘Revenue in Millions’)
plt.show()участок с аннотированными синими полосами

)
fig.text(0.1, 0.95, ‘Revenue in Millions’)
# ax.set_ylim(bottom=10.00)
# ax.set_ylim(top=12.75)
# fig.set_size_inches(10,5)
plt.show()
# # plt.xticks(y_pos, objects)
# # plt.ylabel(‘Usage’)
# # plt.title(‘Programming language usage’)

# plt.show()Кто-нибудь знает, как я могу аннотировать только синий цвет?

Комментарии:

1. Вы могли бы нарезать патчи вместо того, чтобы повторять их в целом.

2. С .илок? Я устал от этого, но вернулся IndexError: invalid index to scalar variable.

3. Патчи-это не фрейм данных. так что нет, обычная повторяющаяся нарезка p = ax.patches[0] или что-то в этом роде. Если бы вы предоставили код с образцами данных, которые можно было бы использовать для построения репрезентативного графика, а также подробную информацию о желаемом результате, было бы проще дать более конкретный ответ..

4. Конечно, я обновлю вопрос. Одна минута

Ответ №1:

Есть много способов достичь того, чего вы хотите. Проще всего было бы пройтись по созданным патчам, когда были созданы только нижние. Другой способ-проверить, равно ли нулю положение бара по оси y:


аннотирование нижних полос

Некоторые замечания:

  • с fig, ax = subplots(...) вами выберите «объектно-ориентированный» интерфейс построения графика; рекомендуется продолжать использовать ax его, чтобы указать matplotlib, какой «подзаголовок» использовать.
  • чтобы разместить текст только в верхней части панели, вам нужно подвести p.get_y() p.get_height() итог . (Это не имело бы значения для баров, у которых внизу 0.)

Ответ №2:

В matplotlib 3.4.0 или новее вы можете просто установить bar_label для первого контейнера:



участок с аннотированными синими полосами

)
fig.text(0.1, 0.95, ‘Revenue in Millions’)
plt.show()

аннотирование нижних полос

Некоторые замечания:

  • с fig, ax = subplots(...) вами выберите «объектно-ориентированный» интерфейс построения графика; рекомендуется продолжать использовать ax его, чтобы указать matplotlib, какой «подзаголовок» использовать.
  • чтобы разместить текст только в верхней части панели, вам нужно подвести p.get_y() p.get_height() итог . (Это не имело бы значения для баров, у которых внизу 0.)

Ответ №2:

В matplotlib 3.4.0 или новее вы можете просто установить bar_label для первого контейнера:



участок с аннотированными синими полосами

)
fig.text(0.1, 0.95, ‘Revenue in Millions’)
# ax.set_ylim(bottom=10.00)
# ax.set_ylim(top=12.75)
# fig.set_size_inches(10,5)
plt.show()
# # plt.xticks(y_pos, objects)
# # plt.ylabel(‘Usage’)
# # plt.title(‘Programming language usage’)

# plt.show()

Кто-нибудь знает, как я могу аннотировать только синий цвет?

Комментарии:

1. Вы могли бы нарезать патчи вместо того, чтобы повторять их в целом.

2. С .илок? Я устал от этого, но вернулся IndexError: invalid index to scalar variable.

3. Патчи-это не фрейм данных. так что нет, обычная повторяющаяся нарезка p = ax.patches[0] или что-то в этом роде. Если бы вы предоставили код с образцами данных, которые можно было бы использовать для построения репрезентативного графика, а также подробную информацию о желаемом результате, было бы проще дать более конкретный ответ..

4. Конечно, я обновлю вопрос. Одна минута

Ответ №1:

Есть много способов достичь того, чего вы хотите. Проще всего было бы пройтись по созданным патчам, когда были созданы только нижние. Другой способ-проверить, равно ли нулю положение бара по оси y:


аннотирование нижних полос

Некоторые замечания:

  • с fig, ax = subplots(...) вами выберите «объектно-ориентированный» интерфейс построения графика; рекомендуется продолжать использовать ax его, чтобы указать matplotlib, какой «подзаголовок» использовать.
  • чтобы разместить текст только в верхней части панели, вам нужно подвести p.get_y() p.get_height() итог . (Это не имело бы значения для баров, у которых внизу 0.)

Ответ №2:

В matplotlib 3.4.0 или новее вы можете просто установить bar_label для первого контейнера:



участок с аннотированными синими полосами