Другой ответ, конечно, правильный в том, как решить проблему - просто преобразовать в список. Во-первых, причина, по которой он не работает, заключается в копании в исходном коде matplotlib.
bar
и barh
оба вызывают matplotlib.axes.Axes.bar
под капотом. Когда вы строите график bar
, x
- это позиция x столбцов, а height
- это значение y.
Однако, вызывая barh
, значения y (т. Е. ['blueberries', 'pizza', 'apples']
) фактически устанавливаются в аргумент bottom
, а длина столбцов определяется как width
.
Следующая строка вызывается в исходном коде
func(ax, *map(sanitize_sequence, args), **kwargs)
Где sanitize_sequence
:
def sanitize_sequence(data):
"""
Convert dictview objects to list. Other inputs are returned unchanged.
"""
return (list(data) if isinstance(data, collections.abc.MappingView)
else data)
Проблема в том, что аргумент bottom
является kwarg, и поэтому не передается sanitize_sequence
и никогда не преобразуется в список. В то время как в обычном bar
, x
преобразуется в список на sanitize_sequence
Так что проблема в том, как barh
реализован под капотом.