Hi

Thank you for trying to help me, though I can’t see how aspect is going

to help me. As I understand of the documentation, it would require me to know the

relationship between x and y, which I don’t.

I can calculate it, but since it varies between each change in xlimits

and different plot, it would be the same as calculating the ylimits.

As for pyplot.xlim(xmin,xmax) (suggested by Ethan Swint), it does the same as ax.set_xlim() for me.

Below is a sample code that will illustrate the problem.

Regards

Pål

####### Start code ############

#!/usr/bin/env python

import matplotlib

matplotlib.use(‘Qt4Agg’) # generate postscript output by default

import matplotlib.pyplot as plt

import numpy as np

# Creating a function to plot

x = np.linspace(-10, 10, 200)

p = np.poly1d([2, 3, 1, 4])

y = p(x) * np.sin(x)

# plotting the full figure

fig = plt.figure()

ax = fig.add_subplot(111)

ax.plot(x, y)

ax.autoscale(tight=True)

plt.title(‘Full graph. (Press key for next plot)’)

plt.draw()

plt.waitforbuttonpress()

# This is how I’m currently doing it

# x limits

xmin = 2

xmax = 6

# Calculating y limits

ymin = y[np.logical_and(xmin < x, x < xmax)].min()

ymax = y[np.logical_and(xmin < x, x < xmax)].max()

# Inserting some room

room = np.maximum(np.abs(ymin * 0.05), np.abs(ymax * 0.05))

ymin = ymin + room * np.sign(ymin)

ymax = ymax + room * np.sign(ymax)

# Setting the limits

ax.set_xlim([xmin, xmax])

ax.set_ylim([ymin, ymax])

plt.title(‘What I want (Press key for next plot)’)

plt.draw()

plt.waitforbuttonpress()

# This is what pyplot does by default if I only set the limits

ax.autoscale(tight=True)

ax.set_xlim([2, 6])

plt.title(‘What I get if I only use set_xlim (Press key for exit)’)

plt.draw()

plt.waitforbuttonpress()

plt.close()

####### End code ############

## ···

On 3 February 2012 15:21, Benjamin Root <ben.root@…1304…> wrote:

On Friday, February 3, 2012, Pål Gunnar Ellingsen <paalge@…287…> wrote:

Hi

I’ve got a plot, containing a graph.

I would like to look at certain parts of it.

To do this I zoom in on the x-axis using set_xlim()

Then I would like to call autoscale(axis=‘y’) and have matplotlib

autoscale the y axis within the current x-axis.

I’ve tried several ways of doing this, both with autoscale and set_ylim(auto=True)

but non of them have been able to do this, as they only autoscale y on the full graph.

In the end I ended up writing my own code for calculating the new ymin and ymax ans using set_ylim([ymin, ymax]),

but I feel that this should not be necessary.

While googling for the a solution I found an earlier e-mail on the matplotlib list,

http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg19664.html

which describes the same problem, but was never answered.

Is there any other solution for this that I’ve missed?

Regards

Pål

Actually, the autoscaling is working as it should in your case. By default, automatic limits will encompass all data plotted.

The missing piece of your puzzle is specifying an aspect constraint. ax.set_aspect() will allow for some sort of relationship between the x and y axes to exist. For example, setting it to ‘equal’ means that limits are chosen such that a distance on the x axis is displayed the same way as the same distance in the y-axis. There are some other preset values and I think you can specify a float as well.

This is what I can remember of the top of my head. I hope this helps!

Ben Root