matplotlib «авторазмер осей» не показывает все точки данных - PullRequest
2 голосов
/ 15 мая 2011

Я недавно перешел с версии matplotlib '0.99.1.1' на '1.0.1'.Новый сбой, с которым я сталкиваюсь, связан с «автоматическим измерением осей» ... не все точки данных в конечном итоге отображаются. Вот код, который воспроизводит мою проблему, дальнейшее обсуждение приведено ниже.

import datetime
from pylab import *
print matplotlib.__version__
x = [datetime.date(2011,2,11),
     datetime.date(2011,3,11),
     datetime.date(2011,4,11),
     datetime.date(2011,5,11),
     datetime.date(2011,6,11),
     datetime.date(2011,7,11)]
y = [23,41,67,72,18,19]
fig = figure()
ax = fig.add_subplot(111)
ax.plot_date(x, y, 'kx')

# next task is to broaden the xaxis so that it begins 
# and ends at the start of a month (approximately).  
xmin, xmax, ymin, ymax = ax.axis() ; print xmin, xmax, ymin, ymax
a1 = xmin - min(x).day + 1
a2 = xmax - max(x).day + 31

#a1 = datetime.date(1,1,1) + datetime.timedelta(a1)
#a2 = datetime.date(1,1,1) + datetime.timedelta(a2)

#ax.axis([a1,a2,ymin,ymax]) #

ax.plot_date(a1, ymin, 'ko')
ax.plot_date(a2, ymin, 'ko')

show()

при 0.99.1 вышеприведенный код работал как обходной путь для (по-видимому) невозможности сброса xaxis с помощью оператора ax.axis (v). Теперь, под 1.0.1, две точки 'ko' заканчиваютсяНаходясь вне осей, независимо от того, вызывается ли ax.plot_date с использованием a1 и a2 в единицах «days» или «datetime.date».

возможно, что две точки «ko» не отображаются.но чтобы заметить, что они на самом деле отображаются, раскомментируйте вызов ax.axis (v) (который отлично работает в 1.0.1), а затем найдите два четверти круга в нижних углах области осей.

Хотя верно, что более чистый способ расширения xaxis - это использование оператора ax.axis (v), вышеупомянутое поведение заставляет меня нервничать по поводу «определения размеров автоматических осей» ... хотя более вероятно, что я инкПравильно кодируя что-то или другое.

РЕДАКТИРОВАТЬ: fwiw ... следующий код позволяет расширить до 1-го числа месяцев, точно

xmin, xmax, ymin, ymax = ax.axis() #; print xmin, xmax, ymin, ymax
a1 = datetime.date.fromordinal(int(xmin)) #; print 'a1= ', a1
a2 = datetime.date.fromordinal(int(xmax)) #; print 'a2= ', a2

y1, m1 = a1.year, a1.month 
y2, m2 = a2.year, a2.month + 1

a1 = datetime.date(y1,m1,1) #; print 'a1= ', a1
a2 = datetime.date(y2,m2,1) #; print 'a2= ', a2

ax.axis([a1,a2,ymin,ymax])

1 Ответ

2 голосов
/ 15 мая 2011

Что происходит, так это то, что ось не установлена ​​на «автоматическое измерение» после вызова ax.axis().Вызов axis отключает автоматическое масштабирование (предполагается, что если вы вручную получаете пределы осей, вы, вероятно, не хотите, чтобы они менялись).

Просто добавьте ax.axis('auto') или ax.set_autoscale_on() после того, как вы все подготовите.

import datetime
import matplotlib.pyplot as plt
x = [datetime.date(2011,2,11),
     datetime.date(2011,3,11),
     datetime.date(2011,4,11),
     datetime.date(2011,5,11),
     datetime.date(2011,6,11),
     datetime.date(2011,7,11)]
y = [23,41,67,72,18,19]
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot_date(x, y, 'kx')

# next task is to broaden the xaxis so that it begins 
# and ends at the start of a month (approximately).  
xmin, xmax, ymin, ymax = ax.axis() ; print xmin, xmax, ymin, ymax
a1 = xmin - min(x).day + 1
a2 = xmax - max(x).day + 31

ax.plot_date(a1, ymin, 'ko')
ax.plot_date(a2, ymin, 'ko')
ax.axis('auto')

plt.show()
...