From: Ryan N. <rne...@gm...> - 2015-02-14 19:01:53
|
Tommy, I'm sorry. I forgot to hit send all *again*. Below is my original message, but the function I wrote is updated because it wasn't exactly correct.... Ah. I was working on something to help out, so I'm just seeing Eric's very elegant solution, which I have yet to try. However, I feel like you might run into some problems if you always drop the first tick. For example, try this plot: ______________ import matplotlib.pyplot as plt from matplotlib.ticker import MultipleLocator import numpy as np xs = np.linspace(2,12,1000) ys = np.sin(xs) n = 5 fig = plt.figure() ax1 = fig.add_subplot(111) ax1.plot(xs, ys) ax1.xaxis.set_major_locator(MultipleLocator(5)) plt.show() _____________ In this case, dropping the first tick will result in only one tick on the screen. What is your use-case? Are you annoyed that the axis labels are overlapping at the far left? If that's the case, here's a little function (trimticks) that I whipped up that might help. It drops the far left or far right label if it is exactly at the edge of the axes. Should work for y axes as well. _____________ def trimticks(ax, n=5): xmin, xmax = ax.get_xlim() if xmin%n == 0: xmin = xmin+n else: xmin = xmin + n - xmin%n if not xmax%n == 0: xmax = xmax + n - xmax%n ticks = np.arange(xmin, xmax, n) ax.set_xticks(ticks) import matplotlib.pyplot as plt from matplotlib.ticker import MultipleLocator import numpy as np xs = np.linspace(0,20,10000) ys = np.sin(xs) fig = plt.figure() ax1 = fig.add_subplot(111) ax1.plot(xs, ys) trimticks(ax1) plt.show() ___________________ On Sat, Feb 14, 2015 at 1:45 PM, Tommy Carstensen < tom...@gm...> wrote: > Erik, that doesn't seem to work either. I tried this: > > import matplotlib.pyplot as plt > from matplotlib.ticker import MultipleLocator > class TrimmedMultipleLocator(MultipleLocator): > def tick_values(self, vmin, vmax): > return MultipleLocator.tick_values(self, vmin, vmax)[2:] > fig = plt.figure() > ax1 = fig.add_subplot(111) > ax1.xaxis.set_major_locator(TrimmedMultipleLocator(5)) > #xticks[0].label1.set_visible(False) > #xticks[-1].label1.set_visible(False) > #ax1.set_xticks(ax1.xaxis.get_major_ticks()[1:-1]) > ax1.plot(list(range(21))) > plt.show() > > Here is an example of the use of prune='lower', but it does not allow > one to set the tick step size: > > http://stackoverflow.com/questions/9422587/overlapping-y-axis-tick-label-and-x-axis-tick-label-in-matplotlib > > I think my best bet is to just set those ticks manually. > > On Sat, Feb 14, 2015 at 6:19 PM, Eric Firing <ef...@ha...> wrote: > > On 2015/02/14 7:33 AM, Tommy Carstensen wrote: > >> Thanks again Ryan. That's exactly what I want to achieve; i.e. remove > >> the tick at 0 and only keep 5 and 10. Your solution works, but it's a > >> bit of hack to use magic constants. I could however get those values > >> from the xlim. > >> > >> Eric, I would describe the desired tick placement algorithm as > >> removing the first tick on the axis. It can be achieved like this: > >> ax1.xaxis.set_major_locator(MaxNLocator(prune='lower')) > > > > Aha! The problem is that the MaxNLocator is the only one with the prune > > kwarg. It could be added to the MultipleLocator. For now, though, you > > can make your own specialized Locator, hardwired to omit the first tick, > > like this: > > > > from matplotlib.ticker import MultipleLocator > > > > class TrimmedMultipleLocator(MultipleLocator): > > def tick_values(self, vmin, vmax): > > return MultipleLocator.tick_values(self, vmin, vmax)[1:] > > > > then just use > > > > ax1.xaxis.set_major_locator(TrimmedMultipleLocator(5)) > > > > I haven't tested it--but give it a try. What it is doing is making a > > subclass of MultipleLocator, and altering only the one little bit of its > > behavior that you want to modify. Everything else is automatically > > inherited from the base class, MultipleLocator. > > > > Eric > > > > > >> > >> But that then overrides this: > >> ax1.xaxis.set_major_locator(MultipleLocator(5)) > >> > >> On Sat, Feb 14, 2015 at 5:27 PM, Ryan Nelson <rne...@gm...> > wrote: > >>> Tommy, (Sorry for the doubleup. I just realized I forgot to hit > reply-all.) > >>> > >>> Do you want to remove the tick at 0 and only have 5,10, etc.? Could > you just > >>> do something like this instead: > >>> > >>> import matplotlib.pyplot as plt > >>> from matplotlib.ticker import MultipleLocator > >>> fig = plt.figure() > >>> ax1 = fig.add_subplot(111) > >>> ax1.set_xticks(range(5,11,5)) > >>> ax1.plot(range(11)) > >>> plt.show() > >>> > >>> Ryan > >>> > >>> > >>> On Sat, Feb 14, 2015 at 10:47 AM, Tommy Carstensen > >>> <tom...@gm...> wrote: > >>>> > >>>> Thanks for you answer Eric. I had to get some sleep before trying out > >>>> things. I currently have the code below, but it does not remove the > >>>> zero value tick. It removes the tick at 5 and 10 however. > >>>> > >>>> import matplotlib.pyplot as plt > >>>> from matplotlib.ticker import MultipleLocator > >>>> fig = plt.figure() > >>>> ax1 = fig.add_subplot(111) > >>>> ax1.xaxis.set_major_locator(MultipleLocator(5)) > >>>> xticks = ax1.xaxis.get_major_ticks() > >>>> #xticks[0].label1.set_visible(False) > >>>> #xticks[-1].label1.set_visible(False) > >>>> ax1.set_xticks(ax1.get_xticks()[1:-1]) > >>>> ax1.plot(list(range(11))) > >>>> plt.show() > >>>> > >>>> On Sat, Feb 14, 2015 at 2:01 AM, Eric Firing <ef...@ha...> > wrote: > >>>>> On 2015/02/13 3:29 PM, Tommy Carstensen wrote: > >>>>>> Is it possible to combine MultipleLocator and MaxNLocator? One seems > >>>>>> to erase the effect of the other. > >>>>> > >>>>> They are for different situations. MultipleLocator is for when you > know > >>>>> what you want your tick interval to be; MaxNLocator is for when you > >>>>> don't know that, but you do know roughly how many ticks you want, and > >>>>> what sort of numerical intervals are acceptable. > >>>>> > >>>>> Eric > >>>>> > >>>>> > >>>>> > >>>>> > ------------------------------------------------------------------------------ > >>>>> Dive into the World of Parallel Programming. The Go Parallel Website, > >>>>> sponsored by Intel and developed in partnership with Slashdot Media, > is > >>>>> your > >>>>> hub for all things parallel software development, from weekly thought > >>>>> leadership blogs to news, videos, case studies, tutorials and more. > Take > >>>>> a > >>>>> look and join the conversation now. > http://goparallel.sourceforge.net/ > >>>>> _______________________________________________ > >>>>> Matplotlib-users mailing list > >>>>> Mat...@li... > >>>>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users > >>>> > >>>> > >>>> > ------------------------------------------------------------------------------ > >>>> Dive into the World of Parallel Programming. The Go Parallel Website, > >>>> sponsored by Intel and developed in partnership with Slashdot Media, > is > >>>> your > >>>> hub for all things parallel software development, from weekly thought > >>>> leadership blogs to news, videos, case studies, tutorials and more. > Take a > >>>> look and join the conversation now. > http://goparallel.sourceforge.net/ > >>>> _______________________________________________ > >>>> Matplotlib-users mailing list > >>>> Mat...@li... > >>>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users > >>> > >>> > >> > >> > ------------------------------------------------------------------------------ > >> Dive into the World of Parallel Programming. The Go Parallel Website, > >> sponsored by Intel and developed in partnership with Slashdot Media, is > your > >> hub for all things parallel software development, from weekly thought > >> leadership blogs to news, videos, case studies, tutorials and more. > Take a > >> look and join the conversation now. http://goparallel.sourceforge.net/ > >> _______________________________________________ > >> Matplotlib-users mailing list > >> Mat...@li... > >> https://lists.sourceforge.net/lists/listinfo/matplotlib-users > >> > > > > > > > ------------------------------------------------------------------------------ > > Dive into the World of Parallel Programming. The Go Parallel Website, > > sponsored by Intel and developed in partnership with Slashdot Media, is > your > > hub for all things parallel software development, from weekly thought > > leadership blogs to news, videos, case studies, tutorials and more. Take > a > > look and join the conversation now. http://goparallel.sourceforge.net/ > > _______________________________________________ > > Matplotlib-users mailing list > > Mat...@li... > > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > > > ------------------------------------------------------------------------------ > Dive into the World of Parallel Programming. The Go Parallel Website, > sponsored by Intel and developed in partnership with Slashdot Media, is > your > hub for all things parallel software development, from weekly thought > leadership blogs to news, videos, case studies, tutorials and more. Take a > look and join the conversation now. http://goparallel.sourceforge.net/ > _______________________________________________ > Matplotlib-users mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > |