Под "пустым пространством сверху" вы подразумеваете, что y-пределы установлены слишком большими?
По умолчанию matplotlib выберет пределы оси x и y, чтобы они были округлены до ближайшего «четного» числа (например, 1, 2, 12, 5, 50, -0,5 и т. Д.).
Если вы хотите, чтобы границы осей были установлены так, чтобы они были «плотными» вокруг графика (т. Е. Минимум и максимум данных), используйте ax.axis('tight')
(или эквивалентно, plt.axis('tight')
, который будет использовать текущую ось ).
Еще один очень полезный метод - plt.margins(...)
/ ax.margins()
. Он будет действовать аналогично axis('tight')
, но оставит немного отступов за пределы.
Как пример вашей проблемы:
import numpy as np
import matplotlib.pyplot as plt
# Make some data...
age_list = range(10,31)
total = np.random.random(len(age_list))
ind = np.arange(len(age_list))
plt.barh(ind, total)
# Set the y-ticks centered on each bar
# The default height (thickness) of each bar is 0.8
# Therefore, adding 0.4 to the tick positions will
# center the ticks on the bars...
plt.yticks(ind + 0.4, age_list)
plt.show()
Если бы я хотел, чтобы ограничения были более жесткими, я мог бы позвонить plt.axis('tight')
после вызова на plt.barh
, что даст:
Однако вы можете не захотеть, чтобы все было слишком тесно, поэтому вы можете использовать plt.margins(0.02)
, чтобы добавить 2% заполнения во всех направлениях. Затем вы можете установить для левого предела значение 0 с помощью plt.xlim(xmin=0)
:
import numpy as np
import matplotlib.pyplot as plt
# Make some data...
age_list = range(10,31)
total = np.random.random(len(age_list))
ind = np.arange(len(age_list))
height = 0.8
plt.barh(ind, total, height=height)
plt.yticks(ind + height / 2.0, age_list)
plt.margins(0.05)
plt.xlim(xmin=0)
plt.show()
Что дает немного более приятный сюжет:
Надеюсь, это указывает на правильное направление, во всяком случае!