Plotnine: Как скрыть или не отображать метки небольших чиселPython

Программы на Python
Anonymous
Plotnine: Как скрыть или не отображать метки небольших чисел

Сообщение Anonymous »

У меня есть
Изображение
который был построен на основе

Код: Выделить всё

import pandas as pd
from plotnine import ggplot, aes, after_stat, geom_bar, geom_label

def combine(counts: pd.Series, percentages: pd.Series):
fmt = "{} ({}%)".format
return [
fmt(c, round(p))
for c, p
in zip(counts, percentages, strict=True)
]

d = {
'cat': [*(2200 * ['cat1']), *(180 * ['cat2']), *(490 * ['cat3'])],
'subcat': [
*(2200 * ['subcat1']),
*(150 * ['subcat2']),
*(30 * ['subcat3']),
*(40 * ['subcat4']),
*(450 * ['subcat5'])
]
}
df = pd.DataFrame(d)

cats = (
ggplot(df, aes('cat', fill='subcat'))
+ geom_bar()
+ geom_label(
aes(label=after_stat('combine(count, count / sum(count) * 100)')),
stat='count',
position='stack'
)
)
cats.save('cats.png')

Функция объединения была изменена по сравнению с исходной в разделе «Показать количество и проценты для гистограмм».
Метка для подкатегории 4 частично закрыта. по метке для subcat5, что делает ее количество и процент нечитаемыми.
Как можно скрыть метку или, что еще лучше, просто не отображать ее на графике, если ее количество слишком мало?Я попробовал

Код: Выделить всё

    ...
fmt(c, round(p)) if p > 5 else (None, None)
...
но в этом случае метки с процентным соотношением ниже или равным 5% просто будут называться «(Нет, Нет)».
Использование позиции =' fill' как для geom_bar, так и для geom_label на самом деле не является решением, поскольку проблема сохраняется для достаточно малых значений (например, если значение для subcat4 равно 10). И я также хочу сохранить пропорциональность подкатегорий во всех категориях, которая теряется при использовании позиции ='fill'.
Конечная цель, на самом деле, состоит в том, чтобы просто метки не перекрываются, поэтому другие подходы (кроме их сокрытия) также приемлемы. (Я думал о том, чтобы «уклониться» от меток по вертикали оси Y, но не думаю, что это возможно.)

Подробнее здесь: https://stackoverflow.com/questions/790 ... all-counts

Вернуться в «Python»