У меня есть Pandas DataFrame с столбцом под названием "AXLES", который может принимать целое значение от 3 до 12. Я пытаюсь использовать параметр seaborn countplot() для достижения следующего графика:
- левая ось y показывает частоты этих значений, происходящих в данных. Оси простираются на [0% -100%], отметки каждые 10%.
- правая ось y показывает фактические значения, значения соответствуют отметкам, определяемым левой осью y (обозначается каждые 10%.)
- ось x показывает категории для графиков [3, 4, 5, 6, 7, 8, 9, 10, 11, 12].
- Аннотации в верхней части столбцов показывают фактический процент этой категории.
Следующий код дает мне график ниже, с фактическими значениями, но я не мог найти способ преобразовать их в частоты. Я могу получить частоты с помощью df.AXLES.value_counts()/len(df.index)
, но я не уверен, как подключить эту информацию к Seaborn countplot()
.
Я также нашел обходное решение для аннотаций, но я не уверен, что это лучшая реализация.
Любая помощь будет оценена!
Спасибо
plt.figure(figsize=(12,8))
ax = sns.countplot(x="AXLES", data=dfWIM, order=[3,4,5,6,7,8,9,10,11,12])
plt.title('Distribution of Truck Configurations')
plt.xlabel('Number of Axles')
plt.ylabel('Frequency [%]')
for p in ax.patches:
ax.annotate('%{:.1f}'.format(p.get_height()), (p.get_x()+0.1, p.get_height()+50))
EDIT:
Я подошел ближе к тому, что мне нужно, со следующим кодом, используя Pandas "график штриховки, канаву Seaborn. Похоже, я использую так много обходных решений, и там должен быть более простой способ сделать это. Проблемы с этим подходом:
- Нет ключевого слова
order
в Pandas > функции графического объекта, поскольку у Seaborn countplot() есть, поэтому я не могу отображать все категории из 3-12, как это было в countplot(). Мне нужно показать их, даже если в этой категории нет данных. -
Вторичная ось y по какой-то причине помещает столбцы и аннотацию (см. белые линии сетки, нарисованные над текстом и столбцами).
plt.figure(figsize=(12,8)) plt.title('Distribution of Truck Configurations') plt.xlabel('Number of Axles') plt.ylabel('Frequency [%]') ax = (dfWIM.AXLES.value_counts()/len(df)*100).sort_index().plot(kind="bar", rot=0) ax.set_yticks(np.arange(0, 110, 10)) ax2 = ax.twinx() ax2.set_yticks(np.arange(0, 110, 10)*len(df)/100) for p in ax.patches: ax.annotate('{:.2f}%'.format(p.get_height()), (p.get_x()+0.15, p.get_height()+1))