#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 для первого контейнера: