Контекст
У меня есть pandas-DataFrame
, содержащий агрегированные данные, которые я хочу отобразить в виде гистограммы:
df = pd.DataFrame({
"x_axis": np.arange(0. 1. .01)
, "counts": some_aggregation
})
# df looks like this
x_axis |counts
--------------
0.00 | 1.0
0.01 | 0.0
0.02 | 14.0
...
1.00 | 12.0
Как видно, это обеспечивает
-
x_axis
: столбец, который я хочу использовать для предоставления оси X, поскольку счетчики могут содержать нулевые значения -
counts
, который представляет собой некоторую агрегацию, полученную из группы, по которой я хочу построить график предоставленного распределения вx_axis
.
С помощью самого seaborn
или matplotlib
это можно легко визуализировать:
s = sns.barplot(x='x_axis', y="counts", data=df)
Проблема
Когда я строю диаграмму, как описано, X-тики преобразуются в range(0, 100)
с помощью matplotlib
, поскольку предоставленное распределение в x_axis
обрабатывается как категориальные данные.
Печать меток показывает эту проблему:
list(s.get_xticklabels())
# Output
[Text(0, 0, '0.0'),
Text(1, 0, '0.01'),
Text(2, 0, '0.02'),
...
]
Конечно, я могу установить x-ticklabels в правильное положение, выполнив следующее:
# Change x-axis-position of x-tick-labels
s.set_xticks(s.get_xticks() * .01)
# Output
[Text(0.0, 0, '0.0'),
Text(0.01, 0, '0.01'),
Text(0.02, 0, '0.02'),
...
]
Во всяком случае, несмотря на то, что сами метки теперь находятся в правильном положении, сама диаграмма не обновляется, чтобы показать столбцы над вновь размещенными метками.
Вопрос
Могу ли я выполнить один из вариантов to:
- Преобразовать "категориальную" шкалу
sns.barplot
в метрическую? Это было бы моим любимым решением, поскольку я действительно хочу разделить ось X с другими графиками, диапазон которых составляетset_xlim((0. 1.))
. .
- Настроить график так, чтобы столбцы снова совпадали с
s.set_xticks(s.get_xticks() * .01)
?
Спасибо! Я адаптировал логику к своему коду, и он работает, включая общую ось X на нескольких графиках! :)