Установить пределы автомасштабирования на графике, чтобы вокруг всех точек был буфер

Я хотел бы построить набор точек с помощью pyplot в matplotlib, но чтобы ни одна из точек не находилась на краю моих осей. Автомасштабирование (или что-то еще) устанавливает xlim и ylim так, что часто первая и последняя точки лежат на x = xmin или xmax что затрудняет чтение в некоторых ситуациях.

Это чаще проблематично с графиками loglog () или semilog () , потому что автоматическое масштабирование хотело бы xmin и xmax , чтобы быть точными степенями десяти, но если мои данные содержат только три точки, например, в xdata = [10 ** 2,10 ** 3,10 ** 4] тогда первая и последняя точки будут лежать на границе участка.

Попытка обходного пути

Это мое решение - добавить 10% буфер по обе стороны от графика. Но есть ли способ сделать это более элегантно или автоматически?

from numpy import array, log10
from matplotlib.pyplot import *

xdata = array([10**2,10**3,10**4])
ydata = xdata**2

figure()
loglog(xdata,ydata,'.')
xmin,xmax = xlim()
xbuff = 0.1*log10(xmax/xmin)
xlim(xmin*10**(-xbuff),xmax*10**(xbuff))

Я надеюсь на одно- или двухстрочное решение, которое я смогу легко использовать всякий раз, когда я создаю такой график.

Linear Plot

To поясните, что я делаю в своем обходном пути, я должен добавить пример в линейном пространстве (вместо пространства журнала):

plot(xdata,ydata)
xmin,xmax = xlim()
xbuff = 0.1*(xmax-xmin)
xlim(xmin-xbuff,xmax+xbuff))

, который идентичен предыдущему примеру, но для линейной оси.

Слишком большие пределы

] Связанная проблема заключается в том, что иногда ограничения слишком велики. Скажем, мои данные выглядят примерно так ydata = xdata ** 0,25 , так что дисперсия в диапазоне намного меньше десятилетия, но заканчивается точно на 10 ** 1 . Потом, автомасштабирование илим составляет от 10 ** 0 до 10 ** 1 , хотя данные находятся только в верхней части графика. Используя описанный выше обходной путь, я могу увеличить ymax так, чтобы третья точка полностью находилась в пределах, но я не знаю, как увеличить ymin , чтобы было меньше пробелов. в нижней части моего участка. то есть, дело в том, что я не всегда хочу раздвигать свои пределы, а просто хотел бы иметь некоторый постоянный (или пропорциональный) буфер вокруг всех моих точек.

10
задан askewchan 24 May 2011 в 18:03
поделиться