2016-09-27 1 views
3

Я использую ax.axes('equal'), чтобы сделать расстояние оси равным по X и Y, а также установить xlim и ylim. Это сдерживает проблему, и фактические лимиты не то, что я установил в ax.set_xlim() или ax.set_ylim(). Использование ax.get_xlim() просто возвращает то, что я предоставил. Как я могу получить реальные видимые пределы сюжета?Как я могу получить фактические пределы оси при использовании ax.axis ('equal')?

f,ax=plt.subplots(1) #open a figure 
ax.axis('equal') #make the axes have equal spacing 
ax.plot([0,20],[0,20]) #test data set 

#change the plot axis limits 
ax.set_xlim([2,18]) 
ax.set_ylim([5,15]) 

#read the plot axis limits 
xlim2=array(ax.get_xlim()) 
ylim2=array(ax.get_ylim()) 

#define indices for drawing a rectangle with xlim2, ylim2 
sqx=array([0,1,1,0,0]) 
sqy=array([0,0,1,1,0]) 

#plot a thick rectangle marking the xlim2, ylim2 
ax.plot(xlim2[sqx],ylim2[sqy],lw=3) #this does not go all the way around the edge 

Какие команды позволят мне нарисовать зеленую рамку вокруг фактических краев фигуры?

Plot showing that the results of get_xlim() and get_ylim() do not match the visible bounds of the figure

Похожие: Force xlim, ylim, and axes('equal') at the same time by letting margins auto-adjust

+0

Я могу получить уведомление об изменении 'ylim'' ax.callbacks.connect ('ylim_changed', ylim_ch) ', но он все равно возвращает значение, указанное' set_ylim', а не то, что показано. См. Http://stackoverflow.com/questions/31490436/matplotlib-finding-out-xlim-and-ylim-after-zoom –

ответ

2

Фактические пределы не известны, пока фигура не рисуется. Добавив рисование холста после установки xlim и ylim, но перед получением xlim и ylim можно получить желаемые пределы.

f,ax=plt.subplots(1) #open a figure 
ax.axis('equal') #make the axes have equal spacing 
ax.plot([0,20],[0,20]) #test data set 

#change the plot axis limits 
ax.set_xlim([2,18]) 
ax.set_ylim([5,15]) 

#Drawing is crucial 
f.canvas.draw() #<---------- I added this line 

#read the plot axis limits 
xlim2=array(ax.get_xlim()) 
ylim2=array(ax.get_ylim()) 

#define indices for drawing a rectangle with xlim2, ylim2 
sqx=array([0,1,1,0,0]) 
sqy=array([0,0,1,1,0]) 

#plot a thick rectangle marking the xlim2, ylim2 
ax.plot(xlim2[sqx],ylim2[sqy],lw=3) 

Figure produced by script

+0

Означает ли это, что при завершении сценария происходит автоматическое f.canvas.draw()? –

+1

Это означает, что существует цикл GUI, ожидающий время простоя, чтобы вызвать метод 'draw', где бездействие происходит после завершения сценария ... – esmit

1

не умаляет принятый ответ, который не решит проблему получения обновленных пределы оси, но это, возможно, является пример проблемы XY? Если то, что вы хотите сделать, это нарисовать коробку вокруг осей, тогда вы фактически не должны нуждаетесь вxlim и ylim в координатах данных. Вместо этого вам просто нужно использовать ax.transAxes преобразование, которое вызывает как x и y данные должны быть интерпретированы в нормированных координатах вместо координат данных в центре:

ax.plot([0,0,1,1,0],[0,1,1,0,0], lw=3, transform=ax.transAxes) 

Самое замечательное в том, что ваша линия будет оставаться вокруг краями осей , даже если xlim и ylim впоследствии изменить.

Вы также можете использовать transform=ax.xaxis.get_transform() или transform=ax.yaxis.get_transform() если вы хотите только x или только y быть определены в нормированных координатах, с другой в координатах данных.

+0

Моя проблема была более общей, чем просто рисование окна, поэтому мне нравится принятая ответ (комментарии, в которых также разъяснялось недоразумение, которое я имел о том, как был показан сюжет), но это здорово знать. Благодарю. –

Смежные вопросы