2012-04-10 3 views
3

일부 데이터의 부분 집합을 플롯하려하지만 x 축 제한을 설정 한 후에 y 축 제한이 제대로 업데이트되지 않습니다. matplotlib에 x 축 제한을 설정 한 후 y 축 한계를 업데이트하는 방법이 있습니까?X 축 한계를 설정 한 후 Matplotlib y 축 한계가 업데이트되지 않습니까?

import numpy 
import pylab 
pylab.plot(numpy.arange(100)**2.0) 

제공 : 잘 작동 Plot 1 full range

예를 들어, 다음과 같은 플롯을 고려하십시오. 그러나 I에서만 X = 10, X = 0의 일부를 표시 할 경우, Y 스케일링 엉망 :

pylab.plot(numpy.arange(100)**2.0) 
pylab.xlim(0,10) 

준다 : Plot 1 subset.

전자의 경우 x 축과 y 축의 크기가 적절하게 조정됩니다. 후자의 경우 Y 축은 데이터가 플롯되지 않아도 여전히 동일하게 조정됩니다. matplotlib에 y 축 스케일링을 업데이트하라고 알리는 방법은 무엇입니까?

확실한 해결 방법은 데이터 자체의 하위 집합을 플롯하거나 데이터를 검사하여 수동으로 Y 축 제한을 재설정하는 것입니다. 그러나이 두 가지 방법은 모두 성가신 일입니다.

업데이트 : 위의 예는 간략화

, 더 일반적인 경우에 하나 가지고 Y 축 설정

pylab.plot(xdata, ydata1) 
pylab.plot(xdata, ydata2) 
pylab.plot(xdata, ydata3) 
pylab.xlim(xmin, xmax) 

수동 범위는 물론 가능하다

subidx = N.argwhere((xdata >= xmin) & (xdata <= xmax)) 
ymin = N.min(ydata1[subidx], ydata2[subidx], ydata3[subidx]) 
ymax = N.max(ydata1[subidx], ydata2[subidx], ydata3[subidx]) 
pylab.xlim(xmin, xmax) 

하지만이 말은 가장 귀찮습니다 (imho). 플로트를 수동으로 계산하지 않고도이를 수행하는 더 빠른 방법이 있습니까? 감사!

업데이트 2 : 기능 autoscale 어떤 스케일링을 수행하고이 작업에 적합한 후보를 보이지만 독립적으로 축과 전체 데이터 범위 저울, 상관없이 축 한계를 취급

아르.

답변

1

어떤 의미에서 데이터 검사가 번거롭습니까? 코드 작성의 측면에서 보면 그렇게 나쁘지 않습니다. datanumpy.arange(100)[0:11] 수 있습니다

pylab.ylim(numpy.min(data), numpy.max(data)) 

... 같은 것을보십시오. 당신이 (하지만이 정렬 랬) xdataydata이있는 경우 일반적인 경우

, 당신은 할 것이다 너무 뭔가 당신이 힘든 것은 '그럼 내가 돈, 계산의 의미 경우

from bisect import bisect 
sub_ydata = ydata[bisect(xdata, xmin):bisect(xdata, xmax)] 
pylab.ylim(numpy.min(sub_ydata), numpy.max(sub_ydata)) 

같은 그런 계산을하지 않고도 matplotlib을 수행 할 수 있습니다.

+0

계산적으로 어려운 것은 아닙니다. matplotlib이 어떻게 축 자체를 업데이트 할 수 있는지 궁금합니다.분명히 matplotlib는 데이터의 전체 범위를 플롯하면 축 범위를 올바르게 가져 오지만, 축 범위 중 하나 인 imho를 업데이트 할 때 논리적으로 작용하지 않습니다. 또한 일반적으로 xdata 및 ydata가있는 경우 수동으로 설정하는 것이 더 번거로워집니다. – Tim

+0

수동으로 한도를 조정하면 자동 배율이 중지된다는 논리가 있습니다. 말된다; 어떤 이유로 든 matplotlib을 자동으로 조정하지 않고 ** 그렇게한다면 얼마나 성가신 일인지 생각해보십시오. 일반적인 경우는 그리 심각하지 않습니다. 제가 의미하는 바를 간략하게 설명해 드리겠습니다. –

+0

자동 크기 조정이 수동 크기 조정을 방해 할 수 있다는 것에 동의하지만이 경우에는 적용되지 않습니다. 특히 플롯하기 전에 xrange를 설정하면 matplotlib이 그에 맞게 yrange를 변경해야합니다. Gnuplot은이를 수행합니다. 어쨌든 내 질문에 대한 대답은 '아니오'라고 가정합니다. 감사합니다 :) – Tim