пустое место в верхней части сюжета matplotlib django - PullRequest
2 голосов
/ 24 августа 2010

У меня вопрос по поводу баров matplotlib. Я уже сделал несколько гистограмм, но я не знаю почему, на этом оставлено огромное пустое пространство сверху.

код похож на другие графики, которые я сделал, и у них нет этой проблемы.

Если у кого-то есть идеи, я ценю помощь.

x = matplotlib.numpy.arange(0, max(total))
ind = matplotlib.numpy.arange(len(age_list))

ax.barh(ind, total)

ax.set_yticks(ind) 
ax.set_yticklabels(age_list)

1 Ответ

6 голосов
/ 25 августа 2010

Под "пустым пространством сверху" вы подразумеваете, что 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()

Auto-rounded y-axis limits

Если бы я хотел, чтобы ограничения были более жесткими, я мог бы позвонить plt.axis('tight') после вызова на plt.barh, что даст:

Tight axis limits

Однако вы можете не захотеть, чтобы все было слишком тесно, поэтому вы можете использовать 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()

Что дает немного более приятный сюжет:

Nicely padded margins

Надеюсь, это указывает на правильное направление, во всяком случае!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...