From: Jody K. <jk...@uv...> - 2015-04-08 21:15:12
|
Hi Eric, >> import matplotlib.pyplot as plt >> fig, axes = plt.subplots(nrows=2,sharex=True) >> axes[0].set_aspect(1.) >> axes[0].plot(np.arange(10),np.arange(10)) >> axes[0].set_ylim([0,24]) >> axes[0].set_xlim([0,12]) >> axes[1].plot(np.arange(10),np.arange(10)*2.) >> plt.show() >> >> does not work as I'd expect. axes[0]'s ylim gets changed so that the line is no longer viewable (= 10-14). In my opinion, the two calls should work the same, except in the second case, axes[1]'s xlim should be 0-12. >> > > If you leave out the set_ylim call, it works. Given that you have specified set_ylim[0, 24], how is mpl supposed to know what ylim range you really want, when the axis constraint means it can only plot a small part of the specified range? It doesn't for me: import matplotlib.pyplot as plt fig, axes = plt.subplots(nrows=2,sharex=True) axes[0].set_aspect(1.) axes[0].plot(np.arange(10),np.arange(10)) axes[1].plot(np.arange(10),np.arange(10)*2.) plt.show() still curtails the y limit in axes[0], in my case from ~2.9 to ~6.1 (see attached). > Basically, you have set up conflicting constraints, and mpl failed to resolve the conflict the way you think it should have. Maybe that could be improved, but I warn you, it's a tricky business. Squeeze in one place and things pop out somewhere else. I'm not clear what the conflicting constraints are. There seems to be an unspoken one that sharex=True means the physical size of the axes must be the same. That constraint doesn't exist if sharex=False, and set_aspect() works as expected. I'm questioning the unspoken constraint, and questioning why set_aspect() (or looking at the code apply_aspect()) needs to know about shared axes at all. No doubt there is a use case I'm missing... I *can* see the issue if we think setting aspect ratios should *not* change the size of the axes, because changing the aspect ratio changes the data limits and then you have a problem checking all the shared axes to see which one has the largest data limits. Its particularly problematic because I think that apply_aspect() is only called at draw()-time. That seems a hard problem, but I'm not sure what the use case is for it, so I have trouble wrapping my head around it. Thanks, Jody -- Jody Klymak http://web.uvic.ca/~jklymak/ |